Changeset 26604 for issm/trunk-jpl/src
- Timestamp:
- 11/11/21 09:33:47 (3 years ago)
- Location:
- issm/trunk-jpl/src
- Files:
-
- 12 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp
r26548 r26604 12 12 13 13 void LevelsetAnalysis::CreateConstraints(Constraints* constraints,IoModel* iomodel){/*{{{*/ 14 15 /*intermediary: */16 14 int finiteelement; 17 int code,vector_layout;18 IssmDouble *spcdata = NULL;19 int M,N;20 21 /*Get finite element type for this analysis*/22 15 iomodel->FindConstant(&finiteelement,"md.levelset.fe"); 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); 16 IoModelToDynamicConstraintsx(constraints,iomodel,"md.levelset.spclevelset",LevelsetAnalysisEnum,finiteelement); 17 //IoModelToConstraintsx(constraints,iomodel,"md.levelset.spclevelset",LevelsetAnalysisEnum,finiteelement); 47 18 } 48 19 /*}}}*/ … … 83 54 84 55 /*Get moving front parameters*/ 56 bool isstochastic; 85 57 int calvinglaw; 86 58 iomodel->FindConstant(&calvinglaw,"md.calving.law"); 59 iomodel->FindConstant(&isstochastic,"md.stochasticforcing.isstochasticforcing"); 87 60 switch(calvinglaw){ 88 61 case DefaultCalvingEnum: 89 62 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 } 90 67 break; 91 68 case CalvingLevermannEnum: -
issm/trunk-jpl/src/c/classes/Elements/Element.cpp
r26550 r26604 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, IssmDouble* noiseterms,int enum_type){/*{{{*/102 103 104 int basinid,M,N ;105 IssmDouble beta0_basin,beta1_basin,noise _basin;101 void Element::Autoregression(bool isstepforar,int arorder,IssmDouble telapsed_ar,IssmDouble* beta0,IssmDouble* beta1,IssmDouble* phi,bool isfieldstochastic,int enum_type){/*{{{*/ 102 103 const int numvertices = this->GetNumberOfVertices(); 104 int basinid,M,N,arenum_type,basinenum_type,noiseenum_type,outenum_type; 105 IssmDouble beta0_basin,beta1_basin,noiseterm; 106 106 IssmDouble* phi_basin = xNew<IssmDouble>(arorder); 107 107 IssmDouble* varlist = xNew<IssmDouble>(numvertices); 108 108 IssmDouble* valuesautoregression = NULL; 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); 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*/ 113 169 for(int ii=0;ii<arorder;ii++) phi_basin[ii] = phi[basinid*arorder+ii]; 114 170 beta0_basin = beta0[basinid]; 115 171 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);119 172 120 173 /*If not AR model timestep: take the old values of variable*/ … … 131 184 132 185 /*Stochastic variable value*/ 133 varlist[v] = beta0_basin+beta1_basin*telapsed_ar+autoregressionterm+noise _basin;186 varlist[v] = beta0_basin+beta1_basin*telapsed_ar+autoregressionterm+noiseterm; 134 187 } 135 /*Update autoregression TFvalues*/188 /*Update autoregression values*/ 136 189 IssmDouble* temparray = xNew<IssmDouble>(numvertices*arorder); 137 190 /*Assign newest values and shift older values*/ 138 191 for(int i=0;i<numvertices;i++) temparray[i] = varlist[i]; 139 192 for(int i=0;i<(arorder-1)*numvertices;i++) temparray[i+numvertices] = valuesautoregression[i]; 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); 193 this->inputs->SetArrayInput(arenum_type,this->lid,temparray,numvertices*arorder); 142 194 xDelete<IssmDouble>(temparray); 143 195 } 144 196 145 197 /*Add input to element*/ 146 if(enum_type==SMBautoregressionEnum) this->AddInput(SmbMassBalanceEnum,varlist,P1Enum); 147 if(enum_type==FrontalForcingsRignotAutoregressionEnum) this->AddInput(FrontalForcingsThermalForcingEnum,varlist,P1Enum); 198 this->AddInput(outenum_type,varlist,P1Enum); 148 199 149 200 /*Cleanup*/ 150 201 xDelete<IssmDouble>(phi_basin); 151 202 xDelete<IssmDouble>(varlist); 152 xDelete<IssmDouble>(valuesautoregression); 203 xDelete<IssmDouble>(valuesautoregression); 153 204 }/*}}}*/ 154 205 void Element::ComputeLambdaS(){/*{{{*/ … … 3778 3829 IssmDouble teValue=1.0; 3779 3830 IssmDouble aValue=0.0; 3780 IssmDouble dulwrfValue=0.0;3781 3831 IssmDouble szaValue=0.0; 3782 3832 IssmDouble cotValue=0.0; … … 3785 3835 IssmDouble dt,time,smb_dt; 3786 3836 int aIdx=0; 3787 int eIdx=0;3788 3837 int denIdx=0; 3789 3838 int dsnowIdx=0; … … 3815 3864 bool isgraingrowth,isalbedo,isshortwave,isthermal,isaccumulation,ismelt,isdensification,isturbulentflux; 3816 3865 bool isconstrainsurfaceT=false; 3817 bool isdeltaLWup=false;3818 3866 IssmDouble init_scaling=0.0; 3819 3867 IssmDouble thermo_scaling=1.0; 3820 3868 IssmDouble adThresh=1023.0; 3821 IssmDouble teThresh=10;3822 3869 /*}}}*/ 3823 3870 /*Output variables:{{{ */ … … 3869 3916 parameters->FindParam(&smb_dt,SmbDtEnum); /*time period for the smb solution, usually smaller than the glaciological dt*/ 3870 3917 parameters->FindParam(&aIdx,SmbAIdxEnum); 3871 parameters->FindParam(&eIdx,SmbEIdxEnum);3872 3918 parameters->FindParam(&denIdx,SmbDenIdxEnum); 3873 3919 parameters->FindParam(&swIdx,SmbSwIdxEnum); … … 3886 3932 parameters->FindParam(&isturbulentflux,SmbIsturbulentfluxEnum); 3887 3933 parameters->FindParam(&isconstrainsurfaceT,SmbIsconstrainsurfaceTEnum); 3888 parameters->FindParam(&isdeltaLWup,SmbIsdeltaLWupEnum);3889 3934 parameters->FindParam(&init_scaling,SmbInitDensityScalingEnum); 3890 3935 parameters->FindParam(&thermo_scaling,SmbThermoDeltaTScalingEnum); 3891 3936 parameters->FindParam(&adThresh,SmbAdThreshEnum); 3892 parameters->FindParam(&teThresh,SmbTeThreshEnum);3893 3937 /*}}}*/ 3894 3938 /*Retrieve inputs: {{{*/ … … 4080 4124 Input *teValue_input= this->GetInput(SmbTeValueEnum,timeinputs); _assert_(teValue_input); 4081 4125 Input *aValue_input= this->GetInput(SmbAValueEnum,timeinputs); _assert_(aValue_input); 4082 Input *dulwrfValue_input= this->GetInput(SmbDulwrfValueEnum,timeinputs); _assert_(dulwrfValue_input);4083 4126 Input *szaValue_input= this->GetInput(SmbSzaValueEnum,timeinputs); _assert_(szaValue_input); 4084 4127 Input *cotValue_input= this->GetInput(SmbCotValueEnum,timeinputs); _assert_(cotValue_input); … … 4096 4139 pAir_input->GetInputValue(&pAir,gauss); // screen level air pressure [Pa] 4097 4140 teValue_input->GetInputValue(&teValue,gauss); // Emissivity [0-1] 4098 dulwrfValue_input->GetInputValue(&dulwrfValue,gauss); // LWup perturbation [W m-2]4099 4141 aValue_input->GetInputValue(&aValue,gauss); // Albedo [0 1] 4100 4142 szaValue_input->GetInputValue(&szaValue,gauss); // Solar Zenith Angle [degree] … … 4122 4164 } 4123 4165 /*Thermal profile computation:*/ 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);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); 4125 4167 4126 4168 /*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
r26528 r26604 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, IssmDouble* noiseterms,int enum_type);71 void Autoregression(bool isstepforar,int arorder,IssmDouble telapsed_ar,IssmDouble* beta0,IssmDouble* beta1,IssmDouble* phi,bool isfieldstochastic,int enum_type); 72 72 void ComputeLambdaS(void); 73 73 void ComputeNewDamage(); -
issm/trunk-jpl/src/c/modules/FrontalForcingsx/FrontalForcingsx.cpp
r26526 r26604 80 80 /*Load parameters*/ 81 81 bool isstochastic; 82 int M,N,Nphi,arorder,numbasins,my_rank; 82 bool istfstochastic = false; 83 int M,N,Nphi,arorder,numbasins,my_rank; 83 84 femmodel->parameters->FindParam(&numbasins,FrontalForcingsNumberofBasinsEnum); 84 85 femmodel->parameters->FindParam(&arorder,FrontalForcingsAutoregressiveOrderEnum); … … 87 88 IssmDouble* beta1 = NULL; 88 89 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*/97 96 femmodel->parameters->FindParam(&isstochastic,StochasticForcingIsStochasticForcingEnum); 98 97 if(isstochastic){ … … 102 101 femmodel->parameters->FindParam(&stochasticfields,&N,StochasticForcingFieldsEnum); _assert_(N==numstochasticfields); 103 102 for(int i=0;i<numstochasticfields;i++){ 104 if(stochasticfields[i]==FrontalForcingsRignotAutoregressionEnum){ 105 femmodel->parameters->FindParam(&noiseterms,&M,ThermalforcingAutoregressionNoiseEnum); _assert_(M==numbasins); 106 } 103 if(stochasticfields[i]==FrontalForcingsRignotAutoregressionEnum) istfstochastic = true; 107 104 } 105 xDelete<int>(stochasticfields); 108 106 } 109 107 /*Time elapsed with respect to AR model initial time*/ … … 113 111 for(Object* &object:femmodel->elements->objects){ 114 112 Element* element = xDynamicCast<Element*>(object); 115 element->Autoregression(isstepforar,arorder,telapsed_ar,beta0,beta1,phi, noiseterms,FrontalForcingsRignotAutoregressionEnum);113 element->Autoregression(isstepforar,arorder,telapsed_ar,beta0,beta1,phi,istfstochastic,FrontalForcingsRignotAutoregressionEnum); 116 114 } 117 115 … … 120 118 xDelete<IssmDouble>(beta1); 121 119 xDelete<IssmDouble>(phi); 122 xDelete<IssmDouble>(noiseterms);123 120 }/*}}}*/ -
issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp
r26526 r26604 502 502 parameters->FindParam(&isstochasticforcing,StochasticForcingIsStochasticForcingEnum); 503 503 if(isstochasticforcing){ 504 int num_fields ;504 int num_fields,stochastic_dim; 505 505 char** fields; 506 506 parameters->AddObject(iomodel->CopyConstantObject("md.stochasticforcing.num_fields",StochasticForcingNumFieldsEnum)); 507 parameters->AddObject(iomodel->CopyConstantObject("md.stochasticforcing.defaultdimension",StochasticForcingDefaultDimensionEnum)); 507 508 iomodel->FindConstant(&fields,&num_fields,"md.stochasticforcing.fields"); 508 509 if(num_fields<1) _error_("no stochasticforcing fields found"); … … 515 516 parameters->AddObject(new IntVecParam(StochasticForcingFieldsEnum,stochasticforcing_enums,num_fields)); 516 517 xDelete<int>(stochasticforcing_enums); 517 518 parameters->AddObject(iomodel->CopyConstantObject("md.stochasticforcing.randomflag",StochasticForcingRandomflagEnum)); 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
r26527 r26604 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 enum_type;48 int dimenum_type,noiseenum_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 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]; 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]; 59 110 xDelete<IssmDouble>(noisefield); 60 111 } -
issm/trunk-jpl/src/c/modules/SurfaceMassBalancex/SurfaceMassBalancex.cpp
r26526 r26604 197 197 /*Load parameters*/ 198 198 bool isstochastic; 199 bool issmbstochastic = false; 199 200 int M,N,Nphi,arorder,numbasins,my_rank; 200 201 femmodel->parameters->FindParam(&numbasins,SmbNumBasinsEnum); … … 210 211 femmodel->parameters->FindParam(&phi,&M,&Nphi,SmbPhiEnum); _assert_(M==numbasins); _assert_(Nphi==arorder); 211 212 212 /*Retrieve noise terms if stochasticity, otherwise leave noiseterms as 0*/213 IssmDouble* noiseterms = xNewZeroInit<IssmDouble>(numbasins);214 213 femmodel->parameters->FindParam(&isstochastic,StochasticForcingIsStochasticForcingEnum); 215 214 if(isstochastic){ … … 219 218 femmodel->parameters->FindParam(&stochasticfields,&N,StochasticForcingFieldsEnum); _assert_(N==numstochasticfields); 220 219 for(int i=0;i<numstochasticfields;i++){ 221 if(stochasticfields[i]==SMBautoregressionEnum){ 222 femmodel->parameters->FindParam(&noiseterms,&M,SmbAutoregressionNoiseEnum); _assert_(M==numbasins); 223 } 220 if(stochasticfields[i]==SMBautoregressionEnum) issmbstochastic = true; 224 221 } 225 222 xDelete<int>(stochasticfields); … … 231 228 for(Object* &object:femmodel->elements->objects){ 232 229 Element* element = xDynamicCast<Element*>(object); 233 element->Autoregression(isstepforar,arorder,telapsed_ar,beta0,beta1,phi, noiseterms,SMBautoregressionEnum);230 element->Autoregression(isstepforar,arorder,telapsed_ar,beta0,beta1,phi,issmbstochastic,SMBautoregressionEnum); 234 231 } 235 232 … … 238 235 xDelete<IssmDouble>(beta1); 239 236 xDelete<IssmDouble>(phi); 240 xDelete<IssmDouble>(noiseterms);241 237 }/*}}}*/ 242 238 void Delta18oParameterizationx(FemModel* femmodel){/*{{{*/ -
issm/trunk-jpl/src/c/shared/Enum/Enum.vim
r26550 r26604 398 398 syn keyword cConstant SolidearthSettingsOceanAreaScalingEnum 399 399 syn keyword cConstant StochasticForcingCovarianceEnum 400 syn keyword cConstant StochasticForcingDefaultDimensionEnum 400 401 syn keyword cConstant StochasticForcingDimensionsEnum 401 402 syn keyword cConstant StochasticForcingFieldsEnum … … 428 429 syn keyword cConstant SmbAdThreshEnum 429 430 syn keyword cConstant SmbAutoregressionInitialTimeEnum 430 syn keyword cConstant SmbAutoregressionNoiseEnum431 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 ThermalforcingAutoregressionNoiseEnum507 506 syn keyword cConstant ThermalIsdrainicecolumnEnum 508 507 syn keyword cConstant ThermalIsdynamicbasalspcEnum … … 599 598 syn keyword cConstant BasalStressEnum 600 599 syn keyword cConstant BaseEnum 600 syn keyword cConstant BaselineCalvingCalvingrateEnum 601 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 CalvingCalvingrateNoiseEnum 615 616 syn keyword cConstant CalvingHabFractionEnum 616 617 syn keyword cConstant CalvingMeltingrateEnum … … 895 896 syn keyword cConstant SmbAdiffiniEnum 896 897 syn keyword cConstant SmbAiniEnum 898 syn keyword cConstant SmbAutoregressionNoiseEnum 897 899 syn keyword cConstant SmbBasinsIdEnum 898 900 syn keyword cConstant SmbBMaxEnum … … 997 999 syn keyword cConstant SolidearthExternalDisplacementUpRateEnum 998 1000 syn keyword cConstant SolidearthExternalGeoidRateEnum 1001 syn keyword cConstant StochasticForcingDefaultIdEnum 999 1002 syn keyword cConstant StrainRateeffectiveEnum 1000 1003 syn keyword cConstant StrainRateparallelEnum … … 1032 1035 syn keyword cConstant TemperaturePicardEnum 1033 1036 syn keyword cConstant TemperatureSEMICEnum 1037 syn keyword cConstant ThermalforcingAutoregressionNoiseEnum 1034 1038 syn keyword cConstant ThermalforcingValuesAutoregressionEnum 1035 1039 syn keyword cConstant ThermalSpctemperatureEnum -
issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
r26550 r26604 392 392 SolidearthSettingsOceanAreaScalingEnum, 393 393 StochasticForcingCovarianceEnum, 394 StochasticForcingDefaultDimensionEnum, 394 395 StochasticForcingDimensionsEnum, 395 396 StochasticForcingFieldsEnum, … … 422 423 SmbAdThreshEnum, 423 424 SmbAutoregressionInitialTimeEnum, 424 SmbAutoregressionNoiseEnum,425 425 SmbAutoregressionTimestepEnum, 426 426 SmbAutoregressiveOrderEnum, … … 498 498 StressbalanceRiftPenaltyThresholdEnum, 499 499 StressbalanceShelfDampeningEnum, 500 ThermalforcingAutoregressionNoiseEnum,501 500 ThermalIsdrainicecolumnEnum, 502 501 ThermalIsdynamicbasalspcEnum, … … 595 594 BasalStressEnum, 596 595 BaseEnum, 596 BaselineCalvingCalvingrateEnum, 597 597 BaseOldEnum, 598 598 BaseSlopeXEnum, … … 609 609 BottomPressureOldEnum, 610 610 CalvingCalvingrateEnum, 611 CalvingCalvingrateNoiseEnum, 611 612 CalvingHabFractionEnum, 612 613 CalvingMeltingrateEnum, … … 891 892 SmbAdiffiniEnum, 892 893 SmbAiniEnum, 894 SmbAutoregressionNoiseEnum, 893 895 SmbBasinsIdEnum, 894 896 SmbBMaxEnum, … … 994 996 SolidearthExternalDisplacementUpRateEnum, 995 997 SolidearthExternalGeoidRateEnum, 998 StochasticForcingDefaultIdEnum, 996 999 StrainRateeffectiveEnum, 997 1000 StrainRateparallelEnum, … … 1029 1032 TemperaturePicardEnum, 1030 1033 TemperatureSEMICEnum, 1034 ThermalforcingAutoregressionNoiseEnum, 1031 1035 ThermalforcingValuesAutoregressionEnum, 1032 1036 ThermalSpctemperatureEnum, -
issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
r26550 r26604 400 400 case SolidearthSettingsOceanAreaScalingEnum : return "SolidearthSettingsOceanAreaScaling"; 401 401 case StochasticForcingCovarianceEnum : return "StochasticForcingCovariance"; 402 case StochasticForcingDefaultDimensionEnum : return "StochasticForcingDefaultDimension"; 402 403 case StochasticForcingDimensionsEnum : return "StochasticForcingDimensions"; 403 404 case StochasticForcingFieldsEnum : return "StochasticForcingFields"; … … 430 431 case SmbAdThreshEnum : return "SmbAdThresh"; 431 432 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";509 508 case ThermalIsdrainicecolumnEnum : return "ThermalIsdrainicecolumn"; 510 509 case ThermalIsdynamicbasalspcEnum : return "ThermalIsdynamicbasalspc"; … … 601 600 case BasalStressEnum : return "BasalStress"; 602 601 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"; 617 618 case CalvingHabFractionEnum : return "CalvingHabFraction"; 618 619 case CalvingMeltingrateEnum : return "CalvingMeltingrate"; … … 897 898 case SmbAdiffiniEnum : return "SmbAdiffini"; 898 899 case SmbAiniEnum : return "SmbAini"; 900 case SmbAutoregressionNoiseEnum : return "SmbAutoregressionNoise"; 899 901 case SmbBasinsIdEnum : return "SmbBasinsId"; 900 902 case SmbBMaxEnum : return "SmbBMax"; … … 999 1001 case SolidearthExternalDisplacementUpRateEnum : return "SolidearthExternalDisplacementUpRate"; 1000 1002 case SolidearthExternalGeoidRateEnum : return "SolidearthExternalGeoidRate"; 1003 case StochasticForcingDefaultIdEnum : return "StochasticForcingDefaultId"; 1001 1004 case StrainRateeffectiveEnum : return "StrainRateeffective"; 1002 1005 case StrainRateparallelEnum : return "StrainRateparallel"; … … 1034 1037 case TemperaturePicardEnum : return "TemperaturePicard"; 1035 1038 case TemperatureSEMICEnum : return "TemperatureSEMIC"; 1039 case ThermalforcingAutoregressionNoiseEnum : return "ThermalforcingAutoregressionNoise"; 1036 1040 case ThermalforcingValuesAutoregressionEnum : return "ThermalforcingValuesAutoregression"; 1037 1041 case ThermalSpctemperatureEnum : return "ThermalSpctemperature"; -
issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
r26550 r26604 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; 411 412 else if (strcmp(name,"StochasticForcingDimensions")==0) return StochasticForcingDimensionsEnum; 412 413 else if (strcmp(name,"StochasticForcingFields")==0) return StochasticForcingFieldsEnum; … … 439 440 else if (strcmp(name,"SmbAdThresh")==0) return SmbAdThreshEnum; 440 441 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;521 520 else if (strcmp(name,"ThermalIsdrainicecolumn")==0) return ThermalIsdrainicecolumnEnum; 522 521 else if (strcmp(name,"ThermalIsdynamicbasalspc")==0) return ThermalIsdynamicbasalspcEnum; … … 613 612 else if (strcmp(name,"BasalStress")==0) return BasalStressEnum; 614 613 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; 629 630 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,"CalvingStressThresholdFloatingice")==0) return CalvingStressThresholdFloatingiceEnum; 634 if (strcmp(name,"CalvingMeltingrate")==0) return CalvingMeltingrateEnum; 635 else if (strcmp(name,"CalvingStressThresholdFloatingice")==0) return CalvingStressThresholdFloatingiceEnum; 635 636 else if (strcmp(name,"CalvingStressThresholdGroundedice")==0) return CalvingStressThresholdGroundediceEnum; 636 637 else if (strcmp(name,"CalvinglevermannCoeff")==0) return CalvinglevermannCoeffEnum; … … 751 752 else if (strcmp(name,"HydrologyReynolds")==0) return HydrologyReynoldsEnum; 752 753 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,"HydrologySheetThicknessOld")==0) return HydrologySheetThicknessOldEnum; 757 if (strcmp(name,"HydrologySheetThickness")==0) return HydrologySheetThicknessEnum; 758 else if (strcmp(name,"HydrologySheetThicknessOld")==0) return HydrologySheetThicknessOldEnum; 758 759 else if (strcmp(name,"HydrologyTws")==0) return HydrologyTwsEnum; 759 760 else if (strcmp(name,"HydrologyTwsSpc")==0) return HydrologyTwsSpcEnum; … … 874 875 else if (strcmp(name,"SealevelUNorthEsa")==0) return SealevelUNorthEsaEnum; 875 876 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,"SealevelchangeGU")==0) return SealevelchangeGUEnum; 880 if (strcmp(name,"SealevelchangeG")==0) return SealevelchangeGEnum; 881 else if (strcmp(name,"SealevelchangeGU")==0) return SealevelchangeGUEnum; 881 882 else if (strcmp(name,"SealevelchangeGE")==0) return SealevelchangeGEEnum; 882 883 else if (strcmp(name,"SealevelchangeGN")==0) return SealevelchangeGNEnum; … … 918 919 else if (strcmp(name,"SmbAdiffini")==0) return SmbAdiffiniEnum; 919 920 else if (strcmp(name,"SmbAini")==0) return SmbAiniEnum; 921 else if (strcmp(name,"SmbAutoregressionNoise")==0) return SmbAutoregressionNoiseEnum; 920 922 else if (strcmp(name,"SmbBasinsId")==0) return SmbBasinsIdEnum; 921 923 else if (strcmp(name,"SmbBMax")==0) return SmbBMaxEnum; … … 996 998 else if (strcmp(name,"SmbSzaValue")==0) return SmbSzaValueEnum; 997 999 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,"SmbTemperaturesAnomaly")==0) return SmbTemperaturesAnomalyEnum; 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; 1004 1006 else if (strcmp(name,"SmbTemperaturesLgm")==0) return SmbTemperaturesLgmEnum; 1005 1007 else if (strcmp(name,"SmbTemperaturesPresentday")==0) return SmbTemperaturesPresentdayEnum; … … 1023 1025 else if (strcmp(name,"SolidearthExternalDisplacementUpRate")==0) return SolidearthExternalDisplacementUpRateEnum; 1024 1026 else if (strcmp(name,"SolidearthExternalGeoidRate")==0) return SolidearthExternalGeoidRateEnum; 1027 else if (strcmp(name,"StochasticForcingDefaultId")==0) return StochasticForcingDefaultIdEnum; 1025 1028 else if (strcmp(name,"StrainRateeffective")==0) return StrainRateeffectiveEnum; 1026 1029 else if (strcmp(name,"StrainRateparallel")==0) return StrainRateparallelEnum; … … 1058 1061 else if (strcmp(name,"TemperaturePicard")==0) return TemperaturePicardEnum; 1059 1062 else if (strcmp(name,"TemperatureSEMIC")==0) return TemperatureSEMICEnum; 1063 else if (strcmp(name,"ThermalforcingAutoregressionNoise")==0) return ThermalforcingAutoregressionNoiseEnum; 1060 1064 else if (strcmp(name,"ThermalforcingValuesAutoregression")==0) return ThermalforcingValuesAutoregressionEnum; 1061 1065 else if (strcmp(name,"ThermalSpctemperature")==0) return ThermalSpctemperatureEnum; … … 1117 1121 else if (strcmp(name,"Outputdefinition24")==0) return Outputdefinition24Enum; 1118 1122 else if (strcmp(name,"Outputdefinition25")==0) return Outputdefinition25Enum; 1119 else if (strcmp(name,"Outputdefinition26")==0) return Outputdefinition26Enum; 1123 else stage=10; 1124 } 1125 if(stage==10){ 1126 if (strcmp(name,"Outputdefinition26")==0) return Outputdefinition26Enum; 1120 1127 else if (strcmp(name,"Outputdefinition27")==0) return Outputdefinition27Enum; 1121 1128 else if (strcmp(name,"Outputdefinition28")==0) return Outputdefinition28Enum; 1122 1129 else if (strcmp(name,"Outputdefinition29")==0) return Outputdefinition29Enum; 1123 else stage=10; 1124 } 1125 if(stage==10){ 1126 if (strcmp(name,"Outputdefinition2")==0) return Outputdefinition2Enum; 1130 else if (strcmp(name,"Outputdefinition2")==0) return Outputdefinition2Enum; 1127 1131 else if (strcmp(name,"Outputdefinition30")==0) return Outputdefinition30Enum; 1128 1132 else if (strcmp(name,"Outputdefinition31")==0) return Outputdefinition31Enum; … … 1240 1244 else if (strcmp(name,"CalvingVonmises")==0) return CalvingVonmisesEnum; 1241 1245 else if (strcmp(name,"Cfdragcoeffabsgrad")==0) return CfdragcoeffabsgradEnum; 1242 else if (strcmp(name,"Cfsurfacelogvel")==0) return CfsurfacelogvelEnum; 1246 else stage=11; 1247 } 1248 if(stage==11){ 1249 if (strcmp(name,"Cfsurfacelogvel")==0) return CfsurfacelogvelEnum; 1243 1250 else if (strcmp(name,"Cfsurfacesquare")==0) return CfsurfacesquareEnum; 1244 1251 else if (strcmp(name,"Cflevelsetmisfit")==0) return CflevelsetmisfitEnum; 1245 1252 else if (strcmp(name,"Channel")==0) return ChannelEnum; 1246 else stage=11; 1247 } 1248 if(stage==11){ 1249 if (strcmp(name,"ChannelArea")==0) return ChannelAreaEnum; 1253 else if (strcmp(name,"ChannelArea")==0) return ChannelAreaEnum; 1250 1254 else if (strcmp(name,"ChannelAreaOld")==0) return ChannelAreaOldEnum; 1251 1255 else if (strcmp(name,"ChannelDischarge")==0) return ChannelDischargeEnum; … … 1363 1367 else if (strcmp(name,"IntParam")==0) return IntParamEnum; 1364 1368 else if (strcmp(name,"IntVecParam")==0) return IntVecParamEnum; 1365 else if (strcmp(name,"Inputs")==0) return InputsEnum; 1369 else stage=12; 1370 } 1371 if(stage==12){ 1372 if (strcmp(name,"Inputs")==0) return InputsEnum; 1366 1373 else if (strcmp(name,"Internal")==0) return InternalEnum; 1367 1374 else if (strcmp(name,"Intersect")==0) return IntersectEnum; 1368 1375 else if (strcmp(name,"InversionVzObs")==0) return InversionVzObsEnum; 1369 else stage=12; 1370 } 1371 if(stage==12){ 1372 if (strcmp(name,"J")==0) return JEnum; 1376 else if (strcmp(name,"J")==0) return JEnum; 1373 1377 else if (strcmp(name,"L1L2Approximation")==0) return L1L2ApproximationEnum; 1374 1378 else if (strcmp(name,"MLHOApproximation")==0) return MLHOApproximationEnum; … … 1486 1490 else if (strcmp(name,"SMBcomponents")==0) return SMBcomponentsEnum; 1487 1491 else if (strcmp(name,"SMBd18opdd")==0) return SMBd18opddEnum; 1488 else if (strcmp(name,"SMBforcing")==0) return SMBforcingEnum; 1492 else stage=13; 1493 } 1494 if(stage==13){ 1495 if (strcmp(name,"SMBforcing")==0) return SMBforcingEnum; 1489 1496 else if (strcmp(name,"SMBgcm")==0) return SMBgcmEnum; 1490 1497 else if (strcmp(name,"SMBgemb")==0) return SMBgembEnum; 1491 1498 else if (strcmp(name,"SMBgradients")==0) return SMBgradientsEnum; 1492 else stage=13; 1493 } 1494 if(stage==13){ 1495 if (strcmp(name,"SMBgradientscomponents")==0) return SMBgradientscomponentsEnum; 1499 else if (strcmp(name,"SMBgradientscomponents")==0) return SMBgradientscomponentsEnum; 1496 1500 else if (strcmp(name,"SMBgradientsela")==0) return SMBgradientselaEnum; 1497 1501 else if (strcmp(name,"SMBhenning")==0) return SMBhenningEnum; -
issm/trunk-jpl/src/m/classes/stochasticforcing.m
r26553 r26604 8 8 isstochasticforcing = 0; 9 9 fields = NaN; 10 dimensions = NaN; 10 defaultdimension = 0; 11 default_id = NaN; 11 12 covariance = NaN; 12 13 randomflag = 1; … … 34 35 35 36 num_fields = numel(self.fields); 36 size_tot = sum(self.dimensions); 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 37 83 38 84 md = checkfield(md,'fieldname','stochasticforcing.isstochasticforcing','values',[0 1]); 39 85 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 field41 86 md = checkfield(md,'fieldname','stochasticforcing.covariance','NaN',1,'Inf',1,'size',[size_tot,size_tot]); %global covariance matrix 42 87 md = checkfield(md,'fieldname','stochasticforcing.randomflag','numel',[1],'values',[0 1]); 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 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 57 92 end % }}} 58 93 function disp(self) % {{{ … … 60 95 fielddisplay(self,'isstochasticforcing','is stochasticity activated?'); 61 96 fielddisplay(self,'fields','fields with stochasticity applied, ex: {''SMBautoregression''}, or {''FrontalForcingsRignotAutoregression''}'); 62 fielddisplay(self,'dimensions','dimensionality of each field'); 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)'); 63 99 fielddisplay(self,'covariance','covariance matrix for within- and between-fields covariance (units must be squared field units)'); 64 100 fielddisplay(self,'randomflag','whether to apply real randomness (true) or pseudo-randomness with fixed seed (false)'); … … 77 113 return 78 114 else 115 116 %Retrieve dimensionality of each field 117 dimensions = self.defaultdimension*ones(1,num_fields); 118 ind = 1; 119 for field=self.fields 120 %Checking for specific dimensions 121 if(strcmp(field,'SMBautoregression')) 122 dimensions(ind) = md.smb.num_basins; 123 end 124 if(strcmp(field,'FrontalForcingsRignotAutoregression')) 125 dimensions(ind) = md.frontalforcings.num_basins; 126 end 127 ind = ind+1; 128 end 129 79 130 %Scaling covariance matrix (scale column-by-column and row-by-row) 80 scaledfields = {' SMBautoregression'}; %list of fields that need scaling *1/yts131 scaledfields = {'DefaultCalving','SMBautoregression'}; %list of fields that need scaling *1/yts 81 132 tempcovariance = self.covariance; %copy of covariance to avoid writing back in member variable 82 133 for i=1:num_fields 83 134 if any(strcmp(scaledfields,self.fields(i))) 84 inds = [1+sum( self.dimensions(1:i-1)):1:sum(self.dimensions(1:i))];135 inds = [1+sum(dimensions(1:i-1)):1:sum(dimensions(1:i))]; 85 136 for row=inds %scale rows corresponding to scaled field 86 137 tempcovariance(row,:) = 1./yts*tempcovariance(row,:); … … 93 144 WriteData(fid,prefix,'data',num_fields,'name','md.stochasticforcing.num_fields','format','Integer'); 94 145 WriteData(fid,prefix,'object',self,'fieldname','fields','format','StringArray'); 95 WriteData(fid,prefix,'object',self,'fieldname','dimensions','format','IntMat'); 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'); 96 149 WriteData(fid,prefix,'data',tempcovariance,'name','md.stochasticforcing.covariance','format','DoubleMat'); 97 150 WriteData(fid,prefix,'object',self,'fieldname','randomflag','format','Boolean'); … … 105 158 106 159 list = {... 107 'SMBautoregression',... 108 'FrontalForcingsRignotAutoregression' 160 'DefaultCalving',... 161 'FrontalForcingsRignotAutoregression',... 162 'SMBautoregression' 109 163 }; 110 164 end % }}}
Note:
See TracChangeset
for help on using the changeset viewer.