Changeset 26152


Ignore:
Timestamp:
03/26/21 10:48:14 (4 years ago)
Author:
Eric.Larour
Message:

CHG: SealevelMasks is not working on nel, but rather on local number of elements!
sealevelchange_core and Tria.cpp: need a routine to shift only on ocean for
mass conservation.

Location:
issm/trunk-jpl/src/c
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk-jpl/src/c/classes/Elements/Element.h

    r26149 r26152  
    398398                virtual void       SealevelchangeDeformationConvolution(IssmDouble* sealevelloads, IssmDouble* loads, IssmDouble* rotationvector,  SealevelMasks* masks)=0;
    399399                virtual void       OceanAverageOptim(IssmDouble* poceanaverage, IssmDouble* poceanarea, IssmDouble* Sg, SealevelMasks* masks)=0;
     400                virtual void       SealevelchangeShift(Vector<IssmDouble>* loads, IssmDouble offset, SealevelMasks* masks)=0;
    400401                #endif
    401402
  • issm/trunk-jpl/src/c/classes/Elements/Penta.h

    r26149 r26152  
    235235                void       SealevelchangeDeformationConvolution(IssmDouble* sealevelloads, IssmDouble* loads, IssmDouble* rotationvector, SealevelMasks* masks){_error_("not implemented yet");};
    236236                void       OceanAverageOptim(IssmDouble* poceanaverage, IssmDouble* poceanarea, IssmDouble* Sg, SealevelMasks* masks){_error_("not implemented yet");};
     237                void       SealevelchangeShift(Vector<IssmDouble>* loads, IssmDouble offset, SealevelMasks* masks){_error_("not implemented yet");};
    237238                #endif
    238239
  • issm/trunk-jpl/src/c/classes/Elements/Seg.h

    r26149 r26152  
    190190                void       SealevelchangeDeformationConvolution(IssmDouble* sealevelloads, IssmDouble* loads, IssmDouble* rotationvector, SealevelMasks* masks){_error_("not implemented yet");};
    191191                void       OceanAverageOptim(IssmDouble* poceanaverage, IssmDouble* poceanarea, IssmDouble* Sg, SealevelMasks* masks){_error_("not implemented yet");};
     192                void       SealevelchangeShift(Vector<IssmDouble>* loads, IssmDouble offset, SealevelMasks* masks){_error_("not implemented yet");};
    192193
    193194#endif
  • issm/trunk-jpl/src/c/classes/Elements/Tetra.h

    r26149 r26152  
    196196                void       SealevelchangeDeformationConvolution(IssmDouble* sealevelloads, IssmDouble* loads, IssmDouble* rotationvector, SealevelMasks* masks){_error_("not implemented yet");};
    197197                void       OceanAverageOptim(IssmDouble* poceanaverage, IssmDouble* poceanarea, IssmDouble* Sg, SealevelMasks* masks){_error_("not implemented yet");};
     198                void       SealevelchangeShift(Vector<IssmDouble>* loads, IssmDouble offset, SealevelMasks* masks){_error_("not implemented yet");};
    198199
    199200#endif
  • issm/trunk-jpl/src/c/classes/Elements/Tria.cpp

    r26149 r26152  
    69656965        return;
    69666966}/*}}}*/
     6967void       Tria::SealevelchangeShift(Vector<IssmDouble>* loads, IssmDouble offset, SealevelMasks* masks){ /*{{{*/
     6968       
     6969        if(masks->isoceanin[this->lid]){
     6970                loads->SetValue(this->sid,offset,ADD_VAL);
     6971        }
     6972
     6973} /*}}}*/
    69676974#endif
    69686975
  • issm/trunk-jpl/src/c/classes/Elements/Tria.h

    r26149 r26152  
    180180                void       SealevelchangeDeformationConvolution(IssmDouble* sealevelloads, IssmDouble* loads, IssmDouble* rotationvector, SealevelMasks* masks);
    181181                void       OceanAverageOptim(IssmDouble* poceanaverage, IssmDouble* poceanarea, IssmDouble* Sg, SealevelMasks* masks);
     182                void       SealevelchangeShift(Vector<IssmDouble>* loads, IssmDouble offset, SealevelMasks* masks);
    182183                #endif
    183184                /*}}}*/
  • issm/trunk-jpl/src/c/classes/SealevelMasks.h

    r24938 r26152  
    1818               
    1919                /*SealevelMasks constructors, destructors :*/
    20                 SealevelMasks(int nel){
     20                SealevelMasks(int localnel){
    2121                        /*allocate fields:*/
    22                         this->isiceonly=xNew<bool>(nel);
    23                         this->isfullyfloating=xNew<bool>(nel);
    24                         this->notfullygrounded=xNew<bool>(nel);
    25                         this->isoceanin=xNew<bool>(nel);
     22                        this->isiceonly=xNew<bool>(localnel);
     23                        this->isfullyfloating=xNew<bool>(localnel);
     24                        this->notfullygrounded=xNew<bool>(localnel);
     25                        this->isoceanin=xNew<bool>(localnel);
    2626                };
    2727                ~SealevelMasks(){
  • issm/trunk-jpl/src/c/cores/sealevelchange_core.cpp

    r26151 r26152  
    1212#include "../modules/modules.h"
    1313#include "../solutionsequences/solutionsequences.h"
     14
    1415/*support routines local definitions:{{{*/
    1516void TransferForcing(FemModel* femmodel,int forcingenum);
     
    1920SealevelMasks* sealevel_masks(FemModel* femmodel);
    2021void RotationAxisMotion(IssmDouble* m, FemModel* femmodel,IssmDouble* loads, IssmDouble* sealeveloads);
     22void ConserveOceanMass(FemModel* femmodel,Vector<IssmDouble>* sealevelloads, IssmDouble offset, SealevelMasks* masks);
    2123/*}}}*/
    2224
     
    503505        if(scaleoceanarea) oceanarea=3.619e+14; // use true ocean area, m^2
    504506
    505         //substract ocean average and barystatic contributionfrom sea level loads:
    506         sealevelloads->Shift(barycontrib->Total()/oceanarea - SealevelloadsOceanAverage(sealevelloads,oceanareas,oceanarea));
    507        
     507        //conserve ocean mass:
     508        oceanaverage=SealevelloadsOceanAverage(sealevelloads,oceanareas,oceanarea);
     509        ConserveOceanMass(femmodel,sealevelloads,barycontrib->Total()/oceanarea - oceanaverage,masks);
     510
    508511        //broadcast sea level loads
    509512        allsealevelloads=sealevelloads->ToMPISerial();
     513
     514        femmodel->results->AddObject(new GenericExternalResult<IssmDouble*>(femmodel->results->Size()+1,DummyEnum,allsealevelloads,nel,1,1,1));
    510515
    511516        //compute rotation axis motion:
     
    523528                }
    524529                sealevelloads->Assemble();
    525        
    526                 //substract ocean average and barystatic contribution
     530                       
     531                //Conserve ocean mass:
    527532                oceanaverage=SealevelloadsOceanAverage(sealevelloads,oceanareas,oceanarea);
    528                 sealevelloads->Shift(barycontrib->Total()/oceanarea- oceanaverage);
    529                
     533                ConserveOceanMass(femmodel,sealevelloads,barycontrib->Total()/oceanarea - oceanaverage,masks);
     534
    530535                //broadcast sea level loads
    531536                allsealevelloads=sealevelloads->ToMPISerial();
     
    13181323        m[2]=m3;
    13191324} /*}}}*/
     1325void ConserveOceanMass(FemModel* femmodel,Vector<IssmDouble>* sealevelloads, IssmDouble offset, SealevelMasks* masks){ /*{{{*/
     1326
     1327        /*Shift sealevel loads by ocean average, only on ocean! :*/
     1328        for(Object* & object : femmodel->elements->objects){
     1329                Element* element = xDynamicCast<Element*>(object);
     1330                element->SealevelchangeShift(sealevelloads,offset,masks);
     1331        }
     1332        sealevelloads->Assemble();
     1333
     1334} /*}}}*/
Note: See TracChangeset for help on using the changeset viewer.