source: issm/oecreview/Archive/25834-26739/ISSM-26118-26119.diff@ 28275

Last change on this file since 28275 was 26740, checked in by Mathieu Morlighem, 3 years ago

CHG: added 25834-26739

File size: 7.0 KB
  • ../trunk-jpl/src/c/cores/cores.h

     
    6262void sealevelchange_geometry(FemModel* femmodel);
    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);
    7070void sealevelchange_core_deformation(Vector<IssmDouble>** pN_radial, Vector<IssmDouble>** pU_radial, Vector<IssmDouble>** pU_north,Vector<IssmDouble>** pU_east,FemModel* femmodel,Vector<IssmDouble>* RSLg, SealevelMasks* masks);
  • ../trunk-jpl/src/c/cores/sealevelchange_core.cpp

     
    1616void TransferSealevel(FemModel* femmodel,int forcingenum);
    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
    2122/*main cores:*/
     
    389390        }
    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;
    401402        IssmDouble*            allloads=NULL;
    402403        Vector<IssmDouble>*    sealevelloads=NULL;
    403404        Vector<IssmDouble>*    oldsealevelloads=NULL;
    404         IssmDouble             sealevelloadsaverage;
    405405        IssmDouble*            allsealevelloads=NULL;
    406406        Vector<IssmDouble>*    oceanareas=NULL;
    407407        IssmDouble             oceanarea;
     
    412412        IssmDouble           eps_abs;
    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));
    424444        barycontrib=barycontribparam->GetParameterValue();
     
    425445        femmodel->parameters->FindParam(&rho_water,MaterialsRhoSeawaterEnum);
    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);
    431453        loads=new Vector<IssmDouble>(nel);
    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: */
    436461        for(Object* & object : femmodel->elements->objects){
     
    438463                element->SealevelchangeBarystaticLoads(loads, barycontrib,masks);
    439464        }
    440465
    441         //Communicate loads from local to global:
     466        //broadcast loads
    442467        loads->Assemble(); allloads=loads->ToMPISerial();
    443468
    444469        /*convolve loads:*/
     
    446471                Element* element = xDynamicCast<Element*>(object);
    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);
     480        //substract ocean average and barystatic contributionfrom sea level loads:
     481        sealevelloads->Shift(barycontrib->Total()/oceanarea/rho_water - SealevelloadsOceanAverage(sealevelloads,oceanareas,oceanarea));
    456482       
    457         //substract ocean average and barystatic contributionfrom sea level loads:
    458         barystatic=barycontrib->Total()/oceanarea/rho_water;
    459         sealevelloads->Shift(-sealevelloadsaverage+barystatic);
     483        //broadcast sea level loads
    460484        allsealevelloads=sealevelloads->ToMPISerial();
    461485
    462486        bool converged=false;
     
    470494                        element->SealevelchangeOceanConvolution(sealevelloads, allsealevelloads, allloads,masks);
    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
    481505                //convergence?
     
    483507                if (converged)break;
    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);
    489527
     528
    490529}
    491530/*}}}*/
    492531
Note: See TracBrowser for help on using the repository browser.