Changeset 26836 for issm/trunk-jpl/src/c/modules/FloatingiceMeltingRatex/FloatingiceMeltingRatex.cpp
- Timestamp:
- 01/29/22 07:39:27 (3 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/modules/FloatingiceMeltingRatex/FloatingiceMeltingRatex.cpp
r26329 r26836 45 45 if(VerboseSolution())_printf0_(" call BeckmannGoosse Floating melting rate module\n"); 46 46 BeckmannGoosseFloatingiceMeltingRatex(femmodel); 47 break; 48 case AutoregressionLinearFloatingMeltRateEnum: 49 if(VerboseSolution())_printf0_(" call Autoregression Linear Floating melting rate module\n"); 50 AutoregressionLinearFloatingiceMeltingRatex(femmodel); 47 51 break; 48 52 default: … … 206 210 } 207 211 /*}}}*/ 212 void 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 }/*}}}*/ 240 void 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.