Ignore:
Timestamp:
01/29/22 07:39:27 (3 years ago)
Author:
vverjans
Message:

NEW: added class autoregressionlinearbasalforcings

File:
1 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk-jpl/src/c/modules/FloatingiceMeltingRatex/FloatingiceMeltingRatex.cpp

    r26329 r26836  
    4545                        if(VerboseSolution())_printf0_("        call BeckmannGoosse Floating melting rate module\n");
    4646                        BeckmannGoosseFloatingiceMeltingRatex(femmodel);
     47                        break;
     48                case AutoregressionLinearFloatingMeltRateEnum:
     49                        if(VerboseSolution())_printf0_("        call Autoregression Linear Floating melting rate module\n");
     50                        AutoregressionLinearFloatingiceMeltingRatex(femmodel);
    4751                        break;
    4852                default:
     
    206210}
    207211/*}}}*/
     212void AutoregressionLinearFloatingiceMeltingRateInitx(FemModel* femmodel){/*{{{*/
     213
     214        /*Initialization step of AutoregressionLinearFloatingiceMeltingRatex*/
     215   int M,N,Nphi,arorder,numbasins,my_rank;
     216   IssmDouble starttime,tstep_ar,tinit_ar;
     217   femmodel->parameters->FindParam(&numbasins,BasalforcingsLinearNumBasinsEnum);
     218   femmodel->parameters->FindParam(&arorder,BasalforcingsAutoregressiveOrderEnum);
     219   IssmDouble* beta0    = NULL;
     220   IssmDouble* beta1    = NULL;
     221   IssmDouble* phi      = NULL;
     222   femmodel->parameters->FindParam(&starttime,TimesteppingStartTimeEnum);
     223   femmodel->parameters->FindParam(&tstep_ar,BasalforcingsAutoregressionTimestepEnum);
     224   femmodel->parameters->FindParam(&tinit_ar,BasalforcingsAutoregressionInitialTimeEnum);
     225   femmodel->parameters->FindParam(&beta0,&M,BasalforcingsBeta0Enum);    _assert_(M==numbasins);
     226   femmodel->parameters->FindParam(&beta1,&M,BasalforcingsBeta1Enum);    _assert_(M==numbasins);
     227   femmodel->parameters->FindParam(&phi,&M,&Nphi,BasalforcingsPhiEnum);  _assert_(M==numbasins); _assert_(Nphi==arorder);
     228       
     229        /*AR model spin-up with 0 noise to initialize BasalforcingsDeepwaterMeltingRateValuesAutoregressionEnum (688 = log(0.001)/log(0.99): decaying time of inluence of phi[0]=0.99 to 0.001 of beta_0*/
     230   int nspin = 688;
     231   for(Object* &object:femmodel->elements->objects){
     232      Element* element = xDynamicCast<Element*>(object); //generate element object
     233      element->AutoregressionInit(numbasins,arorder,nspin,starttime,tstep_ar,tinit_ar,beta0,beta1,phi,BasalforcingsDeepwaterMeltingRateAutoregressionEnum);
     234        }
     235        /*Cleanup*/
     236   xDelete<IssmDouble>(beta0);
     237   xDelete<IssmDouble>(beta1);
     238   xDelete<IssmDouble>(phi);
     239}/*}}}*/
     240void AutoregressionLinearFloatingiceMeltingRatex(FemModel* femmodel){/*{{{*/
     241
     242        /*Get time parameters*/
     243   IssmDouble time,dt,starttime,tstep_ar;
     244   femmodel->parameters->FindParam(&time,TimeEnum);
     245   femmodel->parameters->FindParam(&dt,TimesteppingTimeStepEnum);
     246   femmodel->parameters->FindParam(&starttime,TimesteppingStartTimeEnum);
     247   femmodel->parameters->FindParam(&tstep_ar,BasalforcingsAutoregressionTimestepEnum);
     248
     249   /*Initialize module at first time step*/
     250   if(time<=starttime+dt){AutoregressionLinearFloatingiceMeltingRateInitx(femmodel);}
     251   /*Determine if this is a time step for the AR model*/
     252   bool isstepforar = false;
     253
     254   #ifndef _HAVE_AD_
     255   if((fmod(time,tstep_ar)<fmod((time-dt),tstep_ar)) || (time<=starttime+dt) || tstep_ar==dt) isstepforar = true;
     256   #else
     257   _error_("not implemented yet");
     258   #endif
     259
     260   /*Load parameters*/
     261   bool isstochastic;
     262   bool isdeepmeltingstochastic = false;
     263   int M,N,Nphi,arorder,numbasins,my_rank;
     264   femmodel->parameters->FindParam(&numbasins,BasalforcingsLinearNumBasinsEnum);
     265        femmodel->parameters->FindParam(&arorder,BasalforcingsAutoregressiveOrderEnum);
     266   IssmDouble tinit_ar;
     267   IssmDouble* beta0          = NULL;
     268   IssmDouble* beta1          = NULL;
     269   IssmDouble* phi            = NULL;
     270   IssmDouble* deepwaterel    = NULL;
     271   IssmDouble* upperwaterel   = NULL;
     272   IssmDouble* upperwatermelt = NULL;
     273   IssmDouble* perturbation   = NULL;
     274
     275        /*Get autoregressive parameters*/
     276   femmodel->parameters->FindParam(&tinit_ar,BasalforcingsAutoregressionInitialTimeEnum);
     277   femmodel->parameters->FindParam(&beta0,&M,BasalforcingsBeta0Enum);               _assert_(M==numbasins);
     278   femmodel->parameters->FindParam(&beta1,&M,BasalforcingsBeta1Enum);               _assert_(M==numbasins);
     279   femmodel->parameters->FindParam(&phi,&M,&Nphi,BasalforcingsPhiEnum);             _assert_(M==numbasins); _assert_(Nphi==arorder);
     280
     281        /*Get basin-specific parameters*/
     282   femmodel->parameters->FindParam(&deepwaterel,&M,BasalforcingsDeepwaterElevationEnum);            _assert_(M==numbasins);
     283   femmodel->parameters->FindParam(&upperwaterel,&M,BasalforcingsUpperwaterElevationEnum);          _assert_(M==numbasins);
     284   femmodel->parameters->FindParam(&upperwatermelt,&M,BasalforcingsUpperwaterMeltingRateEnum);      _assert_(M==numbasins);
     285
     286        /*Evaluate whether stochasticity on DeepwaterMeltingRate is requested*/
     287        femmodel->parameters->FindParam(&isstochastic,StochasticForcingIsStochasticForcingEnum);
     288   if(isstochastic){
     289      int  numstochasticfields;
     290      int* stochasticfields;
     291      femmodel->parameters->FindParam(&numstochasticfields,StochasticForcingNumFieldsEnum);
     292      femmodel->parameters->FindParam(&stochasticfields,&N,StochasticForcingFieldsEnum); _assert_(N==numstochasticfields);
     293      for(int i=0;i<numstochasticfields;i++){
     294         if(stochasticfields[i]==BasalforcingsDeepwaterMeltingRateAutoregressionEnum) isdeepmeltingstochastic = true;
     295      }
     296      xDelete<int>(stochasticfields);
     297   }
     298   /*Time elapsed with respect to AR model initial time*/
     299   IssmDouble telapsed_ar = time-tinit_ar;
     300
     301        /*Loop over each element to compute FloatingiceMeltingRate at vertices*/
     302   for(Object* &object:femmodel->elements->objects){
     303      Element* element = xDynamicCast<Element*>(object);
     304      /*Compute autoregression*/
     305      element->Autoregression(isstepforar,arorder,telapsed_ar,beta0,beta1,phi,isdeepmeltingstochastic,BasalforcingsDeepwaterMeltingRateAutoregressionEnum);
     306                element->BasinLinearFloatingiceMeltingRate(deepwaterel,upperwatermelt,upperwaterel,perturbation);
     307        }
     308}/*}}}*/
Note: See TracChangeset for help on using the changeset viewer.