Changeset 26526
- Timestamp:
- 11/02/21 07:18:54 (3 years ago)
- Location:
- issm/trunk-jpl
- Files:
-
- 2 added
- 19 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/Makefile.am
r26477 r26526 247 247 ./modules/ResetFSBasalBoundaryConditionx/ResetFSBasalBoundaryConditionx.cpp \ 248 248 ./modules/Solverx/Solverx.cpp \ 249 ./modules/StochasticForcingx/StochasticForcingx.cpp \ 249 250 ./modules/Mergesolutionfromftogx/Mergesolutionfromftogx.cpp \ 250 251 ./cores/ProcessArguments.cpp \ -
issm/trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp
r26495 r26526 147 147 case FrontalForcingsRignotAutoregressionEnum: 148 148 /*Retrieve autoregressive parameters*/ 149 parameters->AddObject(iomodel->CopyConstantObject("md.frontalforcings.randomflag",FrontalForcingsRandomflagEnum));150 149 parameters->AddObject(iomodel->CopyConstantObject("md.frontalforcings.ar_order",FrontalForcingsAutoregressiveOrderEnum)); 151 150 parameters->AddObject(iomodel->CopyConstantObject("md.frontalforcings.ar_initialtime",FrontalForcingsAutoregressionInitialTimeEnum)); … … 159 158 iomodel->FetchData(&transparam,&M,&N,"md.frontalforcings.phi"); 160 159 parameters->AddObject(new DoubleMatParam(FrontalForcingsPhiEnum,transparam,M,N)); 161 xDelete<IssmDouble>(transparam);162 iomodel->FetchData(&transparam,&M,&N,"md.frontalforcings.covmat");163 parameters->AddObject(new DoubleMatParam(FrontalForcingsCovmatEnum,transparam,M,N));164 160 xDelete<IssmDouble>(transparam); 165 161 /*Do not break here, generic FrontalForcingsRignot parameters still to be retrieved*/ -
issm/trunk-jpl/src/c/classes/Elements/Element.cpp
r26495 r26526 60 60 return false; 61 61 }/*}}}*/ 62 void Element::AutoregressionInit(int numbasins,int arorder,int nspin,IssmDouble starttime,IssmDouble tstep_ar,IssmDouble tinit_ar,IssmDouble* beta0,IssmDouble* beta1,IssmDouble* phi, IssmDouble* noisespin,int enum_type){/*{{{*/63 64 62 void Element::AutoregressionInit(int numbasins,int arorder,int nspin,IssmDouble starttime,IssmDouble tstep_ar,IssmDouble tinit_ar,IssmDouble* beta0,IssmDouble* beta1,IssmDouble* phi,int enum_type){/*{{{*/ 63 64 const int numvertices = this->GetNumberOfVertices(); 65 65 int basinid; 66 IssmDouble tspin,beta0_basin,beta1_basin,noisespin_basin; 66 IssmDouble tspin,beta0_basin,beta1_basin,noisespin_basin; 67 67 IssmDouble* phi_basin = xNew<IssmDouble>(arorder); 68 68 IssmDouble* varspin = xNewZeroInit<IssmDouble>(numvertices*arorder); 69 69 70 70 /*Get Basin ID and Basin coefficients*/ 71 71 if(enum_type==SMBautoregressionEnum) this->GetInputValue(&basinid,SmbBasinsIdEnum); 72 72 if(enum_type==FrontalForcingsRignotAutoregressionEnum) this->GetInputValue(&basinid,FrontalForcingsBasinIdEnum); 73 73 for(int i=0;i<arorder;i++) phi_basin[i] = phi[basinid*arorder+i]; … … 75 75 beta1_basin = beta1[basinid]; 76 76 77 /*Loop over number of spin-up steps for all vertices*/ 78 for(int j=0;j<nspin;j++){ 79 tspin = starttime-((nspin-j)*tstep_ar); 80 noisespin_basin = noisespin[j*numbasins+basinid]; 77 /*Loop over number of spin-up steps for all vertices*/ 78 for(int j=0;j<nspin;j++){ 79 tspin = starttime-((nspin-j)*tstep_ar); 81 80 IssmDouble* oldvarspin = xNew<IssmDouble>(numvertices*arorder); 82 81 for(int i=0;i<numvertices*arorder;i++) oldvarspin[i]=varspin[i]; … … 85 84 IssmDouble autoregressionterm = 0.; 86 85 for(int i=0;i<arorder;i++) autoregressionterm += phi_basin[i]*varspin[v+i*numvertices]; 87 varspin[v] = beta0_basin+beta1_basin*(tspin-tinit_ar)+autoregressionterm +noisespin_basin;86 varspin[v] = beta0_basin+beta1_basin*(tspin-tinit_ar)+autoregressionterm; 88 87 } 89 88 90 /*Adjust tolder values in varspin*/91 for(int i=0;i<(arorder-1)*numvertices;i++) varspin[i+numvertices]=oldvarspin[i]; 92 93 xDelete<IssmDouble>(oldvarspin); 89 /*Adjust older values in varspin*/ 90 for(int i=0;i<(arorder-1)*numvertices;i++) varspin[i+numvertices]=oldvarspin[i]; 91 92 xDelete<IssmDouble>(oldvarspin); 94 93 } 95 94 if(enum_type==SMBautoregressionEnum) this->inputs->SetArrayInput(SmbValuesAutoregressionEnum,this->lid,varspin,numvertices*arorder); 96 95 if(enum_type==FrontalForcingsRignotAutoregressionEnum) this->inputs->SetArrayInput(ThermalforcingValuesAutoregressionEnum,this->lid,varspin,numvertices*arorder); 97 96 98 99 97 /*Cleanup and return*/ 100 xDelete<IssmDouble>(varspin); 101 xDelete<IssmDouble>(phi_basin); 98 xDelete<IssmDouble>(varspin); 99 xDelete<IssmDouble>(phi_basin); 102 100 }/*}}}*/ 103 101 void Element::Autoregression(bool isstepforar,int arorder,IssmDouble telapsed_ar,IssmDouble* beta0,IssmDouble* beta1,IssmDouble* phi,IssmDouble* noiseterms,int enum_type){/*{{{*/ 104 105 102 103 const int numvertices = this->GetNumberOfVertices(); 106 104 int basinid,M,N; 107 IssmDouble beta0_basin,beta1_basin,noise_basin; 105 IssmDouble beta0_basin,beta1_basin,noise_basin; 108 106 IssmDouble* phi_basin = xNew<IssmDouble>(arorder); 109 107 IssmDouble* varlist = xNew<IssmDouble>(numvertices); … … 113 111 if(enum_type==SMBautoregressionEnum) this->GetInputValue(&basinid,SmbBasinsIdEnum); 114 112 if(enum_type==FrontalForcingsRignotAutoregressionEnum) this->GetInputValue(&basinid,FrontalForcingsBasinIdEnum); 115 for(int ii=0;ii<arorder;ii++) phi_basin[ii] = phi[basinid*arorder+ii]; 113 for(int ii=0;ii<arorder;ii++) phi_basin[ii] = phi[basinid*arorder+ii]; 116 114 beta0_basin = beta0[basinid]; 117 115 beta1_basin = beta1[basinid]; … … 138 136 IssmDouble* temparray = xNew<IssmDouble>(numvertices*arorder); 139 137 /*Assign newest values and shift older values*/ 140 for(int i=0;i<numvertices;i++) temparray[i] = varlist[i]; 138 for(int i=0;i<numvertices;i++) temparray[i] = varlist[i]; 141 139 for(int i=0;i<(arorder-1)*numvertices;i++) temparray[i+numvertices] = valuesautoregression[i]; 142 if(enum_type==SMBautoregressionEnum) this->inputs->SetArrayInput(SmbValuesAutoregressionEnum,this->lid,temparray,numvertices*arorder); 143 if(enum_type==FrontalForcingsRignotAutoregressionEnum) this->inputs->SetArrayInput(ThermalforcingValuesAutoregressionEnum,this->lid,temparray,numvertices*arorder); 140 if(enum_type==SMBautoregressionEnum) this->inputs->SetArrayInput(SmbValuesAutoregressionEnum,this->lid,temparray,numvertices*arorder); 141 if(enum_type==FrontalForcingsRignotAutoregressionEnum) this->inputs->SetArrayInput(ThermalforcingValuesAutoregressionEnum,this->lid,temparray,numvertices*arorder); 144 142 xDelete<IssmDouble>(temparray); 145 143 } 146 147 //if(this->lid==55){_printf_("varlist: "<<varlist[0]<<" "<<varlist[1]<<" "<<varlist[2]<<" "<<"noise_basin: "<<noise_basin<<" "<<'\n');} 148 149 /*Add input to element*/ 144 145 /*Add input to element*/ 150 146 if(enum_type==SMBautoregressionEnum) this->AddInput(SmbMassBalanceEnum,varlist,P1Enum); 151 147 if(enum_type==FrontalForcingsRignotAutoregressionEnum) this->AddInput(FrontalForcingsThermalForcingEnum,varlist,P1Enum); -
issm/trunk-jpl/src/c/cores/transient_core.cpp
r26432 r26526 127 127 /*parameters: */ 128 128 bool isstressbalance,ismasstransport,isoceantransport,issmb,isthermal,isgroundingline,isesa,issampling;; 129 bool isslc,ismovingfront,isdamageevolution,ishydrology,isoceancoupling, save_results;129 bool isslc,ismovingfront,isdamageevolution,ishydrology,isoceancoupling,isstochasticforcing,save_results; 130 130 int step,sb_coupling_frequency; 131 131 int domaintype,numoutputs; … … 150 150 femmodel->parameters->FindParam(&issampling,TransientIssamplingEnum); 151 151 femmodel->parameters->FindParam(&numoutputs,TransientNumRequestedOutputsEnum); 152 femmodel->parameters->FindParam(&isstochasticforcing,StochasticForcingIsStochasticForcingEnum); 152 153 153 154 #if defined(_HAVE_OCEAN_ ) 154 155 if(isoceancoupling) OceanExchangeDatax(femmodel,false); 155 156 #endif 157 158 if(isstochasticforcing){ 159 StochasticForcingx(femmodel); 160 } 156 161 157 162 if(isthermal && domaintype==Domain3DEnum){ -
issm/trunk-jpl/src/c/modules/FrontalForcingsx/FrontalForcingsx.cpp
r26495 r26526 39 39 IssmDouble* beta1 = NULL; 40 40 IssmDouble* phi = NULL; 41 IssmDouble* covmat = NULL;42 41 femmodel->parameters->FindParam(&starttime,TimesteppingStartTimeEnum); 43 42 femmodel->parameters->FindParam(&tstep_ar,FrontalForcingsAutoregressionTimestepEnum); … … 46 45 femmodel->parameters->FindParam(&beta1,&M,FrontalForcingsBeta1Enum); _assert_(M==numbasins); 47 46 femmodel->parameters->FindParam(&phi,&M,&Nphi,FrontalForcingsPhiEnum); _assert_(M==numbasins); _assert_(Nphi==arorder); 48 femmodel->parameters->FindParam(&covmat,&M,&N,FrontalForcingsCovmatEnum); _assert_(M==numbasins); _assert_(N==numbasins);49 47 50 /*AR model spin-up*/ 51 int nspin{2*arorder+5}; 52 IssmDouble* noisespin = xNewZeroInit<IssmDouble>(numbasins*nspin); 53 my_rank=IssmComm::GetRank(); 54 if(my_rank==0){ 55 bool randomflag{}; 56 femmodel->parameters->FindParam(&randomflag,FrontalForcingsRandomflagEnum); 57 int fixedseed; 58 for(int i=0;i<nspin;i++){ 59 IssmDouble* temparray = NULL; 60 /*Determine whether random seed is fixed to for loop step (randomflag==false) or random seed truly random (randomflag==true)*/ 61 if(randomflag) fixedseed=-1; 62 else fixedseed = i; 63 multivariateNormal(&temparray,numbasins,0.0,covmat,fixedseed); 64 for(int j=0;j<numbasins;j++){noisespin[i*numbasins+j]=temparray[j];} 65 xDelete<IssmDouble>(temparray); 66 } 67 } 68 ISSM_MPI_Bcast(noisespin,numbasins*nspin,ISSM_MPI_DOUBLE,0,IssmComm::GetComm()); 69 70 /*Initialize ThermalforcingValuesAutoregressionEnum*/ 48 /*AR model spin-up with 0 noise to initialize ThermalforcingValuesAutoregressionEnum*/ 49 int nspin{2*arorder+5}; 71 50 for(Object* &object:femmodel->elements->objects){ 72 51 Element* element = xDynamicCast<Element*>(object); //generate element object 73 element->AutoregressionInit(numbasins,arorder,nspin,starttime,tstep_ar,tinit_ar,beta0,beta1,phi, noisespin,FrontalForcingsRignotAutoregressionEnum);52 element->AutoregressionInit(numbasins,arorder,nspin,starttime,tstep_ar,tinit_ar,beta0,beta1,phi,FrontalForcingsRignotAutoregressionEnum); 74 53 } 75 54 … … 78 57 xDelete<IssmDouble>(beta1); 79 58 xDelete<IssmDouble>(phi); 80 xDelete<IssmDouble>(noisespin);81 xDelete<IssmDouble>(covmat);82 59 }/*}}}*/ 83 60 void Thermalforcingautoregressionx(FemModel* femmodel){/*{{{*/ … … 102 79 103 80 /*Load parameters*/ 81 bool isstochastic; 104 82 int M,N,Nphi,arorder,numbasins,my_rank; 105 83 femmodel->parameters->FindParam(&numbasins,FrontalForcingsNumberofBasinsEnum); … … 109 87 IssmDouble* beta1 = NULL; 110 88 IssmDouble* phi = NULL; 111 IssmDouble* covmat = NULL;112 IssmDouble* noiseterms = xNew<IssmDouble>(numbasins); 113 89 IssmDouble* noiseterms = xNewZeroInit<IssmDouble>(numbasins); 90 91 femmodel->parameters->FindParam(&tinit_ar,FrontalForcingsAutoregressionInitialTimeEnum); 114 92 femmodel->parameters->FindParam(&beta0,&M,FrontalForcingsBeta0Enum); _assert_(M==numbasins); 115 93 femmodel->parameters->FindParam(&beta1,&M,FrontalForcingsBeta1Enum); _assert_(M==numbasins); 116 94 femmodel->parameters->FindParam(&phi,&M,&Nphi,FrontalForcingsPhiEnum); _assert_(M==numbasins); _assert_(Nphi==arorder); 117 femmodel->parameters->FindParam(&covmat,&M,&N,FrontalForcingsCovmatEnum); _assert_(M==numbasins); _assert_(N==numbasins);118 95 96 /*Retrieve noise terms if stochasticity, otherwise leave noiseterms as 0*/ 97 femmodel->parameters->FindParam(&isstochastic,StochasticForcingIsStochasticForcingEnum); 98 if(isstochastic){ 99 int numstochasticfields; 100 int* stochasticfields; 101 femmodel->parameters->FindParam(&numstochasticfields,StochasticForcingNumFieldsEnum); 102 femmodel->parameters->FindParam(&stochasticfields,&N,StochasticForcingFieldsEnum); _assert_(N==numstochasticfields); 103 for(int i=0;i<numstochasticfields;i++){ 104 if(stochasticfields[i]==FrontalForcingsRignotAutoregressionEnum){ 105 femmodel->parameters->FindParam(&noiseterms,&M,ThermalforcingAutoregressionNoiseEnum); _assert_(M==numbasins); 106 } 107 } 108 } 119 109 /*Time elapsed with respect to AR model initial time*/ 120 110 IssmDouble telapsed_ar = time-tinit_ar; 121 111 122 /*Before looping through elements: compute noise term specific to each basin from covmat*/ 123 my_rank=IssmComm::GetRank(); 124 if(my_rank==0){ 125 bool randomflag{}; 126 femmodel->parameters->FindParam(&randomflag,FrontalForcingsRandomflagEnum); 127 /*Determine whether random seed is fixed to time step (randomflag==false) or random seed truly random (randomflag==true)*/ 128 int fixedseed; 129 if(randomflag) fixedseed=-1; 130 else fixedseed = reCast<int,IssmDouble>((time-starttime)/dt); 131 /*multivariateNormal needs to be passed a NULL pointer to avoid memory leak issues*/ 132 IssmDouble* temparray = NULL; 133 multivariateNormal(&temparray,numbasins,0.0,covmat,fixedseed); 134 for(int i=0;i<numbasins;i++) noiseterms[i]=temparray[i]; 135 xDelete<IssmDouble>(temparray); 136 } 137 ISSM_MPI_Bcast(noiseterms,numbasins,ISSM_MPI_DOUBLE,0,IssmComm::GetComm()); 138 139 /*Loop over each element to compute SMB at vertices*/ 112 /*Loop over each element to compute Thermal Forcing at vertices*/ 140 113 for(Object* &object:femmodel->elements->objects){ 141 114 Element* element = xDynamicCast<Element*>(object); … … 148 121 xDelete<IssmDouble>(phi); 149 122 xDelete<IssmDouble>(noiseterms); 150 xDelete<IssmDouble>(covmat);151 123 }/*}}}*/ -
issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp
r26483 r26526 90 90 parameters->AddObject(iomodel->CopyConstantObject("md.transient.amr_frequency",TransientAmrFrequencyEnum)); 91 91 parameters->AddObject(iomodel->CopyConstantObject("md.transient.issampling",TransientIssamplingEnum)); 92 parameters->AddObject(iomodel->CopyConstantObject("md.stochasticforcing.isstochasticforcing",StochasticForcingIsStochasticForcingEnum)); 92 93 93 94 /*For stress balance only*/ … … 399 400 /*Add parameters that are not in standard nbvertices format*/ 400 401 parameters->AddObject(iomodel->CopyConstantObject("md.smb.num_basins",SmbNumBasinsEnum)); 401 parameters->AddObject(iomodel->CopyConstantObject("md.smb.randomflag",SmbRandomflagEnum));402 402 parameters->AddObject(iomodel->CopyConstantObject("md.smb.ar_order",SmbAutoregressiveOrderEnum)); 403 403 parameters->AddObject(iomodel->CopyConstantObject("md.smb.ar_initialtime",SmbAutoregressionInitialTimeEnum)); … … 412 412 parameters->AddObject(new DoubleMatParam(SmbPhiEnum,transparam,M,N)); 413 413 xDelete<IssmDouble>(transparam); 414 iomodel->FetchData(&transparam,&M,&N,"md.smb.covmat");415 parameters->AddObject(new DoubleMatParam(SmbCovmatEnum,transparam,M,N));416 xDelete<IssmDouble>(transparam);417 414 break; 418 415 case SMBgembEnum: … … 500 497 if(numoutputs)parameters->AddObject(new StringArrayParam(DamageEvolutionRequestedOutputsEnum,requestedoutputs,numoutputs)); 501 498 iomodel->DeleteData(&requestedoutputs,numoutputs,"md.damage.requested_outputs"); 499 } 500 501 bool isstochasticforcing; 502 parameters->FindParam(&isstochasticforcing,StochasticForcingIsStochasticForcingEnum); 503 if(isstochasticforcing){ 504 int num_fields; 505 char** fields; 506 parameters->AddObject(iomodel->CopyConstantObject("md.stochasticforcing.num_fields",StochasticForcingNumFieldsEnum)); 507 iomodel->FindConstant(&fields,&num_fields,"md.stochasticforcing.fields"); 508 if(num_fields<1) _error_("no stochasticforcing fields found"); 509 int* stochasticforcing_enums = xNew<int>(num_fields); 510 for(int i=0;i<num_fields;i++){ 511 stochasticforcing_enums[i] = StringToEnumx(fields[i]); 512 xDelete<char>(fields[i]); 513 } 514 xDelete<char*>(fields); 515 parameters->AddObject(new IntVecParam(StochasticForcingFieldsEnum,stochasticforcing_enums,num_fields)); 516 xDelete<int>(stochasticforcing_enums); 517 518 parameters->AddObject(iomodel->CopyConstantObject("md.stochasticforcing.randomflag",StochasticForcingRandomflagEnum)); 519 iomodel->FetchData(&transparam,&M,&N,"md.stochasticforcing.dimensions"); 520 parameters->AddObject(new IntVecParam(StochasticForcingDimensionsEnum,transparam,N)); 521 xDelete<IssmDouble>(transparam); 522 iomodel->FetchData(&transparam,&M,&N,"md.stochasticforcing.covariance"); 523 parameters->AddObject(new DoubleMatParam(StochasticForcingCovarianceEnum,transparam,M,N)); 524 xDelete<IssmDouble>(transparam); 502 525 } 503 526 -
issm/trunk-jpl/src/c/modules/SurfaceMassBalancex/SurfaceMassBalancex.cpp
r26495 r26526 157 157 IssmDouble* beta1 = NULL; 158 158 IssmDouble* phi = NULL; 159 IssmDouble* covmat = NULL;160 159 femmodel->parameters->FindParam(&starttime,TimesteppingStartTimeEnum); 161 160 femmodel->parameters->FindParam(&tstep_ar,SmbAutoregressionTimestepEnum); … … 164 163 femmodel->parameters->FindParam(&beta1,&M,SmbBeta1Enum); _assert_(M==numbasins); 165 164 femmodel->parameters->FindParam(&phi,&M,&Nphi,SmbPhiEnum); _assert_(M==numbasins); _assert_(Nphi==arorder); 166 femmodel->parameters->FindParam(&covmat,&M,&N,SmbCovmatEnum); _assert_(M==numbasins); _assert_(N==numbasins);167 165 168 /*AR model spin-up*/ 169 int nspin{2*arorder+5}; 170 IssmDouble* noisespin = xNewZeroInit<IssmDouble>(numbasins*nspin); 171 my_rank=IssmComm::GetRank(); 172 if(my_rank==0){ 173 bool randomflag{}; 174 femmodel->parameters->FindParam(&randomflag,SmbRandomflagEnum); 175 int fixedseed; 176 for(int i=0;i<nspin;i++){ 177 //IssmDouble* temparray = xNew<IssmDouble>(numbasins); 178 IssmDouble* temparray = NULL; 179 /*Determine whether random seed is fixed to for loop step (randomflag==false) or random seed truly random (randomflag==true)*/ 180 if(randomflag) fixedseed=-1; 181 else fixedseed = i; 182 multivariateNormal(&temparray,numbasins,0.0,covmat,fixedseed); 183 for(int j=0;j<numbasins;j++){noisespin[i*numbasins+j]=temparray[j];} 184 xDelete<IssmDouble>(temparray); 185 } 186 } 187 ISSM_MPI_Bcast(noisespin,numbasins*nspin,ISSM_MPI_DOUBLE,0,IssmComm::GetComm()); 188 189 /*Initialize SmbValuesAutoregressionEnum*/ 166 /*AR model spin-up with 0 noise to initialize SmbValuesAutoregressionEnum*/ 167 int nspin{2*arorder+5}; 190 168 for(Object* &object:femmodel->elements->objects){ 191 169 Element* element = xDynamicCast<Element*>(object); //generate element object 192 element->AutoregressionInit(numbasins,arorder,nspin,starttime,tstep_ar,tinit_ar,beta0,beta1,phi,noisespin,SMBautoregressionEnum); 193 } 194 170 element->AutoregressionInit(numbasins,arorder,nspin,starttime,tstep_ar,tinit_ar,beta0,beta1,phi,SMBautoregressionEnum); 171 } 195 172 /*Cleanup*/ 196 173 xDelete<IssmDouble>(beta0); 197 174 xDelete<IssmDouble>(beta1); 198 175 xDelete<IssmDouble>(phi); 199 xDelete<IssmDouble>(noisespin);200 xDelete<IssmDouble>(covmat);201 176 }/*}}}*/ 202 177 void Smbautoregressionx(FemModel* femmodel){/*{{{*/ … … 221 196 222 197 /*Load parameters*/ 198 bool isstochastic; 223 199 int M,N,Nphi,arorder,numbasins,my_rank; 224 200 femmodel->parameters->FindParam(&numbasins,SmbNumBasinsEnum); … … 228 204 IssmDouble* beta1 = NULL; 229 205 IssmDouble* phi = NULL; 230 IssmDouble* covmat = NULL; 231 IssmDouble* noiseterms = xNew<IssmDouble>(numbasins); 206 232 207 femmodel->parameters->FindParam(&tinit_ar,SmbAutoregressionInitialTimeEnum); 233 208 femmodel->parameters->FindParam(&beta0,&M,SmbBeta0Enum); _assert_(M==numbasins); 234 209 femmodel->parameters->FindParam(&beta1,&M,SmbBeta1Enum); _assert_(M==numbasins); 235 210 femmodel->parameters->FindParam(&phi,&M,&Nphi,SmbPhiEnum); _assert_(M==numbasins); _assert_(Nphi==arorder); 236 femmodel->parameters->FindParam(&covmat,&M,&N,SmbCovmatEnum); _assert_(M==numbasins); _assert_(N==numbasins); 237 211 212 /*Retrieve noise terms if stochasticity, otherwise leave noiseterms as 0*/ 213 IssmDouble* noiseterms = xNewZeroInit<IssmDouble>(numbasins); 214 femmodel->parameters->FindParam(&isstochastic,StochasticForcingIsStochasticForcingEnum); 215 if(isstochastic){ 216 int numstochasticfields; 217 int* stochasticfields; 218 femmodel->parameters->FindParam(&numstochasticfields,StochasticForcingNumFieldsEnum); 219 femmodel->parameters->FindParam(&stochasticfields,&N,StochasticForcingFieldsEnum); _assert_(N==numstochasticfields); 220 for(int i=0;i<numstochasticfields;i++){ 221 if(stochasticfields[i]==SMBautoregressionEnum){ 222 femmodel->parameters->FindParam(&noiseterms,&M,SmbAutoregressionNoiseEnum); _assert_(M==numbasins); 223 } 224 } 225 xDelete<int>(stochasticfields); 226 } 238 227 /*Time elapsed with respect to AR model initial time*/ 239 228 IssmDouble telapsed_ar = time-tinit_ar; 240 241 /*Before looping through elements: compute noise term specific to each basin from covmat*/242 my_rank=IssmComm::GetRank();243 if(my_rank==0){244 bool randomflag{};245 femmodel->parameters->FindParam(&randomflag,SmbRandomflagEnum);246 /*Determine whether random seed is fixed to time step (randomflag==false) or random seed truly random (randomflag==true)*/247 int fixedseed;248 if(randomflag) fixedseed=-1;249 else fixedseed = reCast<int,IssmDouble>((time-starttime)/dt);250 /*multivariateNormal needs to be passed a NULL pointer to avoid memory leak issues*/251 IssmDouble* temparray = NULL;252 multivariateNormal(&temparray,numbasins,0.0,covmat,fixedseed);253 for(int i=0;i<numbasins;i++) noiseterms[i]=temparray[i];254 xDelete<IssmDouble>(temparray);255 }256 ISSM_MPI_Bcast(noiseterms,numbasins,ISSM_MPI_DOUBLE,0,IssmComm::GetComm());257 229 258 230 /*Loop over each element to compute SMB at vertices*/ … … 267 239 xDelete<IssmDouble>(phi); 268 240 xDelete<IssmDouble>(noiseterms); 269 xDelete<IssmDouble>(covmat);270 241 }/*}}}*/ 271 242 void Delta18oParameterizationx(FemModel* femmodel){/*{{{*/ -
issm/trunk-jpl/src/c/modules/modules.h
r26099 r26526 91 91 #include "./Scotchx/Scotchx.h" 92 92 #include "./Shp2Kmlx/Shp2Kmlx.h" 93 #include "./StochasticForcingx/StochasticForcingx.h" 93 94 #include "./SurfaceMassBalancex/SurfaceMassBalancex.h" 94 95 #include "./Solverx/Solverx.h" -
issm/trunk-jpl/src/c/shared/Enum/Enum.vim
r26495 r26526 182 182 syn keyword cConstant FrontalForcingsBeta0Enum 183 183 syn keyword cConstant FrontalForcingsBeta1Enum 184 syn keyword cConstant FrontalForcingsCovmatEnum185 184 syn keyword cConstant FrontalForcingsNumberofBasinsEnum 186 185 syn keyword cConstant FrontalForcingsParamEnum 187 186 syn keyword cConstant FrontalForcingsPhiEnum 188 syn keyword cConstant FrontalForcingsRandomflagEnum189 187 syn keyword cConstant GrdModelEnum 190 188 syn keyword cConstant GroundinglineFrictionInterpolationEnum … … 399 397 syn keyword cConstant SolidearthSettingsGrdOceanEnum 400 398 syn keyword cConstant SolidearthSettingsOceanAreaScalingEnum 399 syn keyword cConstant StochasticForcingCovarianceEnum 400 syn keyword cConstant StochasticForcingDimensionsEnum 401 syn keyword cConstant StochasticForcingFieldsEnum 402 syn keyword cConstant StochasticForcingIsStochasticForcingEnum 403 syn keyword cConstant StochasticForcingNumFieldsEnum 404 syn keyword cConstant StochasticForcingRandomflagEnum 401 405 syn keyword cConstant RotationalPolarMoiEnum 402 406 syn keyword cConstant SolidearthSettingsReltolEnum … … 424 428 syn keyword cConstant SmbAdThreshEnum 425 429 syn keyword cConstant SmbAutoregressionInitialTimeEnum 430 syn keyword cConstant SmbAutoregressionNoiseEnum 426 431 syn keyword cConstant SmbAutoregressionTimestepEnum 427 432 syn keyword cConstant SmbAutoregressiveOrderEnum … … 429 434 syn keyword cConstant SmbBeta0Enum 430 435 syn keyword cConstant SmbBeta1Enum 431 syn keyword cConstant SmbCovmatEnum432 436 syn keyword cConstant SmbDesfacEnum 433 437 syn keyword cConstant SmbDpermilEnum … … 462 466 syn keyword cConstant SmbPfacEnum 463 467 syn keyword cConstant SmbPhiEnum 464 syn keyword cConstant SmbRandomflagEnum465 468 syn keyword cConstant SmbRdlEnum 466 469 syn keyword cConstant SmbRequestedOutputsEnum … … 498 501 syn keyword cConstant StressbalanceRiftPenaltyThresholdEnum 499 502 syn keyword cConstant StressbalanceShelfDampeningEnum 503 syn keyword cConstant ThermalforcingAutoregressionNoiseEnum 500 504 syn keyword cConstant ThermalIsdrainicecolumnEnum 501 505 syn keyword cConstant ThermalIsdynamicbasalspcEnum -
issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
r26495 r26526 176 176 FrontalForcingsBeta0Enum, 177 177 FrontalForcingsBeta1Enum, 178 FrontalForcingsCovmatEnum,179 178 FrontalForcingsNumberofBasinsEnum, 180 179 FrontalForcingsParamEnum, 181 180 FrontalForcingsPhiEnum, 182 FrontalForcingsRandomflagEnum,183 181 GrdModelEnum, 184 182 GroundinglineFrictionInterpolationEnum, … … 393 391 SolidearthSettingsGrdOceanEnum, 394 392 SolidearthSettingsOceanAreaScalingEnum, 393 StochasticForcingCovarianceEnum, 394 StochasticForcingDimensionsEnum, 395 StochasticForcingFieldsEnum, 396 StochasticForcingIsStochasticForcingEnum, 397 StochasticForcingNumFieldsEnum, 398 StochasticForcingRandomflagEnum, 395 399 RotationalPolarMoiEnum, 396 400 SolidearthSettingsReltolEnum, … … 418 422 SmbAdThreshEnum, 419 423 SmbAutoregressionInitialTimeEnum, 420 SmbAutoregressionTimestepEnum, 424 SmbAutoregressionNoiseEnum, 425 SmbAutoregressionTimestepEnum, 421 426 SmbAutoregressiveOrderEnum, 422 427 SmbAveragingEnum, 423 428 SmbBeta0Enum, 424 429 SmbBeta1Enum, 425 SmbCovmatEnum,426 430 SmbDesfacEnum, 427 431 SmbDpermilEnum, … … 456 460 SmbPfacEnum, 457 461 SmbPhiEnum, 458 SmbRandomflagEnum,459 462 SmbRdlEnum, 460 463 SmbRequestedOutputsEnum, … … 492 495 StressbalanceRiftPenaltyThresholdEnum, 493 496 StressbalanceShelfDampeningEnum, 497 ThermalforcingAutoregressionNoiseEnum, 494 498 ThermalIsdrainicecolumnEnum, 495 499 ThermalIsdynamicbasalspcEnum, -
issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
r26495 r26526 184 184 case FrontalForcingsBeta0Enum : return "FrontalForcingsBeta0"; 185 185 case FrontalForcingsBeta1Enum : return "FrontalForcingsBeta1"; 186 case FrontalForcingsCovmatEnum : return "FrontalForcingsCovmat";187 186 case FrontalForcingsNumberofBasinsEnum : return "FrontalForcingsNumberofBasins"; 188 187 case FrontalForcingsParamEnum : return "FrontalForcingsParam"; 189 188 case FrontalForcingsPhiEnum : return "FrontalForcingsPhi"; 190 case FrontalForcingsRandomflagEnum : return "FrontalForcingsRandomflag";191 189 case GrdModelEnum : return "GrdModel"; 192 190 case GroundinglineFrictionInterpolationEnum : return "GroundinglineFrictionInterpolation"; … … 401 399 case SolidearthSettingsGrdOceanEnum : return "SolidearthSettingsGrdOcean"; 402 400 case SolidearthSettingsOceanAreaScalingEnum : return "SolidearthSettingsOceanAreaScaling"; 401 case StochasticForcingCovarianceEnum : return "StochasticForcingCovariance"; 402 case StochasticForcingDimensionsEnum : return "StochasticForcingDimensions"; 403 case StochasticForcingFieldsEnum : return "StochasticForcingFields"; 404 case StochasticForcingIsStochasticForcingEnum : return "StochasticForcingIsStochasticForcing"; 405 case StochasticForcingNumFieldsEnum : return "StochasticForcingNumFields"; 406 case StochasticForcingRandomflagEnum : return "StochasticForcingRandomflag"; 403 407 case RotationalPolarMoiEnum : return "RotationalPolarMoi"; 404 408 case SolidearthSettingsReltolEnum : return "SolidearthSettingsReltol"; … … 426 430 case SmbAdThreshEnum : return "SmbAdThresh"; 427 431 case SmbAutoregressionInitialTimeEnum : return "SmbAutoregressionInitialTime"; 432 case SmbAutoregressionNoiseEnum : return "SmbAutoregressionNoise"; 428 433 case SmbAutoregressionTimestepEnum : return "SmbAutoregressionTimestep"; 429 434 case SmbAutoregressiveOrderEnum : return "SmbAutoregressiveOrder"; … … 431 436 case SmbBeta0Enum : return "SmbBeta0"; 432 437 case SmbBeta1Enum : return "SmbBeta1"; 433 case SmbCovmatEnum : return "SmbCovmat";434 438 case SmbDesfacEnum : return "SmbDesfac"; 435 439 case SmbDpermilEnum : return "SmbDpermil"; … … 464 468 case SmbPfacEnum : return "SmbPfac"; 465 469 case SmbPhiEnum : return "SmbPhi"; 466 case SmbRandomflagEnum : return "SmbRandomflag";467 470 case SmbRdlEnum : return "SmbRdl"; 468 471 case SmbRequestedOutputsEnum : return "SmbRequestedOutputs"; … … 500 503 case StressbalanceRiftPenaltyThresholdEnum : return "StressbalanceRiftPenaltyThreshold"; 501 504 case StressbalanceShelfDampeningEnum : return "StressbalanceShelfDampening"; 505 case ThermalforcingAutoregressionNoiseEnum : return "ThermalforcingAutoregressionNoise"; 502 506 case ThermalIsdrainicecolumnEnum : return "ThermalIsdrainicecolumn"; 503 507 case ThermalIsdynamicbasalspcEnum : return "ThermalIsdynamicbasalspc"; -
issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
r26495 r26526 187 187 else if (strcmp(name,"FrontalForcingsBeta0")==0) return FrontalForcingsBeta0Enum; 188 188 else if (strcmp(name,"FrontalForcingsBeta1")==0) return FrontalForcingsBeta1Enum; 189 else if (strcmp(name,"FrontalForcingsCovmat")==0) return FrontalForcingsCovmatEnum;190 189 else if (strcmp(name,"FrontalForcingsNumberofBasins")==0) return FrontalForcingsNumberofBasinsEnum; 191 190 else if (strcmp(name,"FrontalForcingsParam")==0) return FrontalForcingsParamEnum; 192 191 else if (strcmp(name,"FrontalForcingsPhi")==0) return FrontalForcingsPhiEnum; 193 else if (strcmp(name,"FrontalForcingsRandomflag")==0) return FrontalForcingsRandomflagEnum;194 192 else if (strcmp(name,"GrdModel")==0) return GrdModelEnum; 195 193 else if (strcmp(name,"GroundinglineFrictionInterpolation")==0) return GroundinglineFrictionInterpolationEnum; … … 260 258 else if (strcmp(name,"InversionNsteps")==0) return InversionNstepsEnum; 261 259 else if (strcmp(name,"InversionNumControlParameters")==0) return InversionNumControlParametersEnum; 260 else if (strcmp(name,"InversionNumCostFunctions")==0) return InversionNumCostFunctionsEnum; 261 else if (strcmp(name,"InversionStepThreshold")==0) return InversionStepThresholdEnum; 262 262 else stage=3; 263 263 } 264 264 if(stage==3){ 265 if (strcmp(name,"InversionNumCostFunctions")==0) return InversionNumCostFunctionsEnum; 266 else if (strcmp(name,"InversionStepThreshold")==0) return InversionStepThresholdEnum; 267 else if (strcmp(name,"InversionType")==0) return InversionTypeEnum; 265 if (strcmp(name,"InversionType")==0) return InversionTypeEnum; 268 266 else if (strcmp(name,"Ivins")==0) return IvinsEnum; 269 267 else if (strcmp(name,"IsSlcCoupling")==0) return IsSlcCouplingEnum; … … 383 381 else if (strcmp(name,"SolidearthSettingsViscous")==0) return SolidearthSettingsViscousEnum; 384 382 else if (strcmp(name,"SealevelchangeGeometryDone")==0) return SealevelchangeGeometryDoneEnum; 383 else if (strcmp(name,"SealevelchangeViscousNumSteps")==0) return SealevelchangeViscousNumStepsEnum; 384 else if (strcmp(name,"SealevelchangeViscousTimes")==0) return SealevelchangeViscousTimesEnum; 385 385 else stage=4; 386 386 } 387 387 if(stage==4){ 388 if (strcmp(name,"SealevelchangeViscousNumSteps")==0) return SealevelchangeViscousNumStepsEnum; 389 else if (strcmp(name,"SealevelchangeViscousTimes")==0) return SealevelchangeViscousTimesEnum; 390 else if (strcmp(name,"SealevelchangeViscousIndex")==0) return SealevelchangeViscousIndexEnum; 388 if (strcmp(name,"SealevelchangeViscousIndex")==0) return SealevelchangeViscousIndexEnum; 391 389 else if (strcmp(name,"RotationalEquatorialMoi")==0) return RotationalEquatorialMoiEnum; 392 390 else if (strcmp(name,"TidalLoveH")==0) return TidalLoveHEnum; … … 410 408 else if (strcmp(name,"SolidearthSettingsGrdOcean")==0) return SolidearthSettingsGrdOceanEnum; 411 409 else if (strcmp(name,"SolidearthSettingsOceanAreaScaling")==0) return SolidearthSettingsOceanAreaScalingEnum; 410 else if (strcmp(name,"StochasticForcingCovariance")==0) return StochasticForcingCovarianceEnum; 411 else if (strcmp(name,"StochasticForcingDimensions")==0) return StochasticForcingDimensionsEnum; 412 else if (strcmp(name,"StochasticForcingFields")==0) return StochasticForcingFieldsEnum; 413 else if (strcmp(name,"StochasticForcingIsStochasticForcing")==0) return StochasticForcingIsStochasticForcingEnum; 414 else if (strcmp(name,"StochasticForcingNumFields")==0) return StochasticForcingNumFieldsEnum; 415 else if (strcmp(name,"StochasticForcingRandomflag")==0) return StochasticForcingRandomflagEnum; 412 416 else if (strcmp(name,"RotationalPolarMoi")==0) return RotationalPolarMoiEnum; 413 417 else if (strcmp(name,"SolidearthSettingsReltol")==0) return SolidearthSettingsReltolEnum; … … 435 439 else if (strcmp(name,"SmbAdThresh")==0) return SmbAdThreshEnum; 436 440 else if (strcmp(name,"SmbAutoregressionInitialTime")==0) return SmbAutoregressionInitialTimeEnum; 441 else if (strcmp(name,"SmbAutoregressionNoise")==0) return SmbAutoregressionNoiseEnum; 437 442 else if (strcmp(name,"SmbAutoregressionTimestep")==0) return SmbAutoregressionTimestepEnum; 438 443 else if (strcmp(name,"SmbAutoregressiveOrder")==0) return SmbAutoregressiveOrderEnum; … … 440 445 else if (strcmp(name,"SmbBeta0")==0) return SmbBeta0Enum; 441 446 else if (strcmp(name,"SmbBeta1")==0) return SmbBeta1Enum; 442 else if (strcmp(name,"SmbCovmat")==0) return SmbCovmatEnum;443 447 else if (strcmp(name,"SmbDesfac")==0) return SmbDesfacEnum; 444 448 else if (strcmp(name,"SmbDpermil")==0) return SmbDpermilEnum; … … 473 477 else if (strcmp(name,"SmbPfac")==0) return SmbPfacEnum; 474 478 else if (strcmp(name,"SmbPhi")==0) return SmbPhiEnum; 475 else if (strcmp(name,"SmbRandomflag")==0) return SmbRandomflagEnum;476 479 else if (strcmp(name,"SmbRdl")==0) return SmbRdlEnum; 477 480 else if (strcmp(name,"SmbRequestedOutputs")==0) return SmbRequestedOutputsEnum; … … 503 506 else if (strcmp(name,"StressbalanceMaxiter")==0) return StressbalanceMaxiterEnum; 504 507 else if (strcmp(name,"StressbalanceNumRequestedOutputs")==0) return StressbalanceNumRequestedOutputsEnum; 505 else if (strcmp(name,"StressbalancePenaltyFactor")==0) return StressbalancePenaltyFactorEnum;506 else if (strcmp(name,"StressbalanceReltol")==0) return StressbalanceReltolEnum;507 else if (strcmp(name,"StressbalanceRequestedOutputs")==0) return StressbalanceRequestedOutputsEnum;508 508 else stage=5; 509 509 } 510 510 if(stage==5){ 511 if (strcmp(name,"StressbalanceRestol")==0) return StressbalanceRestolEnum; 511 if (strcmp(name,"StressbalancePenaltyFactor")==0) return StressbalancePenaltyFactorEnum; 512 else if (strcmp(name,"StressbalanceReltol")==0) return StressbalanceReltolEnum; 513 else if (strcmp(name,"StressbalanceRequestedOutputs")==0) return StressbalanceRequestedOutputsEnum; 514 else if (strcmp(name,"StressbalanceRestol")==0) return StressbalanceRestolEnum; 512 515 else if (strcmp(name,"StressbalanceRiftPenaltyThreshold")==0) return StressbalanceRiftPenaltyThresholdEnum; 513 516 else if (strcmp(name,"StressbalanceShelfDampening")==0) return StressbalanceShelfDampeningEnum; 517 else if (strcmp(name,"ThermalforcingAutoregressionNoise")==0) return ThermalforcingAutoregressionNoiseEnum; 514 518 else if (strcmp(name,"ThermalIsdrainicecolumn")==0) return ThermalIsdrainicecolumnEnum; 515 519 else if (strcmp(name,"ThermalIsdynamicbasalspc")==0) return ThermalIsdynamicbasalspcEnum; … … 625 629 else if (strcmp(name,"CalvingStressThresholdGroundedice")==0) return CalvingStressThresholdGroundediceEnum; 626 630 else if (strcmp(name,"CalvinglevermannCoeff")==0) return CalvinglevermannCoeffEnum; 627 else if (strcmp(name,"CalvingratexAverage")==0) return CalvingratexAverageEnum; 631 else stage=6; 632 } 633 if(stage==6){ 634 if (strcmp(name,"CalvingratexAverage")==0) return CalvingratexAverageEnum; 628 635 else if (strcmp(name,"Calvingratex")==0) return CalvingratexEnum; 629 636 else if (strcmp(name,"CalvingrateyAverage")==0) return CalvingrateyAverageEnum; 630 637 else if (strcmp(name,"Calvingratey")==0) return CalvingrateyEnum; 631 else stage=6; 632 } 633 if(stage==6){ 634 if (strcmp(name,"CalvingFluxLevelset")==0) return CalvingFluxLevelsetEnum; 638 else if (strcmp(name,"CalvingFluxLevelset")==0) return CalvingFluxLevelsetEnum; 635 639 else if (strcmp(name,"CalvingMeltingFluxLevelset")==0) return CalvingMeltingFluxLevelsetEnum; 636 640 else if (strcmp(name,"Converged")==0) return ConvergedEnum; … … 748 752 else if (strcmp(name,"HydrologyTws")==0) return HydrologyTwsEnum; 749 753 else if (strcmp(name,"HydrologyTwsSpc")==0) return HydrologyTwsSpcEnum; 750 else if (strcmp(name,"HydrologyTwsAnalysis")==0) return HydrologyTwsAnalysisEnum; 754 else stage=7; 755 } 756 if(stage==7){ 757 if (strcmp(name,"HydrologyTwsAnalysis")==0) return HydrologyTwsAnalysisEnum; 751 758 else if (strcmp(name,"HydrologyWatercolumnMax")==0) return HydrologyWatercolumnMaxEnum; 752 759 else if (strcmp(name,"HydrologyWaterVx")==0) return HydrologyWaterVxEnum; 753 760 else if (strcmp(name,"HydrologyWaterVy")==0) return HydrologyWaterVyEnum; 754 else stage=7; 755 } 756 if(stage==7){ 757 if (strcmp(name,"Ice")==0) return IceEnum; 761 else if (strcmp(name,"Ice")==0) return IceEnum; 758 762 else if (strcmp(name,"IceMaskNodeActivation")==0) return IceMaskNodeActivationEnum; 759 763 else if (strcmp(name,"Input")==0) return InputEnum; … … 871 875 else if (strcmp(name,"SealevelchangeGE")==0) return SealevelchangeGEEnum; 872 876 else if (strcmp(name,"SealevelchangeGN")==0) return SealevelchangeGNEnum; 873 else if (strcmp(name,"SealevelchangeGsubelOcean")==0) return SealevelchangeGsubelOceanEnum; 877 else stage=8; 878 } 879 if(stage==8){ 880 if (strcmp(name,"SealevelchangeGsubelOcean")==0) return SealevelchangeGsubelOceanEnum; 874 881 else if (strcmp(name,"SealevelchangeGUsubelOcean")==0) return SealevelchangeGUsubelOceanEnum; 875 882 else if (strcmp(name,"SealevelchangeGEsubelOcean")==0) return SealevelchangeGEsubelOceanEnum; 876 883 else if (strcmp(name,"SealevelchangeGNsubelOcean")==0) return SealevelchangeGNsubelOceanEnum; 877 else stage=8; 878 } 879 if(stage==8){ 880 if (strcmp(name,"SealevelchangeGsubelIce")==0) return SealevelchangeGsubelIceEnum; 884 else if (strcmp(name,"SealevelchangeGsubelIce")==0) return SealevelchangeGsubelIceEnum; 881 885 else if (strcmp(name,"SealevelchangeGUsubelIce")==0) return SealevelchangeGUsubelIceEnum; 882 886 else if (strcmp(name,"SealevelchangeGEsubelIce")==0) return SealevelchangeGEsubelIceEnum; … … 994 998 else if (strcmp(name,"SmbTemperaturesPresentday")==0) return SmbTemperaturesPresentdayEnum; 995 999 else if (strcmp(name,"SmbTemperaturesReconstructed")==0) return SmbTemperaturesReconstructedEnum; 996 else if (strcmp(name,"SmbTini")==0) return SmbTiniEnum; 1000 else stage=9; 1001 } 1002 if(stage==9){ 1003 if (strcmp(name,"SmbTini")==0) return SmbTiniEnum; 997 1004 else if (strcmp(name,"SmbTmean")==0) return SmbTmeanEnum; 998 1005 else if (strcmp(name,"SmbTz")==0) return SmbTzEnum; 999 1006 else if (strcmp(name,"SmbValuesAutoregression")==0) return SmbValuesAutoregressionEnum; 1000 else stage=9; 1001 } 1002 if(stage==9){ 1003 if (strcmp(name,"SmbV")==0) return SmbVEnum; 1007 else if (strcmp(name,"SmbV")==0) return SmbVEnum; 1004 1008 else if (strcmp(name,"SmbVmean")==0) return SmbVmeanEnum; 1005 1009 else if (strcmp(name,"SmbVz")==0) return SmbVzEnum; … … 1117 1121 else if (strcmp(name,"Outputdefinition31")==0) return Outputdefinition31Enum; 1118 1122 else if (strcmp(name,"Outputdefinition32")==0) return Outputdefinition32Enum; 1119 else if (strcmp(name,"Outputdefinition33")==0) return Outputdefinition33Enum; 1123 else stage=10; 1124 } 1125 if(stage==10){ 1126 if (strcmp(name,"Outputdefinition33")==0) return Outputdefinition33Enum; 1120 1127 else if (strcmp(name,"Outputdefinition34")==0) return Outputdefinition34Enum; 1121 1128 else if (strcmp(name,"Outputdefinition35")==0) return Outputdefinition35Enum; 1122 1129 else if (strcmp(name,"Outputdefinition36")==0) return Outputdefinition36Enum; 1123 else stage=10; 1124 } 1125 if(stage==10){ 1126 if (strcmp(name,"Outputdefinition37")==0) return Outputdefinition37Enum; 1130 else if (strcmp(name,"Outputdefinition37")==0) return Outputdefinition37Enum; 1127 1131 else if (strcmp(name,"Outputdefinition38")==0) return Outputdefinition38Enum; 1128 1132 else if (strcmp(name,"Outputdefinition39")==0) return Outputdefinition39Enum; … … 1240 1244 else if (strcmp(name,"ChannelDischarge")==0) return ChannelDischargeEnum; 1241 1245 else if (strcmp(name,"Closed")==0) return ClosedEnum; 1242 else if (strcmp(name,"Colinear")==0) return ColinearEnum; 1246 else stage=11; 1247 } 1248 if(stage==11){ 1249 if (strcmp(name,"Colinear")==0) return ColinearEnum; 1243 1250 else if (strcmp(name,"Constraints")==0) return ConstraintsEnum; 1244 1251 else if (strcmp(name,"Contact")==0) return ContactEnum; 1245 1252 else if (strcmp(name,"Contour")==0) return ContourEnum; 1246 else stage=11; 1247 } 1248 if(stage==11){ 1249 if (strcmp(name,"Contours")==0) return ContoursEnum; 1253 else if (strcmp(name,"Contours")==0) return ContoursEnum; 1250 1254 else if (strcmp(name,"ControlInput")==0) return ControlInputEnum; 1251 1255 else if (strcmp(name,"ControlInputGrad")==0) return ControlInputGradEnum; … … 1363 1367 else if (strcmp(name,"MLHOApproximation")==0) return MLHOApproximationEnum; 1364 1368 else if (strcmp(name,"L2ProjectionBaseAnalysis")==0) return L2ProjectionBaseAnalysisEnum; 1365 else if (strcmp(name,"L2ProjectionEPLAnalysis")==0) return L2ProjectionEPLAnalysisEnum; 1369 else stage=12; 1370 } 1371 if(stage==12){ 1372 if (strcmp(name,"L2ProjectionEPLAnalysis")==0) return L2ProjectionEPLAnalysisEnum; 1366 1373 else if (strcmp(name,"LACrouzeixRaviart")==0) return LACrouzeixRaviartEnum; 1367 1374 else if (strcmp(name,"LATaylorHood")==0) return LATaylorHoodEnum; 1368 1375 else if (strcmp(name,"LambdaS")==0) return LambdaSEnum; 1369 else stage=12; 1370 } 1371 if(stage==12){ 1372 if (strcmp(name,"LevelsetAnalysis")==0) return LevelsetAnalysisEnum; 1376 else if (strcmp(name,"LevelsetAnalysis")==0) return LevelsetAnalysisEnum; 1373 1377 else if (strcmp(name,"LevelsetfunctionPicard")==0) return LevelsetfunctionPicardEnum; 1374 1378 else if (strcmp(name,"LinearFloatingMeltRate")==0) return LinearFloatingMeltRateEnum; … … 1486 1490 else if (strcmp(name,"SMBhenning")==0) return SMBhenningEnum; 1487 1491 else if (strcmp(name,"SMBmeltcomponents")==0) return SMBmeltcomponentsEnum; 1488 else if (strcmp(name,"SMBpdd")==0) return SMBpddEnum; 1492 else stage=13; 1493 } 1494 if(stage==13){ 1495 if (strcmp(name,"SMBpdd")==0) return SMBpddEnum; 1489 1496 else if (strcmp(name,"SMBpddSicopolis")==0) return SMBpddSicopolisEnum; 1490 1497 else if (strcmp(name,"SMBsemic")==0) return SMBsemicEnum; 1491 1498 else if (strcmp(name,"SSAApproximation")==0) return SSAApproximationEnum; 1492 else stage=13; 1493 } 1494 if(stage==13){ 1495 if (strcmp(name,"SSAFSApproximation")==0) return SSAFSApproximationEnum; 1499 else if (strcmp(name,"SSAFSApproximation")==0) return SSAFSApproximationEnum; 1496 1500 else if (strcmp(name,"SSAHOApproximation")==0) return SSAHOApproximationEnum; 1497 1501 else if (strcmp(name,"Scaled")==0) return ScaledEnum; -
issm/trunk-jpl/src/m/classes/SMBautoregression.m
r26486 r26526 13 13 ar_timestep = 0; 14 14 phi = NaN; 15 covmat = NaN;16 15 basin_id = NaN; 17 randomflag = 1;18 16 steps_per_step = 1; 19 17 averaging = 0; … … 57 55 disp(' smb.phi (lag coefficients) not specified: order of autoregressive model set to 0'); 58 56 end 59 if isnan(self.covmat)60 self.covmat = 1e-21*eye(self.num_basins); %no stochasticity and no covariance61 disp(' smb.covmat not specified: stochasticity set to 0');62 end63 57 end % }}} 64 58 function self = setdefaultparameters(self) % {{{ 65 59 self.ar_order = 0.0; %autoregression model of order 0 66 self.randomflag = 1;67 60 end % }}} 68 61 function md = checkconsistency(self,md,solution,analyses) … … 77 70 md = checkfield(md,'fieldname','smb.ar_timestep','numel',1,'NaN',1,'Inf',1,'>=',md.timestepping.time_step); %autoregression time step cannot be finer than ISSM timestep 78 71 md = checkfield(md,'fieldname','smb.phi','NaN',1,'Inf',1,'size',[md.smb.num_basins,md.smb.ar_order]); 79 md = checkfield(md,'fieldname','smb.covmat','NaN',1,'Inf',1,'size',[md.smb.num_basins,md.smb.num_basins]);80 md = checkfield(md,'fieldname','smb.randomflag','numel',[1],'values',[0 1]);81 72 end 82 73 md = checkfield(md,'fieldname','smb.steps_per_step','>=',1,'numel',[1]); … … 94 85 fielddisplay(self,'ar_timestep','time resolution of the autoregressive model [yr]'); 95 86 fielddisplay(self,'phi','basin-specific vectors of lag coefficients [unitless]'); 96 fielddisplay(self,'covmat','inter-basin covariance matrix for multivariate normal noise at each time step [m^2 ice eq. yr^(-2)]');97 fielddisplay(self,'randomflag','whether to apply real randomness (true) or pseudo-randomness with fixed seed (false)');98 87 fielddisplay(self, 'steps_per_step', 'number of smb steps per time step'); 99 88 fielddisplay(self, 'averaging', 'averaging methods from short to long steps'); … … 117 106 WriteData(fid,prefix,'object',self,'class','smb','fieldname','beta1','format','DoubleMat','name','md.smb.beta1','scale',1./(yts^2),'yts',yts); 118 107 WriteData(fid,prefix,'object',self,'class','smb','fieldname','phi','format','DoubleMat','name','md.smb.phi','yts',yts); 119 WriteData(fid,prefix,'object',self,'class','smb','fieldname','covmat','format','DoubleMat','name','md.smb.covmat','scale',1./(yts^2),'yts',yts);120 WriteData(fid,prefix,'object',self,'class','smb','fieldname','randomflag','format','Boolean');121 108 WriteData(fid,prefix,'object',self,'fieldname','steps_per_step','format','Integer'); 122 109 WriteData(fid,prefix,'object',self,'fieldname','averaging','format','Integer'); -
issm/trunk-jpl/src/m/classes/frontalforcingsrignotautoregression.m
r26495 r26526 13 13 ar_timestep = 0; 14 14 phi = NaN; 15 covmat = NaN;16 15 basin_id = NaN; 17 randomflag = 1;18 16 subglacial_discharge = NaN; 19 17 end … … 46 44 subglacial_discharge = NaN; 47 45 self.ar_order = 0.0; %autoregression model of order 0 48 self.randomflag = 1;49 46 50 47 end % }}} … … 62 59 md = checkfield(md,'fieldname','frontalforcings.ar_timestep','numel',1,'NaN',1,'Inf',1,'>=',md.timestepping.time_step); %autoregression time step cannot be finer than ISSM timestep 63 60 md = checkfield(md,'fieldname','frontalforcings.phi','NaN',1,'Inf',1,'size',[md.frontalforcings.num_basins,md.frontalforcings.ar_order]); 64 md = checkfield(md,'fieldname','frontalforcings.covmat','NaN',1,'Inf',1,'size',[md.frontalforcings.num_basins,md.frontalforcings.num_basins]);65 md = checkfield(md,'fieldname','frontalforcings.randomflag','numel',[1],'values',[0 1]);66 61 67 62 end % }}} … … 77 72 fielddisplay(self,'ar_timestep','time resolution of the autoregressive model [yr]'); 78 73 fielddisplay(self,'phi','basin-specific vectors of lag coefficients [unitless]'); 79 fielddisplay(self,'covmat','inter-basin covariance matrix for multivariate normal noise at each time step [∘C^2]');80 fielddisplay(self,'randomflag','whether to apply real randomness (true) or pseudo-randomness with fixed seed (false)');81 74 end % }}} 82 75 function marshall(self,prefix,md,fid) % {{{ … … 92 85 WriteData(fid,prefix,'object',self,'class','frontalforcings','fieldname','beta1','format','DoubleMat','name','md.frontalforcings.beta1','scale',1./yts,'yts',md.constants.yts); 93 86 WriteData(fid,prefix,'object',self,'class','frontalforcings','fieldname','phi','format','DoubleMat','name','md.frontalforcings.phi','yts',md.constants.yts); 94 WriteData(fid,prefix,'object',self,'class','frontalforcings','fieldname','covmat','format','DoubleMat','name','md.frontalforcings.covmat');95 WriteData(fid,prefix,'object',self,'class','frontalforcings','fieldname','randomflag','format','Boolean');96 87 end % }}} 97 88 end -
issm/trunk-jpl/src/m/classes/model.m
r26364 r26526 55 55 miscellaneous = 0; 56 56 private = 0; 57 stochasticforcing= 0; 57 58 58 59 %}}} … … 191 192 %2021 February 17 192 193 if isa(md.sampling,'double'); md.sampling=sampling(); end 194 %VV 195 if ~isa(md.stochasticforcing,'stochasticforcing'); md.stochasticforcing=stochasticforcing(); end 193 196 end% }}} 194 197 end … … 250 253 disp(sprintf('%19s: %-22s -- %s','radaroverlay' ,['[1x1 ' class(self.radaroverlay) ']'],'radar image for plot overlay')); 251 254 disp(sprintf('%19s: %-22s -- %s','miscellaneous' ,['[1x1 ' class(self.miscellaneous) ']'],'miscellaneous fields')); 255 disp(sprintf('%19s: %-22s -- %s','stochasticforcing',['[1x1 ' class(self.stochasticforcing) ']'],'stochasticity applied to model forcings')); 252 256 end % }}} 253 257 function md = setdefaultparameters(md,planet) % {{{ … … 297 301 md.miscellaneous = miscellaneous(); 298 302 md.private = private(); 303 md.stochasticforcing= stochasticforcing(); 299 304 end 300 305 %}}} -
issm/trunk-jpl/test/NightlyRun/test257.m
r26495 r26526 45 45 md.smb.ar_timestep = 2.0; %timestep of the autoregressive model [yr] 46 46 md.smb.phi = [[0.2,0.1,0.05,0.01];[0.4,0.2,-0.2,0.1];[0.4,-0.4,0.1,-0.1]]; 47 md.smb.covmat = [[0.15 0.08 -0.02];[0.08 0.12 -0.05];[-0.02 -0.05 0.1]]; 48 md.smb.randomflag = 0; %fixed random seeds 47 48 %Stochastic forcing 49 md.stochasticforcing.isstochasticforcing = 1; 50 md.stochasticforcing.fields = [{'SMBautoregression'}]; 51 md.stochasticforcing.dimensions = [md.smb.num_basins]; %dimension of each field 52 md.stochasticforcing.covariance = [[0.15 0.08 -0.02];[0.08 0.12 -0.05];[-0.02 -0.05 0.1]]; %global covariance among- and between-fields 53 md.stochasticforcing.randomflag = 0; %fixed random seeds 49 54 50 55 md=solve(md,'Transient'); -
issm/trunk-jpl/test/NightlyRun/test543.m
r26495 r26526 35 35 md.frontalforcings.ar_timestep = 2; %timestep of the autoregressive model [yr] 36 36 md.frontalforcings.phi = [[0.1,-0.1,0.01,-0.01];[0.2,-0.2,0.1,0.0]]; %autoregressive parameters 37 md.frontalforcings.covmat = 1e-4*[[1.5,0.5];[0.5,0.4]]; 38 md.frontalforcings.randomflag = 0; 37 38 %Stochastic forcing 39 md.stochasticforcing.isstochasticforcing = 1; 40 md.stochasticforcing.fields = [{'FrontalForcingsRignotAutoregression'}]; 41 md.stochasticforcing.dimensions = [md.frontalforcings.num_basins]; %dimension of each field 42 md.stochasticforcing.covariance = 1e-4*[[1.5,0.5];[0.5,0.4]];; %global covariance among- and between-fields 43 md.stochasticforcing.randomflag = 0; %determines true/false randomness 39 44 40 45 md.transient.ismovingfront = 1;
Note:
See TracChangeset
for help on using the changeset viewer.