Changeset 26608
- Timestamp:
- 11/11/21 09:56:50 (3 years ago)
- Location:
- issm/trunk-jpl/src
- Files:
-
- 12 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp
r26604 r26608 12 12 13 13 void LevelsetAnalysis::CreateConstraints(Constraints* constraints,IoModel* iomodel){/*{{{*/ 14 15 /*intermediary: */ 14 16 int finiteelement; 17 int code,vector_layout; 18 IssmDouble *spcdata = NULL; 19 int M,N; 20 21 /*Get finite element type for this analysis*/ 15 22 iomodel->FindConstant(&finiteelement,"md.levelset.fe"); 16 IoModelToDynamicConstraintsx(constraints,iomodel,"md.levelset.spclevelset",LevelsetAnalysisEnum,finiteelement); 17 //IoModelToConstraintsx(constraints,iomodel,"md.levelset.spclevelset",LevelsetAnalysisEnum,finiteelement); 23 24 /*First of, find the record for the enum, and get code of data type: */ 25 iomodel->SetFilePointerToData(&code, &vector_layout,"md.levelset.spclevelset"); 26 if(code!=7)_error_("expecting a IssmDouble vector for constraints md.levelset.spclevelset"); 27 if(vector_layout!=1)_error_("expecting a nodal vector for constraints md.levelset.spclevelset"); 28 29 /*Fetch vector:*/ 30 iomodel->FetchData(&spcdata,&M,&N,"md.levelset.spclevelset"); 31 32 /*Call IoModelToConstraintsx*/ 33 if(N>1){ 34 /*If it is a time series, most likely we are forcing the ice front position and do not want to have a Dynamic Constraint*/ 35 _assert_(M==iomodel->numberofvertices+1); 36 IoModelToConstraintsx(constraints,iomodel,spcdata,M,N,LevelsetAnalysisEnum,finiteelement); 37 } 38 else{ 39 /*This is not a time series, we probably have calving on, we need the levelset constraints to update as the levelset moves*/ 40 _assert_(N==1); 41 _assert_(M==iomodel->numberofvertices); 42 IoModelToDynamicConstraintsx(constraints,iomodel,spcdata,M,N,LevelsetAnalysisEnum,finiteelement); 43 } 44 45 /*Clean up*/ 46 xDelete<IssmDouble>(spcdata); 18 47 } 19 48 /*}}}*/ … … 54 83 55 84 /*Get moving front parameters*/ 56 bool isstochastic;57 85 int calvinglaw; 58 86 iomodel->FindConstant(&calvinglaw,"md.calving.law"); 59 iomodel->FindConstant(&isstochastic,"md.stochasticforcing.isstochasticforcing");60 87 switch(calvinglaw){ 61 88 case DefaultCalvingEnum: 62 89 iomodel->FetchDataToInput(inputs,elements,"md.calving.calvingrate",CalvingCalvingrateEnum); 63 if(isstochastic){64 iomodel->FetchDataToInput(inputs,elements,"md.stochasticforcing.default_id",StochasticForcingDefaultIdEnum);65 iomodel->FetchDataToInput(inputs,elements,"md.calving.calvingrate",BaselineCalvingCalvingrateEnum);66 }67 90 break; 68 91 case CalvingLevermannEnum: -
issm/trunk-jpl/src/c/classes/Elements/Element.cpp
r26604 r26608 99 99 xDelete<IssmDouble>(phi_basin); 100 100 }/*}}}*/ 101 void Element::Autoregression(bool isstepforar,int arorder,IssmDouble telapsed_ar,IssmDouble* beta0,IssmDouble* beta1,IssmDouble* phi, bool isfieldstochastic,int enum_type){/*{{{*/102 103 104 int basinid,M,N ,arenum_type,basinenum_type,noiseenum_type,outenum_type;105 IssmDouble beta0_basin,beta1_basin,noise term;101 void Element::Autoregression(bool isstepforar,int arorder,IssmDouble telapsed_ar,IssmDouble* beta0,IssmDouble* beta1,IssmDouble* phi,IssmDouble* noiseterms,int enum_type){/*{{{*/ 102 103 const int numvertices = this->GetNumberOfVertices(); 104 int basinid,M,N; 105 IssmDouble beta0_basin,beta1_basin,noise_basin; 106 106 IssmDouble* phi_basin = xNew<IssmDouble>(arorder); 107 107 IssmDouble* varlist = xNew<IssmDouble>(numvertices); 108 108 IssmDouble* valuesautoregression = NULL; 109 Input* noiseterm_input = NULL; 110 111 /*Get field-specific enums*/ 112 switch(enum_type){ 113 case(SMBautoregressionEnum): 114 arenum_type = SmbValuesAutoregressionEnum; 115 basinenum_type = SmbBasinsIdEnum; 116 noiseenum_type = SmbAutoregressionNoiseEnum; 117 outenum_type = SmbMassBalanceEnum; 118 break; 119 case(FrontalForcingsRignotAutoregressionEnum): 120 arenum_type = ThermalforcingValuesAutoregressionEnum; 121 basinenum_type = FrontalForcingsBasinIdEnum; 122 noiseenum_type = ThermalforcingAutoregressionNoiseEnum; 123 outenum_type = FrontalForcingsThermalForcingEnum; 124 break; 125 } 126 127 /*Get noise and autoregressive terms*/ 128 this->GetInputValue(&basinid,basinenum_type); 129 if(isfieldstochastic){ 130 noiseterm_input = this->GetInput(noiseenum_type); 131 Gauss* gauss = this->NewGauss(); 132 noiseterm_input->GetInputValue(&noiseterm,gauss); 133 delete gauss; 134 } 135 else noiseterm = 0.0; 136 this->inputs->GetArray(arenum_type,this->lid,&valuesautoregression,&M); 137 138 139 /* 140 this->GetInputValue(&basinid,SmbBasinsIdEnum); 141 if(isfieldstochastic){ 142 noiseterm_input = this->GetInput(SmbAutoregressionNoiseEnum); 143 Gauss* gauss = this->NewGauss(); 144 noiseterm_input->GetInputValue(&noiseterm,gauss); 145 delete gauss; 146 } 147 else noiseterm = 0.0; 148 this->inputs->GetArray(SmbValuesAutoregressionEnum,this->lid,&valuesautoregression,&M); 149 arenum_type = SmbValuesAutoregressionEnum; 150 outenum_type = SmbMassBalanceEnum; 151 break; 152 case(FrontalForcingsRignotAutoregressionEnum): 153 this->GetInputValue(&basinid,FrontalForcingsBasinIdEnum); 154 if(isfieldstochastic){ 155 noiseterm_input = this->GetInput(ThermalforcingAutoregressionNoiseEnum); 156 Gauss* gauss = this->NewGauss(); 157 noiseterm_input->GetInputValue(&noiseterm,gauss); 158 delete gauss; 159 } 160 else noiseterm = 0.0; 161 this->inputs->GetArray(ThermalforcingValuesAutoregressionEnum,this->lid,&valuesautoregression,&M); 162 arenum_type = ThermalforcingValuesAutoregressionEnum; 163 outenum_type = FrontalForcingsThermalForcingEnum; 164 break; 165 } 166 */ 167 168 /*Get basin coefficients*/ 109 110 /*Get Basin ID and Basin coefficients*/ 111 if(enum_type==SMBautoregressionEnum) this->GetInputValue(&basinid,SmbBasinsIdEnum); 112 if(enum_type==FrontalForcingsRignotAutoregressionEnum) this->GetInputValue(&basinid,FrontalForcingsBasinIdEnum); 169 113 for(int ii=0;ii<arorder;ii++) phi_basin[ii] = phi[basinid*arorder+ii]; 170 114 beta0_basin = beta0[basinid]; 171 115 beta1_basin = beta1[basinid]; 116 noise_basin = noiseterms[basinid]; 117 if(enum_type==SMBautoregressionEnum) this->inputs->GetArray(SmbValuesAutoregressionEnum,this->lid,&valuesautoregression,&M); 118 if(enum_type==FrontalForcingsRignotAutoregressionEnum) this->inputs->GetArray(ThermalforcingValuesAutoregressionEnum,this->lid,&valuesautoregression,&M); 172 119 173 120 /*If not AR model timestep: take the old values of variable*/ … … 184 131 185 132 /*Stochastic variable value*/ 186 varlist[v] = beta0_basin+beta1_basin*telapsed_ar+autoregressionterm+noise term;133 varlist[v] = beta0_basin+beta1_basin*telapsed_ar+autoregressionterm+noise_basin; 187 134 } 188 /*Update autoregression values*/135 /*Update autoregression TF values*/ 189 136 IssmDouble* temparray = xNew<IssmDouble>(numvertices*arorder); 190 137 /*Assign newest values and shift older values*/ 191 138 for(int i=0;i<numvertices;i++) temparray[i] = varlist[i]; 192 139 for(int i=0;i<(arorder-1)*numvertices;i++) temparray[i+numvertices] = valuesautoregression[i]; 193 this->inputs->SetArrayInput(arenum_type,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); 194 142 xDelete<IssmDouble>(temparray); 195 143 } 196 144 197 145 /*Add input to element*/ 198 this->AddInput(outenum_type,varlist,P1Enum); 146 if(enum_type==SMBautoregressionEnum) this->AddInput(SmbMassBalanceEnum,varlist,P1Enum); 147 if(enum_type==FrontalForcingsRignotAutoregressionEnum) this->AddInput(FrontalForcingsThermalForcingEnum,varlist,P1Enum); 199 148 200 149 /*Cleanup*/ 201 150 xDelete<IssmDouble>(phi_basin); 202 151 xDelete<IssmDouble>(varlist); 203 xDelete<IssmDouble>(valuesautoregression); 152 xDelete<IssmDouble>(valuesautoregression); 204 153 }/*}}}*/ 205 154 void Element::ComputeLambdaS(){/*{{{*/ … … 3829 3778 IssmDouble teValue=1.0; 3830 3779 IssmDouble aValue=0.0; 3780 IssmDouble dulwrfValue=0.0; 3831 3781 IssmDouble szaValue=0.0; 3832 3782 IssmDouble cotValue=0.0; … … 3835 3785 IssmDouble dt,time,smb_dt; 3836 3786 int aIdx=0; 3787 int eIdx=0; 3837 3788 int denIdx=0; 3838 3789 int dsnowIdx=0; … … 3864 3815 bool isgraingrowth,isalbedo,isshortwave,isthermal,isaccumulation,ismelt,isdensification,isturbulentflux; 3865 3816 bool isconstrainsurfaceT=false; 3817 bool isdeltaLWup=false; 3866 3818 IssmDouble init_scaling=0.0; 3867 3819 IssmDouble thermo_scaling=1.0; 3868 3820 IssmDouble adThresh=1023.0; 3821 IssmDouble teThresh=10; 3869 3822 /*}}}*/ 3870 3823 /*Output variables:{{{ */ … … 3916 3869 parameters->FindParam(&smb_dt,SmbDtEnum); /*time period for the smb solution, usually smaller than the glaciological dt*/ 3917 3870 parameters->FindParam(&aIdx,SmbAIdxEnum); 3871 parameters->FindParam(&eIdx,SmbEIdxEnum); 3918 3872 parameters->FindParam(&denIdx,SmbDenIdxEnum); 3919 3873 parameters->FindParam(&swIdx,SmbSwIdxEnum); … … 3932 3886 parameters->FindParam(&isturbulentflux,SmbIsturbulentfluxEnum); 3933 3887 parameters->FindParam(&isconstrainsurfaceT,SmbIsconstrainsurfaceTEnum); 3888 parameters->FindParam(&isdeltaLWup,SmbIsdeltaLWupEnum); 3934 3889 parameters->FindParam(&init_scaling,SmbInitDensityScalingEnum); 3935 3890 parameters->FindParam(&thermo_scaling,SmbThermoDeltaTScalingEnum); 3936 3891 parameters->FindParam(&adThresh,SmbAdThreshEnum); 3892 parameters->FindParam(&teThresh,SmbTeThreshEnum); 3937 3893 /*}}}*/ 3938 3894 /*Retrieve inputs: {{{*/ … … 4124 4080 Input *teValue_input= this->GetInput(SmbTeValueEnum,timeinputs); _assert_(teValue_input); 4125 4081 Input *aValue_input= this->GetInput(SmbAValueEnum,timeinputs); _assert_(aValue_input); 4082 Input *dulwrfValue_input= this->GetInput(SmbDulwrfValueEnum,timeinputs); _assert_(dulwrfValue_input); 4126 4083 Input *szaValue_input= this->GetInput(SmbSzaValueEnum,timeinputs); _assert_(szaValue_input); 4127 4084 Input *cotValue_input= this->GetInput(SmbCotValueEnum,timeinputs); _assert_(cotValue_input); … … 4139 4096 pAir_input->GetInputValue(&pAir,gauss); // screen level air pressure [Pa] 4140 4097 teValue_input->GetInputValue(&teValue,gauss); // Emissivity [0-1] 4098 dulwrfValue_input->GetInputValue(&dulwrfValue,gauss); // LWup perturbation [W m-2] 4141 4099 aValue_input->GetInputValue(&aValue,gauss); // Albedo [0 1] 4142 4100 szaValue_input->GetInputValue(&szaValue,gauss); // Solar Zenith Angle [degree] … … 4164 4122 } 4165 4123 /*Thermal profile computation:*/ 4166 if(isthermal)thermo(&EC, &T, &ulw, dz, d, swf, dlw, Ta, V, eAir, pAir, teValue, W[0], smb_dt, m, Vz, Tz, thermo_scaling,rho_ice,this->Sid(),isconstrainsurfaceT);4124 if(isthermal)thermo(&EC, &T, &ulw, re, dz, d, swf, dlw, Ta, V, eAir, pAir, eIdx, teValue, dulwrfValue, teThresh, W[0], smb_dt, m, Vz, Tz, thermo_scaling,rho_ice,this->Sid(),isconstrainsurfaceT,isdeltaLWup); 4167 4125 4168 4126 /*Change in thickness of top cell due to evaporation/condensation assuming same density as top cell. -
issm/trunk-jpl/src/c/classes/Elements/Element.h
r26604 r26608 69 69 bool AnyFSet(void); 70 70 void AutoregressionInit(int numbasins,int arorder,int nspin,IssmDouble starttime,IssmDouble tstep_ar,IssmDouble tinit_ar,IssmDouble* beta0,IssmDouble* beta1,IssmDouble* phi,int enum_type); 71 void Autoregression(bool isstepforar,int arorder,IssmDouble telapsed_ar,IssmDouble* beta0,IssmDouble* beta1,IssmDouble* phi, bool isfieldstochastic,int enum_type);71 void Autoregression(bool isstepforar,int arorder,IssmDouble telapsed_ar,IssmDouble* beta0,IssmDouble* beta1,IssmDouble* phi,IssmDouble* noiseterms,int enum_type); 72 72 void ComputeLambdaS(void); 73 73 void ComputeNewDamage(); -
issm/trunk-jpl/src/c/modules/FrontalForcingsx/FrontalForcingsx.cpp
r26604 r26608 80 80 /*Load parameters*/ 81 81 bool isstochastic; 82 bool istfstochastic = false; 83 int M,N,Nphi,arorder,numbasins,my_rank; 82 int M,N,Nphi,arorder,numbasins,my_rank; 84 83 femmodel->parameters->FindParam(&numbasins,FrontalForcingsNumberofBasinsEnum); 85 84 femmodel->parameters->FindParam(&arorder,FrontalForcingsAutoregressiveOrderEnum); … … 88 87 IssmDouble* beta1 = NULL; 89 88 IssmDouble* phi = NULL; 89 IssmDouble* noiseterms = xNewZeroInit<IssmDouble>(numbasins); 90 90 91 91 femmodel->parameters->FindParam(&tinit_ar,FrontalForcingsAutoregressionInitialTimeEnum); … … 94 94 femmodel->parameters->FindParam(&phi,&M,&Nphi,FrontalForcingsPhiEnum); _assert_(M==numbasins); _assert_(Nphi==arorder); 95 95 96 /*Retrieve noise terms if stochasticity, otherwise leave noiseterms as 0*/ 96 97 femmodel->parameters->FindParam(&isstochastic,StochasticForcingIsStochasticForcingEnum); 97 98 if(isstochastic){ … … 101 102 femmodel->parameters->FindParam(&stochasticfields,&N,StochasticForcingFieldsEnum); _assert_(N==numstochasticfields); 102 103 for(int i=0;i<numstochasticfields;i++){ 103 if(stochasticfields[i]==FrontalForcingsRignotAutoregressionEnum) istfstochastic = true; 104 if(stochasticfields[i]==FrontalForcingsRignotAutoregressionEnum){ 105 femmodel->parameters->FindParam(&noiseterms,&M,ThermalforcingAutoregressionNoiseEnum); _assert_(M==numbasins); 106 } 104 107 } 105 xDelete<int>(stochasticfields);106 108 } 107 109 /*Time elapsed with respect to AR model initial time*/ … … 111 113 for(Object* &object:femmodel->elements->objects){ 112 114 Element* element = xDynamicCast<Element*>(object); 113 element->Autoregression(isstepforar,arorder,telapsed_ar,beta0,beta1,phi, istfstochastic,FrontalForcingsRignotAutoregressionEnum);115 element->Autoregression(isstepforar,arorder,telapsed_ar,beta0,beta1,phi,noiseterms,FrontalForcingsRignotAutoregressionEnum); 114 116 } 115 117 … … 118 120 xDelete<IssmDouble>(beta1); 119 121 xDelete<IssmDouble>(phi); 122 xDelete<IssmDouble>(noiseterms); 120 123 }/*}}}*/ -
issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp
r26604 r26608 502 502 parameters->FindParam(&isstochasticforcing,StochasticForcingIsStochasticForcingEnum); 503 503 if(isstochasticforcing){ 504 int num_fields ,stochastic_dim;504 int num_fields; 505 505 char** fields; 506 506 parameters->AddObject(iomodel->CopyConstantObject("md.stochasticforcing.num_fields",StochasticForcingNumFieldsEnum)); 507 parameters->AddObject(iomodel->CopyConstantObject("md.stochasticforcing.defaultdimension",StochasticForcingDefaultDimensionEnum));508 507 iomodel->FindConstant(&fields,&num_fields,"md.stochasticforcing.fields"); 509 508 if(num_fields<1) _error_("no stochasticforcing fields found"); … … 516 515 parameters->AddObject(new IntVecParam(StochasticForcingFieldsEnum,stochasticforcing_enums,num_fields)); 517 516 xDelete<int>(stochasticforcing_enums); 518 parameters->AddObject(iomodel->CopyConstantObject("md.stochasticforcing.randomflag",StochasticForcingRandomflagEnum)); 517 518 parameters->AddObject(iomodel->CopyConstantObject("md.stochasticforcing.randomflag",StochasticForcingRandomflagEnum)); 519 519 iomodel->FetchData(&transparam,&M,&N,"md.stochasticforcing.dimensions"); 520 520 parameters->AddObject(new IntVecParam(StochasticForcingDimensionsEnum,transparam,N)); -
issm/trunk-jpl/src/c/modules/StochasticForcingx/StochasticForcingx.cpp
r26604 r26608 36 36 if(randomflag) fixedseed=-1; 37 37 else fixedseed = reCast<int,IssmDouble>((time-starttime)/dt); 38 38 /*multivariateNormal needs to be passed a NULL pointer to avoid memory leak issues*/ 39 39 IssmDouble* temparray = NULL; 40 40 multivariateNormal(&temparray,dimtot,0.0,covariance,fixedseed); … … 46 46 int i=0; 47 47 for(int j=0;j<numfields;j++){ 48 int dimenum_type,noiseenum_type;48 int enum_type; 49 49 IssmDouble* noisefield = xNew<IssmDouble>(dimensions[j]); 50 50 for(int k=0;k<dimensions[j];k++){ 51 51 noisefield[k]=noiseterms[i+k]; 52 52 } 53 54 int dimensionid; 55 56 /*Deal with the autoregressive models*/ 57 if(fields[j]==SMBautoregressionEnum || fields[j]==FrontalForcingsRignotAutoregressionEnum){ 58 switch(fields[j]){ 59 case SMBautoregressionEnum: 60 dimenum_type = SmbBasinsIdEnum; 61 noiseenum_type = SmbAutoregressionNoiseEnum; 62 break; 63 case FrontalForcingsRignotAutoregressionEnum: 64 dimenum_type = FrontalForcingsBasinIdEnum; 65 noiseenum_type = ThermalforcingAutoregressionNoiseEnum; 66 break; 67 } 68 for(Object* &object:femmodel->elements->objects){ 69 Element* element = xDynamicCast<Element*>(object); 70 int numvertices = element->GetNumberOfVertices(); 71 IssmDouble* noise_element = xNew<IssmDouble>(numvertices); 72 element->GetInputValue(&dimensionid,dimenum_type); 73 for(int i=0;i<numvertices;i++) noise_element[i] = noisefield[dimensionid]; 74 element->AddInput(noiseenum_type,noise_element,P0Enum); 75 xDelete<IssmDouble>(noise_element); 76 } 77 } 78 else{ 79 switch(fields[j]){ 80 case SMBautoregressionEnum: 81 case FrontalForcingsRignotAutoregressionEnum: 82 /*Already done above*/ 83 break; 84 case DefaultCalvingEnum: 85 /*Delete CalvingCalvingrateEnum at previous time step (required if it is transient)*/ 86 femmodel->inputs->DeleteInput(CalvingCalvingrateEnum); 87 for(Object* &object:femmodel->elements->objects){ 88 Element* element = xDynamicCast<Element*>(object); 89 int numvertices = element->GetNumberOfVertices(); 90 IssmDouble baselinecalvingrate; 91 IssmDouble calvingrate_tot[numvertices]; 92 Input* baselinecalvingrate_input = NULL; 93 baselinecalvingrate_input = element->GetInput(BaselineCalvingCalvingrateEnum); _assert_(baselinecalvingrate_input); 94 element->GetInputValue(&dimensionid,StochasticForcingDefaultIdEnum); 95 Gauss* gauss = element->NewGauss(); 96 for(int i=0;i<numvertices;i++){ 97 gauss->GaussVertex(i); 98 baselinecalvingrate_input->GetInputValue(&baselinecalvingrate,gauss); 99 calvingrate_tot[i] = max(0.0,baselinecalvingrate+noisefield[dimensionid]); 100 } 101 element->AddInput(CalvingCalvingrateEnum,&calvingrate_tot[0],P1DGEnum); 102 delete gauss; 103 } 104 break; 105 default: 106 _error_("Field "<<EnumToStringx(fields[j])<<" does not support stochasticity yet."); 107 } 108 } 109 i=i+dimensions[j]; 53 54 if(fields[j]==SMBautoregressionEnum) enum_type = SmbAutoregressionNoiseEnum; 55 else if(fields[j]==FrontalForcingsRignotAutoregressionEnum) enum_type = ThermalforcingAutoregressionNoiseEnum; 56 else _error_("Field "<<EnumToStringx(fields[j])<<" does not support stochasticity yet.\n"); 57 femmodel->parameters->SetParam(noisefield,dimensions[j],enum_type); 58 i=i+dimensions[j]; 110 59 xDelete<IssmDouble>(noisefield); 111 60 } -
issm/trunk-jpl/src/c/modules/SurfaceMassBalancex/SurfaceMassBalancex.cpp
r26604 r26608 197 197 /*Load parameters*/ 198 198 bool isstochastic; 199 bool issmbstochastic = false;200 199 int M,N,Nphi,arorder,numbasins,my_rank; 201 200 femmodel->parameters->FindParam(&numbasins,SmbNumBasinsEnum); … … 211 210 femmodel->parameters->FindParam(&phi,&M,&Nphi,SmbPhiEnum); _assert_(M==numbasins); _assert_(Nphi==arorder); 212 211 212 /*Retrieve noise terms if stochasticity, otherwise leave noiseterms as 0*/ 213 IssmDouble* noiseterms = xNewZeroInit<IssmDouble>(numbasins); 213 214 femmodel->parameters->FindParam(&isstochastic,StochasticForcingIsStochasticForcingEnum); 214 215 if(isstochastic){ … … 218 219 femmodel->parameters->FindParam(&stochasticfields,&N,StochasticForcingFieldsEnum); _assert_(N==numstochasticfields); 219 220 for(int i=0;i<numstochasticfields;i++){ 220 if(stochasticfields[i]==SMBautoregressionEnum) issmbstochastic = true; 221 if(stochasticfields[i]==SMBautoregressionEnum){ 222 femmodel->parameters->FindParam(&noiseterms,&M,SmbAutoregressionNoiseEnum); _assert_(M==numbasins); 223 } 221 224 } 222 225 xDelete<int>(stochasticfields); … … 228 231 for(Object* &object:femmodel->elements->objects){ 229 232 Element* element = xDynamicCast<Element*>(object); 230 element->Autoregression(isstepforar,arorder,telapsed_ar,beta0,beta1,phi, issmbstochastic,SMBautoregressionEnum);233 element->Autoregression(isstepforar,arorder,telapsed_ar,beta0,beta1,phi,noiseterms,SMBautoregressionEnum); 231 234 } 232 235 … … 235 238 xDelete<IssmDouble>(beta1); 236 239 xDelete<IssmDouble>(phi); 240 xDelete<IssmDouble>(noiseterms); 237 241 }/*}}}*/ 238 242 void Delta18oParameterizationx(FemModel* femmodel){/*{{{*/ -
issm/trunk-jpl/src/c/shared/Enum/Enum.vim
r26604 r26608 398 398 syn keyword cConstant SolidearthSettingsOceanAreaScalingEnum 399 399 syn keyword cConstant StochasticForcingCovarianceEnum 400 syn keyword cConstant StochasticForcingDefaultDimensionEnum401 400 syn keyword cConstant StochasticForcingDimensionsEnum 402 401 syn keyword cConstant StochasticForcingFieldsEnum … … 429 428 syn keyword cConstant SmbAdThreshEnum 430 429 syn keyword cConstant SmbAutoregressionInitialTimeEnum 430 syn keyword cConstant SmbAutoregressionNoiseEnum 431 431 syn keyword cConstant SmbAutoregressionTimestepEnum 432 432 syn keyword cConstant SmbAutoregressiveOrderEnum … … 504 504 syn keyword cConstant StressbalanceRiftPenaltyThresholdEnum 505 505 syn keyword cConstant StressbalanceShelfDampeningEnum 506 syn keyword cConstant ThermalforcingAutoregressionNoiseEnum 506 507 syn keyword cConstant ThermalIsdrainicecolumnEnum 507 508 syn keyword cConstant ThermalIsdynamicbasalspcEnum … … 598 599 syn keyword cConstant BasalStressEnum 599 600 syn keyword cConstant BaseEnum 600 syn keyword cConstant BaselineCalvingCalvingrateEnum601 601 syn keyword cConstant BaseOldEnum 602 602 syn keyword cConstant BaseSlopeXEnum … … 613 613 syn keyword cConstant BottomPressureOldEnum 614 614 syn keyword cConstant CalvingCalvingrateEnum 615 syn keyword cConstant CalvingCalvingrateNoiseEnum616 615 syn keyword cConstant CalvingHabFractionEnum 617 616 syn keyword cConstant CalvingMeltingrateEnum … … 896 895 syn keyword cConstant SmbAdiffiniEnum 897 896 syn keyword cConstant SmbAiniEnum 898 syn keyword cConstant SmbAutoregressionNoiseEnum899 897 syn keyword cConstant SmbBasinsIdEnum 900 898 syn keyword cConstant SmbBMaxEnum … … 999 997 syn keyword cConstant SolidearthExternalDisplacementUpRateEnum 1000 998 syn keyword cConstant SolidearthExternalGeoidRateEnum 1001 syn keyword cConstant StochasticForcingDefaultIdEnum1002 999 syn keyword cConstant StrainRateeffectiveEnum 1003 1000 syn keyword cConstant StrainRateparallelEnum … … 1035 1032 syn keyword cConstant TemperaturePicardEnum 1036 1033 syn keyword cConstant TemperatureSEMICEnum 1037 syn keyword cConstant ThermalforcingAutoregressionNoiseEnum1038 1034 syn keyword cConstant ThermalforcingValuesAutoregressionEnum 1039 1035 syn keyword cConstant ThermalSpctemperatureEnum -
issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
r26604 r26608 392 392 SolidearthSettingsOceanAreaScalingEnum, 393 393 StochasticForcingCovarianceEnum, 394 StochasticForcingDefaultDimensionEnum,395 394 StochasticForcingDimensionsEnum, 396 395 StochasticForcingFieldsEnum, … … 423 422 SmbAdThreshEnum, 424 423 SmbAutoregressionInitialTimeEnum, 424 SmbAutoregressionNoiseEnum, 425 425 SmbAutoregressionTimestepEnum, 426 426 SmbAutoregressiveOrderEnum, … … 498 498 StressbalanceRiftPenaltyThresholdEnum, 499 499 StressbalanceShelfDampeningEnum, 500 ThermalforcingAutoregressionNoiseEnum, 500 501 ThermalIsdrainicecolumnEnum, 501 502 ThermalIsdynamicbasalspcEnum, … … 594 595 BasalStressEnum, 595 596 BaseEnum, 596 BaselineCalvingCalvingrateEnum,597 597 BaseOldEnum, 598 598 BaseSlopeXEnum, … … 609 609 BottomPressureOldEnum, 610 610 CalvingCalvingrateEnum, 611 CalvingCalvingrateNoiseEnum,612 611 CalvingHabFractionEnum, 613 612 CalvingMeltingrateEnum, … … 892 891 SmbAdiffiniEnum, 893 892 SmbAiniEnum, 894 SmbAutoregressionNoiseEnum,895 893 SmbBasinsIdEnum, 896 894 SmbBMaxEnum, … … 996 994 SolidearthExternalDisplacementUpRateEnum, 997 995 SolidearthExternalGeoidRateEnum, 998 StochasticForcingDefaultIdEnum,999 996 StrainRateeffectiveEnum, 1000 997 StrainRateparallelEnum, … … 1032 1029 TemperaturePicardEnum, 1033 1030 TemperatureSEMICEnum, 1034 ThermalforcingAutoregressionNoiseEnum,1035 1031 ThermalforcingValuesAutoregressionEnum, 1036 1032 ThermalSpctemperatureEnum, -
issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
r26604 r26608 400 400 case SolidearthSettingsOceanAreaScalingEnum : return "SolidearthSettingsOceanAreaScaling"; 401 401 case StochasticForcingCovarianceEnum : return "StochasticForcingCovariance"; 402 case StochasticForcingDefaultDimensionEnum : return "StochasticForcingDefaultDimension";403 402 case StochasticForcingDimensionsEnum : return "StochasticForcingDimensions"; 404 403 case StochasticForcingFieldsEnum : return "StochasticForcingFields"; … … 431 430 case SmbAdThreshEnum : return "SmbAdThresh"; 432 431 case SmbAutoregressionInitialTimeEnum : return "SmbAutoregressionInitialTime"; 432 case SmbAutoregressionNoiseEnum : return "SmbAutoregressionNoise"; 433 433 case SmbAutoregressionTimestepEnum : return "SmbAutoregressionTimestep"; 434 434 case SmbAutoregressiveOrderEnum : return "SmbAutoregressiveOrder"; … … 506 506 case StressbalanceRiftPenaltyThresholdEnum : return "StressbalanceRiftPenaltyThreshold"; 507 507 case StressbalanceShelfDampeningEnum : return "StressbalanceShelfDampening"; 508 case ThermalforcingAutoregressionNoiseEnum : return "ThermalforcingAutoregressionNoise"; 508 509 case ThermalIsdrainicecolumnEnum : return "ThermalIsdrainicecolumn"; 509 510 case ThermalIsdynamicbasalspcEnum : return "ThermalIsdynamicbasalspc"; … … 600 601 case BasalStressEnum : return "BasalStress"; 601 602 case BaseEnum : return "Base"; 602 case BaselineCalvingCalvingrateEnum : return "BaselineCalvingCalvingrate";603 603 case BaseOldEnum : return "BaseOld"; 604 604 case BaseSlopeXEnum : return "BaseSlopeX"; … … 615 615 case BottomPressureOldEnum : return "BottomPressureOld"; 616 616 case CalvingCalvingrateEnum : return "CalvingCalvingrate"; 617 case CalvingCalvingrateNoiseEnum : return "CalvingCalvingrateNoise";618 617 case CalvingHabFractionEnum : return "CalvingHabFraction"; 619 618 case CalvingMeltingrateEnum : return "CalvingMeltingrate"; … … 898 897 case SmbAdiffiniEnum : return "SmbAdiffini"; 899 898 case SmbAiniEnum : return "SmbAini"; 900 case SmbAutoregressionNoiseEnum : return "SmbAutoregressionNoise";901 899 case SmbBasinsIdEnum : return "SmbBasinsId"; 902 900 case SmbBMaxEnum : return "SmbBMax"; … … 1001 999 case SolidearthExternalDisplacementUpRateEnum : return "SolidearthExternalDisplacementUpRate"; 1002 1000 case SolidearthExternalGeoidRateEnum : return "SolidearthExternalGeoidRate"; 1003 case StochasticForcingDefaultIdEnum : return "StochasticForcingDefaultId";1004 1001 case StrainRateeffectiveEnum : return "StrainRateeffective"; 1005 1002 case StrainRateparallelEnum : return "StrainRateparallel"; … … 1037 1034 case TemperaturePicardEnum : return "TemperaturePicard"; 1038 1035 case TemperatureSEMICEnum : return "TemperatureSEMIC"; 1039 case ThermalforcingAutoregressionNoiseEnum : return "ThermalforcingAutoregressionNoise";1040 1036 case ThermalforcingValuesAutoregressionEnum : return "ThermalforcingValuesAutoregression"; 1041 1037 case ThermalSpctemperatureEnum : return "ThermalSpctemperature"; -
issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
r26604 r26608 409 409 else if (strcmp(name,"SolidearthSettingsOceanAreaScaling")==0) return SolidearthSettingsOceanAreaScalingEnum; 410 410 else if (strcmp(name,"StochasticForcingCovariance")==0) return StochasticForcingCovarianceEnum; 411 else if (strcmp(name,"StochasticForcingDefaultDimension")==0) return StochasticForcingDefaultDimensionEnum;412 411 else if (strcmp(name,"StochasticForcingDimensions")==0) return StochasticForcingDimensionsEnum; 413 412 else if (strcmp(name,"StochasticForcingFields")==0) return StochasticForcingFieldsEnum; … … 440 439 else if (strcmp(name,"SmbAdThresh")==0) return SmbAdThreshEnum; 441 440 else if (strcmp(name,"SmbAutoregressionInitialTime")==0) return SmbAutoregressionInitialTimeEnum; 441 else if (strcmp(name,"SmbAutoregressionNoise")==0) return SmbAutoregressionNoiseEnum; 442 442 else if (strcmp(name,"SmbAutoregressionTimestep")==0) return SmbAutoregressionTimestepEnum; 443 443 else if (strcmp(name,"SmbAutoregressiveOrder")==0) return SmbAutoregressiveOrderEnum; … … 518 518 else if (strcmp(name,"StressbalanceRiftPenaltyThreshold")==0) return StressbalanceRiftPenaltyThresholdEnum; 519 519 else if (strcmp(name,"StressbalanceShelfDampening")==0) return StressbalanceShelfDampeningEnum; 520 else if (strcmp(name,"ThermalforcingAutoregressionNoise")==0) return ThermalforcingAutoregressionNoiseEnum; 520 521 else if (strcmp(name,"ThermalIsdrainicecolumn")==0) return ThermalIsdrainicecolumnEnum; 521 522 else if (strcmp(name,"ThermalIsdynamicbasalspc")==0) return ThermalIsdynamicbasalspcEnum; … … 612 613 else if (strcmp(name,"BasalStress")==0) return BasalStressEnum; 613 614 else if (strcmp(name,"Base")==0) return BaseEnum; 614 else if (strcmp(name,"BaselineCalvingCalvingrate")==0) return BaselineCalvingCalvingrateEnum;615 615 else if (strcmp(name,"BaseOld")==0) return BaseOldEnum; 616 616 else if (strcmp(name,"BaseSlopeX")==0) return BaseSlopeXEnum; … … 627 627 else if (strcmp(name,"BottomPressureOld")==0) return BottomPressureOldEnum; 628 628 else if (strcmp(name,"CalvingCalvingrate")==0) return CalvingCalvingrateEnum; 629 else if (strcmp(name,"CalvingCalvingrateNoise")==0) return CalvingCalvingrateNoiseEnum;630 629 else if (strcmp(name,"CalvingHabFraction")==0) return CalvingHabFractionEnum; 630 else if (strcmp(name,"CalvingMeltingrate")==0) return CalvingMeltingrateEnum; 631 631 else stage=6; 632 632 } 633 633 if(stage==6){ 634 if (strcmp(name,"CalvingMeltingrate")==0) return CalvingMeltingrateEnum; 635 else if (strcmp(name,"CalvingStressThresholdFloatingice")==0) return CalvingStressThresholdFloatingiceEnum; 634 if (strcmp(name,"CalvingStressThresholdFloatingice")==0) return CalvingStressThresholdFloatingiceEnum; 636 635 else if (strcmp(name,"CalvingStressThresholdGroundedice")==0) return CalvingStressThresholdGroundediceEnum; 637 636 else if (strcmp(name,"CalvinglevermannCoeff")==0) return CalvinglevermannCoeffEnum; … … 752 751 else if (strcmp(name,"HydrologyReynolds")==0) return HydrologyReynoldsEnum; 753 752 else if (strcmp(name,"HydrologySheetConductivity")==0) return HydrologySheetConductivityEnum; 753 else if (strcmp(name,"HydrologySheetThickness")==0) return HydrologySheetThicknessEnum; 754 754 else stage=7; 755 755 } 756 756 if(stage==7){ 757 if (strcmp(name,"HydrologySheetThickness")==0) return HydrologySheetThicknessEnum; 758 else if (strcmp(name,"HydrologySheetThicknessOld")==0) return HydrologySheetThicknessOldEnum; 757 if (strcmp(name,"HydrologySheetThicknessOld")==0) return HydrologySheetThicknessOldEnum; 759 758 else if (strcmp(name,"HydrologyTws")==0) return HydrologyTwsEnum; 760 759 else if (strcmp(name,"HydrologyTwsSpc")==0) return HydrologyTwsSpcEnum; … … 875 874 else if (strcmp(name,"SealevelUNorthEsa")==0) return SealevelUNorthEsaEnum; 876 875 else if (strcmp(name,"SealevelchangeIndices")==0) return SealevelchangeIndicesEnum; 876 else if (strcmp(name,"SealevelchangeG")==0) return SealevelchangeGEnum; 877 877 else stage=8; 878 878 } 879 879 if(stage==8){ 880 if (strcmp(name,"SealevelchangeG")==0) return SealevelchangeGEnum; 881 else if (strcmp(name,"SealevelchangeGU")==0) return SealevelchangeGUEnum; 880 if (strcmp(name,"SealevelchangeGU")==0) return SealevelchangeGUEnum; 882 881 else if (strcmp(name,"SealevelchangeGE")==0) return SealevelchangeGEEnum; 883 882 else if (strcmp(name,"SealevelchangeGN")==0) return SealevelchangeGNEnum; … … 919 918 else if (strcmp(name,"SmbAdiffini")==0) return SmbAdiffiniEnum; 920 919 else if (strcmp(name,"SmbAini")==0) return SmbAiniEnum; 921 else if (strcmp(name,"SmbAutoregressionNoise")==0) return SmbAutoregressionNoiseEnum;922 920 else if (strcmp(name,"SmbBasinsId")==0) return SmbBasinsIdEnum; 923 921 else if (strcmp(name,"SmbBMax")==0) return SmbBMaxEnum; … … 998 996 else if (strcmp(name,"SmbSzaValue")==0) return SmbSzaValueEnum; 999 997 else if (strcmp(name,"SmbT")==0) return SmbTEnum; 998 else if (strcmp(name,"SmbTa")==0) return SmbTaEnum; 999 else if (strcmp(name,"SmbTeValue")==0) return SmbTeValueEnum; 1000 1000 else stage=9; 1001 1001 } 1002 1002 if(stage==9){ 1003 if (strcmp(name,"SmbTa")==0) return SmbTaEnum; 1004 else if (strcmp(name,"SmbTeValue")==0) return SmbTeValueEnum; 1005 else if (strcmp(name,"SmbTemperaturesAnomaly")==0) return SmbTemperaturesAnomalyEnum; 1003 if (strcmp(name,"SmbTemperaturesAnomaly")==0) return SmbTemperaturesAnomalyEnum; 1006 1004 else if (strcmp(name,"SmbTemperaturesLgm")==0) return SmbTemperaturesLgmEnum; 1007 1005 else if (strcmp(name,"SmbTemperaturesPresentday")==0) return SmbTemperaturesPresentdayEnum; … … 1025 1023 else if (strcmp(name,"SolidearthExternalDisplacementUpRate")==0) return SolidearthExternalDisplacementUpRateEnum; 1026 1024 else if (strcmp(name,"SolidearthExternalGeoidRate")==0) return SolidearthExternalGeoidRateEnum; 1027 else if (strcmp(name,"StochasticForcingDefaultId")==0) return StochasticForcingDefaultIdEnum;1028 1025 else if (strcmp(name,"StrainRateeffective")==0) return StrainRateeffectiveEnum; 1029 1026 else if (strcmp(name,"StrainRateparallel")==0) return StrainRateparallelEnum; … … 1061 1058 else if (strcmp(name,"TemperaturePicard")==0) return TemperaturePicardEnum; 1062 1059 else if (strcmp(name,"TemperatureSEMIC")==0) return TemperatureSEMICEnum; 1063 else if (strcmp(name,"ThermalforcingAutoregressionNoise")==0) return ThermalforcingAutoregressionNoiseEnum;1064 1060 else if (strcmp(name,"ThermalforcingValuesAutoregression")==0) return ThermalforcingValuesAutoregressionEnum; 1065 1061 else if (strcmp(name,"ThermalSpctemperature")==0) return ThermalSpctemperatureEnum; … … 1121 1117 else if (strcmp(name,"Outputdefinition24")==0) return Outputdefinition24Enum; 1122 1118 else if (strcmp(name,"Outputdefinition25")==0) return Outputdefinition25Enum; 1119 else if (strcmp(name,"Outputdefinition26")==0) return Outputdefinition26Enum; 1120 else if (strcmp(name,"Outputdefinition27")==0) return Outputdefinition27Enum; 1121 else if (strcmp(name,"Outputdefinition28")==0) return Outputdefinition28Enum; 1122 else if (strcmp(name,"Outputdefinition29")==0) return Outputdefinition29Enum; 1123 1123 else stage=10; 1124 1124 } 1125 1125 if(stage==10){ 1126 if (strcmp(name,"Outputdefinition26")==0) return Outputdefinition26Enum; 1127 else if (strcmp(name,"Outputdefinition27")==0) return Outputdefinition27Enum; 1128 else if (strcmp(name,"Outputdefinition28")==0) return Outputdefinition28Enum; 1129 else if (strcmp(name,"Outputdefinition29")==0) return Outputdefinition29Enum; 1130 else if (strcmp(name,"Outputdefinition2")==0) return Outputdefinition2Enum; 1126 if (strcmp(name,"Outputdefinition2")==0) return Outputdefinition2Enum; 1131 1127 else if (strcmp(name,"Outputdefinition30")==0) return Outputdefinition30Enum; 1132 1128 else if (strcmp(name,"Outputdefinition31")==0) return Outputdefinition31Enum; … … 1244 1240 else if (strcmp(name,"CalvingVonmises")==0) return CalvingVonmisesEnum; 1245 1241 else if (strcmp(name,"Cfdragcoeffabsgrad")==0) return CfdragcoeffabsgradEnum; 1242 else if (strcmp(name,"Cfsurfacelogvel")==0) return CfsurfacelogvelEnum; 1243 else if (strcmp(name,"Cfsurfacesquare")==0) return CfsurfacesquareEnum; 1244 else if (strcmp(name,"Cflevelsetmisfit")==0) return CflevelsetmisfitEnum; 1245 else if (strcmp(name,"Channel")==0) return ChannelEnum; 1246 1246 else stage=11; 1247 1247 } 1248 1248 if(stage==11){ 1249 if (strcmp(name,"Cfsurfacelogvel")==0) return CfsurfacelogvelEnum; 1250 else if (strcmp(name,"Cfsurfacesquare")==0) return CfsurfacesquareEnum; 1251 else if (strcmp(name,"Cflevelsetmisfit")==0) return CflevelsetmisfitEnum; 1252 else if (strcmp(name,"Channel")==0) return ChannelEnum; 1253 else if (strcmp(name,"ChannelArea")==0) return ChannelAreaEnum; 1249 if (strcmp(name,"ChannelArea")==0) return ChannelAreaEnum; 1254 1250 else if (strcmp(name,"ChannelAreaOld")==0) return ChannelAreaOldEnum; 1255 1251 else if (strcmp(name,"ChannelDischarge")==0) return ChannelDischargeEnum; … … 1367 1363 else if (strcmp(name,"IntParam")==0) return IntParamEnum; 1368 1364 else if (strcmp(name,"IntVecParam")==0) return IntVecParamEnum; 1365 else if (strcmp(name,"Inputs")==0) return InputsEnum; 1366 else if (strcmp(name,"Internal")==0) return InternalEnum; 1367 else if (strcmp(name,"Intersect")==0) return IntersectEnum; 1368 else if (strcmp(name,"InversionVzObs")==0) return InversionVzObsEnum; 1369 1369 else stage=12; 1370 1370 } 1371 1371 if(stage==12){ 1372 if (strcmp(name,"Inputs")==0) return InputsEnum; 1373 else if (strcmp(name,"Internal")==0) return InternalEnum; 1374 else if (strcmp(name,"Intersect")==0) return IntersectEnum; 1375 else if (strcmp(name,"InversionVzObs")==0) return InversionVzObsEnum; 1376 else if (strcmp(name,"J")==0) return JEnum; 1372 if (strcmp(name,"J")==0) return JEnum; 1377 1373 else if (strcmp(name,"L1L2Approximation")==0) return L1L2ApproximationEnum; 1378 1374 else if (strcmp(name,"MLHOApproximation")==0) return MLHOApproximationEnum; … … 1490 1486 else if (strcmp(name,"SMBcomponents")==0) return SMBcomponentsEnum; 1491 1487 else if (strcmp(name,"SMBd18opdd")==0) return SMBd18opddEnum; 1488 else if (strcmp(name,"SMBforcing")==0) return SMBforcingEnum; 1489 else if (strcmp(name,"SMBgcm")==0) return SMBgcmEnum; 1490 else if (strcmp(name,"SMBgemb")==0) return SMBgembEnum; 1491 else if (strcmp(name,"SMBgradients")==0) return SMBgradientsEnum; 1492 1492 else stage=13; 1493 1493 } 1494 1494 if(stage==13){ 1495 if (strcmp(name,"SMBforcing")==0) return SMBforcingEnum; 1496 else if (strcmp(name,"SMBgcm")==0) return SMBgcmEnum; 1497 else if (strcmp(name,"SMBgemb")==0) return SMBgembEnum; 1498 else if (strcmp(name,"SMBgradients")==0) return SMBgradientsEnum; 1499 else if (strcmp(name,"SMBgradientscomponents")==0) return SMBgradientscomponentsEnum; 1495 if (strcmp(name,"SMBgradientscomponents")==0) return SMBgradientscomponentsEnum; 1500 1496 else if (strcmp(name,"SMBgradientsela")==0) return SMBgradientselaEnum; 1501 1497 else if (strcmp(name,"SMBhenning")==0) return SMBhenningEnum; -
issm/trunk-jpl/src/m/classes/stochasticforcing.m
r26604 r26608 8 8 isstochasticforcing = 0; 9 9 fields = NaN; 10 defaultdimension = 0; 11 default_id = NaN; 10 dimensions = NaN; 12 11 covariance = NaN; 13 12 randomflag = 1; … … 35 34 36 35 num_fields = numel(self.fields); 37 38 %Check that covariance matrix is positive definite 39 try 40 chol(self.covariance); 41 catch 42 error('md.stochasticforcing.covariance is not positive definite'); 43 end 44 45 %Check that all fields agree with the corresponding md class and if any field needs the default params 46 checkdefaults = false; %need to check defaults only if one of the field does not have its own dimensionality 47 for field=self.fields 48 %Checking agreement of classes 49 if(contains(field,'SMB')) 50 if~(isequal(class(md.smb),char(field))) 51 error('md.smb does not agree with stochasticforcing field %s', char(field)); 52 end 53 end 54 if(contains(field,'frontalforcings')) 55 if~(isequal(class(md.frontalforcings),char(field))) 56 error('md.frontalforcings does not agree with stochasticforcing field %s', char(field)); 57 end 58 end 59 %Checking for specific dimensions 60 if ~(strcmp(field,'SMBautoregression') || strcmp(field,'FrontalForcingsRignotAutoregression')) 61 checkdefaults = true; %field with non-specific dimensionality 62 end 63 end 64 65 %Retrieve sum of all the field dimensionalities 66 size_tot = self.defaultdimension*num_fields; 67 indSMBar = -1; %about to check for index of SMBautoregression 68 indTFar = -1; %about to check for index of FrontalForcingsRignotAutoregression 69 if any(contains(self.fields,'SMBautoregression')) 70 size_tot = size_tot-self.defaultdimension+md.smb.num_basins; 71 indSMBar = find(contains(self.fields,'SMBautoregression')); %index of SMBar, now check for consistency with TFar timestep (08Nov2021) 72 end 73 if any(contains(self.fields,'FrontalForcingsRignotAutoregression')) 74 size_tot = size_tot-self.defaultdimension+md.frontalforcings.num_basins; 75 indTFar = find(contains(self.fields,'FrontalForcingsRignotAutoregression')); %index of TFar, now check for consistency with SMBar timestep (08Nov2021) 76 end 77 78 if(indSMBar~=-1 && indTFar~=-1) %both autoregressive models are used: check autoregressive time step consistency 79 if((md.smb.ar_timestep~=md.frontalforcings.ar_timestep) && any(self.covariance(1+sum(self.dimensions(1:indSMBar-1)):sum(self.dimensions(1:indSMBar)),1+sum(self.dimensions(1:indTFar-1)):sum(self.dimensions(1:indTFar))))) 80 error('SMBautoregression and FrontalForcingsRignotAutoregression have different ar_timestep and non-zero covariance'); 81 end 82 end 36 size_tot = sum(self.dimensions); 83 37 84 38 md = checkfield(md,'fieldname','stochasticforcing.isstochasticforcing','values',[0 1]); 85 39 md = checkfield(md,'fieldname','stochasticforcing.fields','numel',num_fields,'cell',1,'values',supportedstochforcings()); %VV check here 'cell' (19Oct2021) 40 md = checkfield(md,'fieldname','stochasticforcing.dimensions','NaN',1,'Inf',1,'>',0,'size',[1,num_fields]); %specific dimension for each field 86 41 md = checkfield(md,'fieldname','stochasticforcing.covariance','NaN',1,'Inf',1,'size',[size_tot,size_tot]); %global covariance matrix 87 42 md = checkfield(md,'fieldname','stochasticforcing.randomflag','numel',[1],'values',[0 1]); 88 if(checkdefaults) %need to check the defaults 89 md = checkfield(md,'fieldname','stochasticforcing.defaultdimension','numel',1,'NaN',1,'Inf',1,'>',0); 90 md = checkfield(md,'fieldname','stochasticforcing.default_id','Inf',1,'>=',0,'<=',self.defaultdimension,'size',[md.mesh.numberofelements,1]); 91 end 43 44 %Check that all fields agree with the corresponding md class 45 for field=self.fields 46 if(contains(field,'SMB')) 47 if~(isequal(class(md.smb),char(field))) 48 error('md.smb does not agree with stochasticforcing field %s', char(field)); 49 end 50 end 51 if(contains(field,'frontalforcings')) 52 if~(isequal(class(md.frontalforcings),char(field))) 53 error('md.frontalforcings does not agree with stochasticforcing field %s', char(field)); 54 end 55 end 56 end 92 57 end % }}} 93 58 function disp(self) % {{{ … … 95 60 fielddisplay(self,'isstochasticforcing','is stochasticity activated?'); 96 61 fielddisplay(self,'fields','fields with stochasticity applied, ex: {''SMBautoregression''}, or {''FrontalForcingsRignotAutoregression''}'); 97 fielddisplay(self,'defaultdimension','dimensionality of the noise terms (does not apply to fields with their specific dimension)'); 98 fielddisplay(self,'default_id','id of each element for partitioning of the noise terms (does not apply to fields with their specific partition)'); 62 fielddisplay(self,'dimensions','dimensionality of each field'); 99 63 fielddisplay(self,'covariance','covariance matrix for within- and between-fields covariance (units must be squared field units)'); 100 64 fielddisplay(self,'randomflag','whether to apply real randomness (true) or pseudo-randomness with fixed seed (false)'); … … 113 77 return 114 78 else 115 116 %Retrieve dimensionality of each field117 dimensions = self.defaultdimension*ones(1,num_fields);118 ind = 1;119 for field=self.fields120 %Checking for specific dimensions121 if(strcmp(field,'SMBautoregression'))122 dimensions(ind) = md.smb.num_basins;123 end124 if(strcmp(field,'FrontalForcingsRignotAutoregression'))125 dimensions(ind) = md.frontalforcings.num_basins;126 end127 ind = ind+1;128 end129 130 79 %Scaling covariance matrix (scale column-by-column and row-by-row) 131 scaledfields = {' DefaultCalving','SMBautoregression'}; %list of fields that need scaling *1/yts80 scaledfields = {'SMBautoregression'}; %list of fields that need scaling *1/yts 132 81 tempcovariance = self.covariance; %copy of covariance to avoid writing back in member variable 133 82 for i=1:num_fields 134 83 if any(strcmp(scaledfields,self.fields(i))) 135 inds = [1+sum( dimensions(1:i-1)):1:sum(dimensions(1:i))];84 inds = [1+sum(self.dimensions(1:i-1)):1:sum(self.dimensions(1:i))]; 136 85 for row=inds %scale rows corresponding to scaled field 137 86 tempcovariance(row,:) = 1./yts*tempcovariance(row,:); … … 144 93 WriteData(fid,prefix,'data',num_fields,'name','md.stochasticforcing.num_fields','format','Integer'); 145 94 WriteData(fid,prefix,'object',self,'fieldname','fields','format','StringArray'); 146 WriteData(fid,prefix,'data',dimensions,'name','md.stochasticforcing.dimensions','format','IntMat'); 147 WriteData(fid,prefix,'object',self,'fieldname','default_id','data',self.default_id-1,'format','IntMat','mattype',2); %0-indexed 148 WriteData(fid,prefix,'object',self,'fieldname','defaultdimension','format','Integer'); 95 WriteData(fid,prefix,'object',self,'fieldname','dimensions','format','IntMat'); 149 96 WriteData(fid,prefix,'data',tempcovariance,'name','md.stochasticforcing.covariance','format','DoubleMat'); 150 97 WriteData(fid,prefix,'object',self,'fieldname','randomflag','format','Boolean'); … … 158 105 159 106 list = {... 160 'DefaultCalving',... 161 'FrontalForcingsRignotAutoregression',... 162 'SMBautoregression' 107 'SMBautoregression',... 108 'FrontalForcingsRignotAutoregression' 163 109 }; 164 110 end % }}}
Note:
See TracChangeset
for help on using the changeset viewer.