Changeset 22143


Ignore:
Timestamp:
10/05/17 16:48:16 (8 years ago)
Author:
Eric.Larour
Message:

CHG: better marching through time for slr solution

Location:
issm/branches/trunk-larour-NatGeoScience2016/src
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • issm/branches/trunk-larour-NatGeoScience2016/src/c/analyses/MasstransportAnalysis.cpp

    r21759 r22143  
    157157        iomodel->FetchDataToInput(elements,"md.initialization.vx",VxEnum);
    158158        iomodel->FetchDataToInput(elements,"md.initialization.vy",VyEnum);
     159       
     160        /*Initialize cumdeltalthickness input: unfortunately, we don't have femmodel, so we need to iterate on
     161         *elements, otherwise we would have used InputUpdateFromConstantx: */
     162        counter=0;
     163        for(int i=0;i<iomodel->numberofelements;i++){
     164                if(iomodel->my_elements[i]){
     165                        Element* element=(Element*)elements->GetObjectByOffset(counter);
     166                        element->InputUpdateFromConstant(0.0,SealevelriseCumDeltathicknessEnum);
     167                        counter++;
     168                }
     169        }
    159170
    160171        if(!issmb){
     
    650661        basalelement->GetDofList(&doflist,NoneApproximationEnum,GsetEnum);
    651662        IssmDouble* newthickness   = xNew<IssmDouble>(numnodes);
    652         IssmDouble* deltathickness = xNew<IssmDouble>(numnodes);
     663        IssmDouble* cumdeltathickness = xNew<IssmDouble>(numnodes);
     664        IssmDouble* deltathickness    = xNew<IssmDouble>(numnodes);
    653665        IssmDouble* newbase        = xNew<IssmDouble>(numnodes);
    654666        IssmDouble* newsurface     = xNew<IssmDouble>(numnodes);
     
    675687        basalelement->GetInputListOnNodes(&phi[0],MaskGroundediceLevelsetEnum);
    676688        basalelement->GetInputListOnNodes(&sealevel[0],SealevelEnum);
    677 
    678         /*What is the delta thickness forcing the sea-level rise core: */
    679         for(i=0;i<numnodes;i++) deltathickness[i]=newthickness[i]-oldthickness[i];
     689        basalelement->GetInputListOnNodes(&cumdeltathickness[0],SealevelriseCumDeltathicknessEnum);
     690
     691        /*What is the delta thickness forcing the sea-level rise core: cumulated over time, hence the +=:*/
     692        for(i=0;i<numnodes;i++){
     693                cumdeltathickness[i]+=newthickness[i]-oldthickness[i];
     694                deltathickness[i]=newthickness[i]-oldthickness[i];
     695        }
    680696
    681697        /*Find MasstransportHydrostaticAdjustment to figure out how to update the geometry:*/
     
    702718        }
    703719
     720
    704721        /*Add input to the element: */
    705722        element->AddBasalInput(ThicknessEnum,newthickness,P1Enum);
    706         element->AddBasalInput(SealevelriseDeltathicknessEnum,deltathickness,P1Enum);
    707723        element->AddBasalInput(SurfaceEnum,newsurface,P1Enum);
    708724        element->AddBasalInput(BaseEnum,newbase,P1Enum);
     725        element->AddBasalInput(SealevelriseCumDeltathicknessEnum,cumdeltathickness,P1Enum);
     726        element->AddBasalInput(SealevelriseDeltathicknessEnum,deltathickness,P1Enum);
    709727
    710728        /*Free ressources:*/
  • issm/branches/trunk-larour-NatGeoScience2016/src/c/analyses/SealevelriseAnalysis.cpp

    r22114 r22143  
    3939        iomodel->FetchDataToInput(elements,"md.slr.spcthickness",SealevelriseSpcthicknessEnum);
    4040        iomodel->FetchDataToInput(elements,"md.slr.sealevel",SealevelEnum,0);
    41        
     41
    4242        /*Initialize cumdeltalthickness input: unfortunately, we don't have femmodel, so we need to iterate on
    4343         *elements, otherwise we would have used InputUpdateFromConstantx: */
     
    8888        parameters->AddObject(iomodel->CopyConstantObject("md.slr.horiz",SealevelriseHorizEnum));
    8989        parameters->AddObject(iomodel->CopyConstantObject("md.slr.elastic",SealevelriseElasticEnum));
    90         parameters->AddObject(iomodel->CopyConstantObject("md.slr.run_frequency",SealevelriseRunFrequencyEnum));
    9190        parameters->AddObject(iomodel->CopyConstantObject("md.slr.rotation",SealevelriseRotationEnum));
    9291        parameters->AddObject(iomodel->CopyConstantObject("md.slr.tide_love_h",SealevelriseTidalLoveHEnum));
     
    9796        parameters->AddObject(iomodel->CopyConstantObject("md.slr.angular_velocity",SealevelriseAngularVelocityEnum));
    9897        parameters->AddObject(iomodel->CopyConstantObject("md.slr.ocean_area_scaling",SealevelriseOceanAreaScalingEnum));
    99         parameters->SetParam(1,SealevelriseRunCountEnum);
    10098
    10199        iomodel->FetchData(&elastic,"md.slr.elastic");
  • issm/branches/trunk-larour-NatGeoScience2016/src/c/cores/cores.h

    r21759 r22143  
    6666void TransferSealevel(FemModel* femmodel,int forcingenum);
    6767void EarthMassTransport(FemModel* femmodel);
    68 bool SlrAccumulateDeltaThickness(FemModel* femmodel);
    6968
    7069//solution configuration
  • issm/branches/trunk-larour-NatGeoScience2016/src/c/cores/sealevelrise_core.cpp

    r22118 r22143  
    1919        Vector<IssmDouble> *U_north   = NULL;
    2020        Vector<IssmDouble> *U_east    = NULL;
     21        Vector<IssmDouble>* cumdeltathickness=NULL;
    2122        bool save_results,isslr,iscoupler;
    2223        int configuration_type;
     
    3536        IssmDouble          *zz     = NULL;
    3637        IssmDouble          dt,steric_rate;
    37         int                 frequency;
     38        int                 frequency,count;
    3839        int  loop;
    3940        int  horiz;
     
    4546        femmodel->parameters->FindParam(&isslr,TransientIsslrEnum);
    4647        femmodel->parameters->FindParam(&iscoupler,TransientIscouplerEnum);
     48        femmodel->parameters->FindParam(&frequency,SealevelriseRunFrequencyEnum);
     49        femmodel->parameters->FindParam(&count,SealevelriseRunCountEnum);
     50
    4751       
    4852        /*first, recover lat,long and radius vectors from vertices: */
     
    7781        if(isslr)femmodel->SetCurrentConfiguration(SealevelriseAnalysisEnum);
    7882
    79         /*figure out whether deltathickness was computed on the earth (mass trasnport module should
     83        /*figure out whether deltathickness was computed on the earth (mass transport module should
    8084         * have taken care of it for ice caps:  */
    8185        if(iscoupler){
     
    8892        }
    8993
    90         /*transfer deltathickness forcing from ice caps to earth model: */
    91         if(iscoupler) TransferForcing(femmodel,SealevelriseDeltathicknessEnum);
     94        /*transfer cum deltathickness forcing from ice caps to earth model: */
     95        if(iscoupler & (count==frequency)) TransferForcing(femmodel,SealevelriseCumDeltathicknessEnum);
    9296
    9397        /*call sea-level rise sub cores:*/
    94         if(isslr && !SlrAccumulateDeltaThickness(femmodel)){
     98        if(isslr & (count==frequency)){
     99                       
     100                if(VerboseSolution()) _printf0_("   computing SLR core\n");
     101
     102                if(iscoupler){
     103                        /*we have accumulated thicknesses, dump them in deltathcikness: */
     104                        GetVectorFromInputsx(&cumdeltathickness,femmodel,SealevelriseCumDeltathicknessEnum,VertexSIdEnum);
     105                        InputUpdateFromVectorx(femmodel,cumdeltathickness,SealevelriseDeltathicknessEnum,VertexSIdEnum);
     106                        delete cumdeltathickness;
     107                }
    95108
    96109                femmodel->parameters->FindParam(&loop,SealevelriseLoopIncrementEnum);
     
    154167
    155168        }
    156 
     169               
     170        /*transfer sea-level back to ice caps, reset cum thicknesses to 0 and reset counter: */
     171        if(iscoupler){
     172                if (count==frequency) {
     173                        //transfer sea level back to ice caps:
     174                        TransferSealevel(femmodel,SealevelEnum);
     175
     176                        //reset cumdeltathickness  to 0:
     177                        GetVectorFromInputsx(&cumdeltathickness,femmodel,SealevelriseCumDeltathicknessEnum,VertexSIdEnum);
     178                        cumdeltathickness->Set(0);
     179                        InputUpdateFromVectorx(femmodel,cumdeltathickness,SealevelriseCumDeltathicknessEnum,VertexSIdEnum);
     180                        delete cumdeltathickness;
     181
     182                        //reset counter to 1:
     183                        femmodel->parameters->SetParam(1,SealevelriseRunCountEnum); //reset counter.
     184                }
     185                else{
     186                        //increment counter:
     187                        count++;
     188                        femmodel->parameters->SetParam(count,SealevelriseRunCountEnum);
     189                }
     190        }
     191       
    157192        /*Free ressources: */
    158193        delete longitude;
     
    163198        delete zz;
    164199
    165         /*transfer sea-level back to ice caps: */
    166         if(iscoupler)TransferSealevel(femmodel,SealevelEnum);
    167200}
    168201/*}}}*/
     
    260293                                /*We are going to plug this vector into the earth model, at the right vertices corresponding to this particular
    261294                                 * ice cap: */
    262                                 forcingglobal->SetValues(M,index,forcingfromcap,INS_VAL);
     295                                forcingglobal->SetValues(M,index,forcingfromcap,ADD_VAL);
    263296                                xDelete<int>(index);
    264297                        }
     
    406439        Vector<IssmDouble> *newthickness    = NULL;
    407440        Vector<IssmDouble> *deltathickness    = NULL;
     441        Vector<IssmDouble> *cumdeltathickness    = NULL;
    408442        int nv;
    409443       
     
    430464        InputUpdateFromVectorx(femmodel,deltathickness,SealevelriseDeltathicknessEnum,VertexSIdEnum);
    431465
     466        /*add to cumulated delta thickness: */
     467        GetVectorFromInputsx(&cumdeltathickness,femmodel,SealevelriseCumDeltathicknessEnum,VertexSIdEnum);
     468        cumdeltathickness->AXPY(deltathickness,1);
     469        InputUpdateFromVectorx(femmodel,cumdeltathickness,SealevelriseCumDeltathicknessEnum,VertexSIdEnum);
     470
    432471        /*free ressources:*/
    433472        delete oldthickness;
    434473        delete newthickness;
    435474        delete deltathickness;
     475        delete cumdeltathickness;
    436476
    437477} /*}}}*/
    438 bool SlrAccumulateDeltaThickness(FemModel* femmodel){ /*{{{*/
    439 
    440         Vector<IssmDouble>* deltathickness=NULL;
    441         Vector<IssmDouble>* cumdeltathickness=NULL;
    442         int frequency=1;
    443         int count;
    444         int solution_type;
    445        
    446         femmodel->parameters->FindParam(&solution_type,SolutionTypeEnum);
    447         if(solution_type==SealevelriseSolutionEnum)return false ;  //we don't accumulate when we run this solution type!
    448 
    449         femmodel->parameters->FindParam(&frequency,SealevelriseRunFrequencyEnum);
    450         femmodel->parameters->FindParam(&count,SealevelriseRunCountEnum);
    451 
    452         if (count==frequency){
    453                 femmodel->parameters->SetParam(1,SealevelriseRunCountEnum); //reset counter.
    454                
    455                 /*increment delta thickness load: */
    456                 GetVectorFromInputsx(&cumdeltathickness,femmodel,SealevelriseCumDeltathicknessEnum,VertexSIdEnum);
    457                 GetVectorFromInputsx(&deltathickness,femmodel,SealevelriseDeltathicknessEnum,VertexSIdEnum);
    458 
    459                 cumdeltathickness->AXPY(deltathickness,1);
    460 
    461                 /*update deltathickness with the final cumulated thickness: */
    462                 InputUpdateFromVectorx(femmodel,cumdeltathickness,SealevelriseDeltathicknessEnum,VertexSIdEnum);
    463                
    464                 /*reset cumulative thickness to 0: */
    465                 cumdeltathickness->Set(0);
    466                 InputUpdateFromVectorx(femmodel,cumdeltathickness,SealevelriseCumDeltathicknessEnum,VertexSIdEnum);
    467                
    468                 delete deltathickness;
    469                 delete cumdeltathickness;
    470 
    471                 return false;
    472         }
    473         else{
    474                 count++;
    475                 femmodel->parameters->SetParam(count,SealevelriseRunCountEnum); //increment counter
    476                
    477                 /*increment cumulative delta thickness load: */
    478                 GetVectorFromInputsx(&cumdeltathickness,femmodel,SealevelriseCumDeltathicknessEnum,VertexSIdEnum);
    479                 GetVectorFromInputsx(&deltathickness,femmodel,SealevelriseDeltathicknessEnum,VertexSIdEnum);
    480 
    481                 cumdeltathickness->AXPY(deltathickness,1);
    482                 InputUpdateFromVectorx(femmodel,cumdeltathickness,SealevelriseCumDeltathicknessEnum,VertexSIdEnum);
    483                
    484                 delete deltathickness;
    485                 delete cumdeltathickness;
    486 
    487                 return true;
    488         }
    489 
    490 } /*}}}*/
  • issm/branches/trunk-larour-NatGeoScience2016/src/c/modules/ModelProcessorx/CreateParameters.cpp

    r21759 r22143  
    6666        parameters->AddObject(iomodel->CopyConstantObject("md.inversion.type",InversionTypeEnum));
    6767        parameters->AddObject(iomodel->CopyConstantObject("md.calving.law",CalvingLawEnum));
     68        parameters->AddObject(iomodel->CopyConstantObject("md.slr.run_frequency",SealevelriseRunFrequencyEnum));
     69        parameters->AddObject(new IntParam(SealevelriseRunCountEnum,1)); 
    6870        {/*This is specific to ice...*/
    6971                parameters->AddObject(iomodel->CopyConstantObject("md.mesh.elementtype",MeshElementtypeEnum));
  • issm/branches/trunk-larour-NatGeoScience2016/src/m/classes/sealevelmodel.m

    r22139 r22143  
    5858                                end
    5959                        end
     60                       
     61                        %check that run_frequency is the same everywhere:
     62                        for i=1:length(slm.icecaps),
     63                                if slm.icecaps{i}.slr.run_frequency~=slm.earth.slr.run_frequency,
     64                                        error(sprintf('sealevelmodel checkconsistenty error:  icecap model %s should have the same run frequency as earth!',slm.icecaps{i}.miscellaneous.name));
     65                                end
     66                        end
     67
     68
    6069
    6170
Note: See TracChangeset for help on using the changeset viewer.