Changeset 26119


Ignore:
Timestamp:
03/19/21 12:37:01 (4 years ago)
Author:
Eric.Larour
Message:

CHG: rearranging sea level optimized core.

Location:
issm/trunk-jpl/src/c/cores
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk-jpl/src/c/cores/cores.h

    r26110 r26119  
    6363#endif
    6464void grd_core(FemModel* femmodel);
     65void grd_core_optim(FemModel* femmodel);
    6566void solidearthexternal_core(FemModel* femmodel);
    6667void dynstr_core(FemModel* femmodel);
    67 SealevelMasks* sealevel_masks(FemModel* femmodel);
    6868Vector<IssmDouble>* sealevelchange_core_barystatic(FemModel* femmodel,SealevelMasks* mask, IssmDouble* poceanarea);
    6969Vector<IssmDouble>* sealevelchange_core_sal(FemModel* femmodel,SealevelMasks* masks, Vector<IssmDouble>* RSLg_barystatic,IssmDouble oceanarea);
  • issm/trunk-jpl/src/c/cores/sealevelchange_core.cpp

    r26110 r26119  
    1717void slcconvergence(bool* pconverged, Vector<IssmDouble>* RSLg,Vector<IssmDouble>* RSLg_old,IssmDouble eps_rel,IssmDouble eps_abs);
    1818IssmDouble SealevelloadsOceanAverage(Vector<IssmDouble>* sealevelloads,Vector<IssmDouble>* oceanareas, IssmDouble oceanarea);
     19SealevelMasks* sealevel_masks(FemModel* femmodel);
    1920/*}}}*/
    2021
     
    390391}; /*}}}*/
    391392
    392 void grd_core_optim(FemModel* femmodel,SealevelMasks* masks) { /*{{{*/
     393void grd_core_optim(FemModel* femmodel) { /*{{{*/
    393394
    394395        /*variables:{{{*/
    395396        int nel;
    396397        BarystaticContributions* barycontrib=NULL;
     398        SealevelMasks* masks=NULL;
    397399        GenericParam<BarystaticContributions*>* barycontribparam=NULL;
    398         IssmDouble               barystatic;
    399400       
    400401        Vector<IssmDouble>*    loads=NULL;
     
    402403        Vector<IssmDouble>*    sealevelloads=NULL;
    403404        Vector<IssmDouble>*    oldsealevelloads=NULL;
    404         IssmDouble             sealevelloadsaverage;
    405405        IssmDouble*            allsealevelloads=NULL;
    406406        Vector<IssmDouble>*    oceanareas=NULL;
     
    413413        int                  step;
    414414        IssmDouble           time;
    415        
    416         IssmDouble cumbslc;
    417         IssmDouble cumbslcice;
    418         IssmDouble cumbslchydro;
     415
     416        int  modelid,earthid;
     417        int  horiz;
     418        int  count,frequency,iscoupling;
     419        int  grd=0;
    419420        /*}}}*/
    420421
    421         /*retrieve parameters: */
     422        /*Verbose: */
     423        if(VerboseSolution()) _printf0_("         computing GRD patterns\n");
     424
     425        /*retrieve parameters:{{{*/
     426        femmodel->parameters->FindParam(&grd,SolidearthSettingsGRDEnum);
     427        femmodel->parameters->FindParam(&frequency,SolidearthSettingsRunFrequencyEnum);
     428        femmodel->parameters->FindParam(&count,SealevelchangeRunCountEnum);
     429        /*}}}*/
     430
     431        /*only run if grd was requested, if we are the earth, and we have reached
     432         * the necessary number of time steps dictated by :*/
     433        if(!grd)            return;
     434        if(count!=frequency)return;
     435        femmodel->parameters->FindParam(&iscoupling,IsSlcCouplingEnum);
     436        if(iscoupling){
     437                femmodel->parameters->FindParam(&modelid,ModelIdEnum);
     438                femmodel->parameters->FindParam(&earthid,EarthIdEnum);
     439                if(modelid!=earthid)return;
     440        }
     441        /*retrieve parameters: {{{*/
    422442        femmodel->parameters->FindParam(&scaleoceanarea,SolidearthSettingsOceanAreaScalingEnum);
    423443        barycontribparam = xDynamicCast<GenericParam<BarystaticContributions*>*>(femmodel->parameters->FindParamObject(BarystaticContributionsEnum));
     
    426446        femmodel->parameters->FindParam(&eps_rel,SolidearthSettingsReltolEnum);
    427447        femmodel->parameters->FindParam(&eps_abs,SolidearthSettingsAbstolEnum);
    428        
     448        femmodel->parameters->FindParam(&horiz,SolidearthSettingsHorizEnum);
     449        /*}}}*/
     450
    429451        /*initialize matrices and vectors:*/
    430452        femmodel->parameters->FindParam(&nel,MeshNumberofelementsEnum);
     
    432454        sealevelloads=new Vector<IssmDouble>(nel);
    433455        oceanareas=new Vector<IssmDouble>(nel);
     456
     457        /*call masks core: */
     458        masks=sealevel_masks(femmodel);
    434459       
    435460        /*buildup loads: */
     
    439464        }
    440465
    441         //Communicate loads from local to global:
     466        //broadcast loads
    442467        loads->Assemble(); allloads=loads->ToMPISerial();
    443468
     
    447472                element->SealevelchangeInitialConvolution(sealevelloads,oceanareas,allloads,masks);
    448473        }
    449 
     474        sealevelloads->Assemble();
     475       
    450476        //Get ocean area:
    451477        oceanareas->Assemble(); oceanareas->Sum(&oceanarea); _assert_(oceanarea>0.);
    452478        if(scaleoceanarea) oceanarea=3.619e+14; // use true ocean area, m^2
    453479
    454         //Get sea level loads ocean average:
    455         sealevelloadsaverage=SealevelloadsOceanAverage(sealevelloads,oceanareas,oceanarea);
    456        
    457480        //substract ocean average and barystatic contributionfrom sea level loads:
    458         barystatic=barycontrib->Total()/oceanarea/rho_water;
    459         sealevelloads->Shift(-sealevelloadsaverage+barystatic);
     481        sealevelloads->Shift(barycontrib->Total()/oceanarea/rho_water - SealevelloadsOceanAverage(sealevelloads,oceanareas,oceanarea));
     482       
     483        //broadcast sea level loads
    460484        allsealevelloads=sealevelloads->ToMPISerial();
    461485
     
    471495                }
    472496                sealevelloads->Assemble();
     497       
    473498               
    474499                //substract ocean average and barystatic contribution
    475                 sealevelloadsaverage=SealevelloadsOceanAverage(sealevelloads,oceanareas,oceanarea);
    476                 sealevelloads->Shift(-sealevelloadsaverage+barystatic);
    477 
    478                 //broadcast loads
     500                sealevelloads->Shift(barycontrib->Total()/oceanarea/rho_water - SealevelloadsOceanAverage(sealevelloads,oceanareas,oceanarea));
     501               
     502                //broadcast sea level loads
    479503                allsealevelloads=sealevelloads->ToMPISerial();
    480504
     
    484508        }
    485509
     510        /*convolve loads and sea level loads to get the deformation:*/
     511        for(Object* & object : femmodel->elements->objects){
     512                Element* element = xDynamicCast<Element*>(object);
     513                //element->SealevelchangeDeformationConvolution(allsealevelloads, allloads,masks);
     514        }
     515
     516        /*Update bedrock motion and geoid:*/
     517        /*inputs->AXPY(SealevelEnum,SealevelGRD,1);
     518        inputs->AXPY(BedEnum,BedGRD,1);
     519        if(horiz){
     520                inputs->AXPY(BedrockeastEnum,BedEastGRD,1);
     521                inputs->AXPY(BedrocknorthEnum,BedNorthGRD,1);
     522        }*/
     523
    486524        /*cumulate barystatic contributions and save to results: */
    487525        barycontrib->Cumulate(femmodel->parameters);
    488526        barycontrib->Save(femmodel->results,femmodel->parameters,oceanarea);
     527
    489528
    490529}
Note: See TracChangeset for help on using the changeset viewer.