Changeset 26604


Ignore:
Timestamp:
11/11/21 09:33:47 (3 years ago)
Author:
vverjans
Message:

CHG: making stochasticforcing.m more generic, extending stochasticforcing capability to DefaultCalving

Location:
issm/trunk-jpl
Files:
14 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp

    r26548 r26604  
    1212
    1313void LevelsetAnalysis::CreateConstraints(Constraints* constraints,IoModel* iomodel){/*{{{*/
    14        
    15         /*intermediary: */
    1614        int finiteelement;
    17         int         code,vector_layout;
    18         IssmDouble *spcdata = NULL;
    19         int         M,N;
    20 
    21         /*Get finite element type for this analysis*/
    2215        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);
    4718}
    4819/*}}}*/
     
    8354
    8455        /*Get moving front parameters*/
     56        bool isstochastic;
    8557        int  calvinglaw;
    8658        iomodel->FindConstant(&calvinglaw,"md.calving.law");
     59        iomodel->FindConstant(&isstochastic,"md.stochasticforcing.isstochasticforcing");
    8760        switch(calvinglaw){
    8861                case DefaultCalvingEnum:
    8962                        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                        }
    9067                        break;
    9168                case CalvingLevermannEnum:
  • issm/trunk-jpl/src/c/classes/Elements/Element.cpp

    r26550 r26604  
    9999   xDelete<IssmDouble>(phi_basin);     
    100100}/*}}}*/
    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;
     101void       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;
    106106   IssmDouble* phi_basin  = xNew<IssmDouble>(arorder);
    107107   IssmDouble* varlist     = xNew<IssmDouble>(numvertices);
    108108   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*/
    113169   for(int ii=0;ii<arorder;ii++) phi_basin[ii] = phi[basinid*arorder+ii];
    114170   beta0_basin   = beta0[basinid];
    115171   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);
    119172
    120173   /*If not AR model timestep: take the old values of variable*/
     
    131184
    132185         /*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;
    134187      }
    135       /*Update autoregression TF values*/
     188      /*Update autoregression values*/
    136189      IssmDouble* temparray = xNew<IssmDouble>(numvertices*arorder);
    137190      /*Assign newest values and shift older values*/
    138191      for(int i=0;i<numvertices;i++) temparray[i] = varlist[i];
    139192      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);
    142194      xDelete<IssmDouble>(temparray);
    143195   }
    144196
    145197   /*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);
    148199
    149200   /*Cleanup*/
    150201   xDelete<IssmDouble>(phi_basin);
    151202   xDelete<IssmDouble>(varlist);
    152    xDelete<IssmDouble>(valuesautoregression);
     203   xDelete<IssmDouble>(valuesautoregression); 
    153204}/*}}}*/
    154205void       Element::ComputeLambdaS(){/*{{{*/
     
    37783829        IssmDouble teValue=1.0;
    37793830        IssmDouble aValue=0.0;
    3780         IssmDouble dulwrfValue=0.0;
    37813831        IssmDouble szaValue=0.0;
    37823832        IssmDouble cotValue=0.0;
     
    37853835        IssmDouble dt,time,smb_dt;
    37863836        int        aIdx=0;
    3787         int        eIdx=0;
    37883837        int        denIdx=0;
    37893838        int        dsnowIdx=0;
     
    38153864        bool isgraingrowth,isalbedo,isshortwave,isthermal,isaccumulation,ismelt,isdensification,isturbulentflux;
    38163865        bool isconstrainsurfaceT=false;
    3817         bool isdeltaLWup=false;
    38183866        IssmDouble init_scaling=0.0;
    38193867        IssmDouble thermo_scaling=1.0;
    38203868        IssmDouble adThresh=1023.0;
    3821         IssmDouble teThresh=10;
    38223869        /*}}}*/
    38233870        /*Output variables:{{{ */
     
    38693916        parameters->FindParam(&smb_dt,SmbDtEnum);                     /*time period for the smb solution,  usually smaller than the glaciological dt*/
    38703917        parameters->FindParam(&aIdx,SmbAIdxEnum);
    3871         parameters->FindParam(&eIdx,SmbEIdxEnum);
    38723918        parameters->FindParam(&denIdx,SmbDenIdxEnum);
    38733919        parameters->FindParam(&swIdx,SmbSwIdxEnum);
     
    38863932        parameters->FindParam(&isturbulentflux,SmbIsturbulentfluxEnum);
    38873933        parameters->FindParam(&isconstrainsurfaceT,SmbIsconstrainsurfaceTEnum);
    3888         parameters->FindParam(&isdeltaLWup,SmbIsdeltaLWupEnum);
    38893934        parameters->FindParam(&init_scaling,SmbInitDensityScalingEnum);
    38903935        parameters->FindParam(&thermo_scaling,SmbThermoDeltaTScalingEnum);
    38913936        parameters->FindParam(&adThresh,SmbAdThreshEnum);
    3892         parameters->FindParam(&teThresh,SmbTeThreshEnum);
    38933937        /*}}}*/
    38943938        /*Retrieve inputs: {{{*/
     
    40804124        Input *teValue_input= this->GetInput(SmbTeValueEnum,timeinputs); _assert_(teValue_input);
    40814125        Input *aValue_input= this->GetInput(SmbAValueEnum,timeinputs); _assert_(aValue_input);
    4082         Input *dulwrfValue_input= this->GetInput(SmbDulwrfValueEnum,timeinputs); _assert_(dulwrfValue_input);
    40834126        Input *szaValue_input= this->GetInput(SmbSzaValueEnum,timeinputs); _assert_(szaValue_input);
    40844127        Input *cotValue_input= this->GetInput(SmbCotValueEnum,timeinputs); _assert_(cotValue_input);
     
    40964139        pAir_input->GetInputValue(&pAir,gauss);  // screen level air pressure [Pa]
    40974140        teValue_input->GetInputValue(&teValue,gauss);  // Emissivity [0-1]
    4098         dulwrfValue_input->GetInputValue(&dulwrfValue,gauss);  // LWup perturbation [W m-2]
    40994141        aValue_input->GetInputValue(&aValue,gauss);  // Albedo [0 1]
    41004142        szaValue_input->GetInputValue(&szaValue,gauss);  // Solar Zenith Angle [degree]
     
    41224164        }
    41234165        /*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);
    41254167
    41264168        /*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  
    6969                bool               AnyFSet(void);
    7070                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);
    7272                void               ComputeLambdaS(void);
    7373                void               ComputeNewDamage();
  • issm/trunk-jpl/src/c/modules/FrontalForcingsx/FrontalForcingsx.cpp

    r26526 r26604  
    8080   /*Load parameters*/
    8181        bool isstochastic;
    82    int M,N,Nphi,arorder,numbasins,my_rank;
     82   bool istfstochastic = false;
     83        int M,N,Nphi,arorder,numbasins,my_rank;
    8384   femmodel->parameters->FindParam(&numbasins,FrontalForcingsNumberofBasinsEnum);
    8485   femmodel->parameters->FindParam(&arorder,FrontalForcingsAutoregressiveOrderEnum);
     
    8788   IssmDouble* beta1      = NULL;
    8889   IssmDouble* phi        = NULL;
    89    IssmDouble* noiseterms = xNewZeroInit<IssmDouble>(numbasins);
    9090
    9191        femmodel->parameters->FindParam(&tinit_ar,FrontalForcingsAutoregressionInitialTimeEnum);
     
    9494   femmodel->parameters->FindParam(&phi,&M,&Nphi,FrontalForcingsPhiEnum);  _assert_(M==numbasins); _assert_(Nphi==arorder);
    9595
    96         /*Retrieve noise terms if stochasticity, otherwise leave noiseterms as 0*/
    9796        femmodel->parameters->FindParam(&isstochastic,StochasticForcingIsStochasticForcingEnum);
    9897        if(isstochastic){
     
    102101                femmodel->parameters->FindParam(&stochasticfields,&N,StochasticForcingFieldsEnum); _assert_(N==numstochasticfields);
    103102                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;
    107104                }
     105                xDelete<int>(stochasticfields);
    108106        }
    109107   /*Time elapsed with respect to AR model initial time*/
     
    113111   for(Object* &object:femmodel->elements->objects){
    114112      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);
    116114   }
    117115
     
    120118   xDelete<IssmDouble>(beta1);
    121119   xDelete<IssmDouble>(phi);
    122    xDelete<IssmDouble>(noiseterms);
    123120}/*}}}*/
  • issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp

    r26526 r26604  
    502502        parameters->FindParam(&isstochasticforcing,StochasticForcingIsStochasticForcingEnum);
    503503        if(isstochasticforcing){
    504                 int num_fields;
     504                int num_fields,stochastic_dim;
    505505                char** fields;
    506506                parameters->AddObject(iomodel->CopyConstantObject("md.stochasticforcing.num_fields",StochasticForcingNumFieldsEnum));
     507                parameters->AddObject(iomodel->CopyConstantObject("md.stochasticforcing.defaultdimension",StochasticForcingDefaultDimensionEnum));
    507508                iomodel->FindConstant(&fields,&num_fields,"md.stochasticforcing.fields");
    508509                if(num_fields<1) _error_("no stochasticforcing fields found");
     
    515516                parameters->AddObject(new IntVecParam(StochasticForcingFieldsEnum,stochasticforcing_enums,num_fields));
    516517                xDelete<int>(stochasticforcing_enums);
    517 
    518       parameters->AddObject(iomodel->CopyConstantObject("md.stochasticforcing.randomflag",StochasticForcingRandomflagEnum));
     518                parameters->AddObject(iomodel->CopyConstantObject("md.stochasticforcing.randomflag",StochasticForcingRandomflagEnum));
    519519                iomodel->FetchData(&transparam,&M,&N,"md.stochasticforcing.dimensions");
    520520                parameters->AddObject(new IntVecParam(StochasticForcingDimensionsEnum,transparam,N));
  • issm/trunk-jpl/src/c/modules/StochasticForcingx/StochasticForcingx.cpp

    r26527 r26604  
    3636      if(randomflag) fixedseed=-1;
    3737      else fixedseed = reCast<int,IssmDouble>((time-starttime)/dt);
    38       /*multivariateNormal needs to be passed a NULL pointer to avoid memory leak issues*/
     38                /*multivariateNormal needs to be passed a NULL pointer to avoid memory leak issues*/
    3939      IssmDouble* temparray = NULL;
    4040      multivariateNormal(&temparray,dimtot,0.0,covariance,fixedseed);
     
    4646        int i=0;
    4747   for(int j=0;j<numfields;j++){
    48       int enum_type;
     48      int dimenum_type,noiseenum_type;
    4949      IssmDouble* noisefield = xNew<IssmDouble>(dimensions[j]);
    5050      for(int k=0;k<dimensions[j];k++){
    5151         noisefield[k]=noiseterms[i+k];
    5252      }
    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];
    59110      xDelete<IssmDouble>(noisefield);
    60111   }
  • issm/trunk-jpl/src/c/modules/SurfaceMassBalancex/SurfaceMassBalancex.cpp

    r26526 r26604  
    197197        /*Load parameters*/
    198198        bool isstochastic;
     199        bool issmbstochastic = false;
    199200        int M,N,Nphi,arorder,numbasins,my_rank;
    200201        femmodel->parameters->FindParam(&numbasins,SmbNumBasinsEnum);
     
    210211        femmodel->parameters->FindParam(&phi,&M,&Nphi,SmbPhiEnum);  _assert_(M==numbasins); _assert_(Nphi==arorder);
    211212
    212         /*Retrieve noise terms if stochasticity, otherwise leave noiseterms as 0*/
    213    IssmDouble* noiseterms = xNewZeroInit<IssmDouble>(numbasins);
    214213        femmodel->parameters->FindParam(&isstochastic,StochasticForcingIsStochasticForcingEnum);
    215214   if(isstochastic){
     
    219218      femmodel->parameters->FindParam(&stochasticfields,&N,StochasticForcingFieldsEnum); _assert_(N==numstochasticfields);
    220219      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;
    224221                }
    225222                xDelete<int>(stochasticfields);
     
    231228        for(Object* &object:femmodel->elements->objects){
    232229                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);
    234231        }
    235232
     
    238235        xDelete<IssmDouble>(beta1);
    239236        xDelete<IssmDouble>(phi);
    240         xDelete<IssmDouble>(noiseterms);
    241237}/*}}}*/
    242238void Delta18oParameterizationx(FemModel* femmodel){/*{{{*/
  • issm/trunk-jpl/src/c/shared/Enum/Enum.vim

    r26550 r26604  
    398398syn keyword cConstant SolidearthSettingsOceanAreaScalingEnum
    399399syn keyword cConstant StochasticForcingCovarianceEnum
     400syn keyword cConstant StochasticForcingDefaultDimensionEnum
    400401syn keyword cConstant StochasticForcingDimensionsEnum
    401402syn keyword cConstant StochasticForcingFieldsEnum
     
    428429syn keyword cConstant SmbAdThreshEnum
    429430syn keyword cConstant SmbAutoregressionInitialTimeEnum
    430 syn keyword cConstant SmbAutoregressionNoiseEnum
    431431syn keyword cConstant SmbAutoregressionTimestepEnum
    432432syn keyword cConstant SmbAutoregressiveOrderEnum
     
    504504syn keyword cConstant StressbalanceRiftPenaltyThresholdEnum
    505505syn keyword cConstant StressbalanceShelfDampeningEnum
    506 syn keyword cConstant ThermalforcingAutoregressionNoiseEnum
    507506syn keyword cConstant ThermalIsdrainicecolumnEnum
    508507syn keyword cConstant ThermalIsdynamicbasalspcEnum
     
    599598syn keyword cConstant BasalStressEnum
    600599syn keyword cConstant BaseEnum
     600syn keyword cConstant BaselineCalvingCalvingrateEnum
    601601syn keyword cConstant BaseOldEnum
    602602syn keyword cConstant BaseSlopeXEnum
     
    613613syn keyword cConstant BottomPressureOldEnum
    614614syn keyword cConstant CalvingCalvingrateEnum
     615syn keyword cConstant CalvingCalvingrateNoiseEnum
    615616syn keyword cConstant CalvingHabFractionEnum
    616617syn keyword cConstant CalvingMeltingrateEnum
     
    895896syn keyword cConstant SmbAdiffiniEnum
    896897syn keyword cConstant SmbAiniEnum
     898syn keyword cConstant SmbAutoregressionNoiseEnum
    897899syn keyword cConstant SmbBasinsIdEnum
    898900syn keyword cConstant SmbBMaxEnum
     
    997999syn keyword cConstant SolidearthExternalDisplacementUpRateEnum
    9981000syn keyword cConstant SolidearthExternalGeoidRateEnum
     1001syn keyword cConstant StochasticForcingDefaultIdEnum
    9991002syn keyword cConstant StrainRateeffectiveEnum
    10001003syn keyword cConstant StrainRateparallelEnum
     
    10321035syn keyword cConstant TemperaturePicardEnum
    10331036syn keyword cConstant TemperatureSEMICEnum
     1037syn keyword cConstant ThermalforcingAutoregressionNoiseEnum
    10341038syn keyword cConstant ThermalforcingValuesAutoregressionEnum
    10351039syn keyword cConstant ThermalSpctemperatureEnum
  • issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h

    r26550 r26604  
    392392        SolidearthSettingsOceanAreaScalingEnum,
    393393        StochasticForcingCovarianceEnum,
     394        StochasticForcingDefaultDimensionEnum,
    394395        StochasticForcingDimensionsEnum,
    395396        StochasticForcingFieldsEnum,
     
    422423        SmbAdThreshEnum,
    423424        SmbAutoregressionInitialTimeEnum,
    424    SmbAutoregressionNoiseEnum,
    425425        SmbAutoregressionTimestepEnum,
    426426   SmbAutoregressiveOrderEnum,
     
    498498        StressbalanceRiftPenaltyThresholdEnum,
    499499        StressbalanceShelfDampeningEnum,
    500    ThermalforcingAutoregressionNoiseEnum,
    501500        ThermalIsdrainicecolumnEnum,
    502501        ThermalIsdynamicbasalspcEnum,
     
    595594        BasalStressEnum,
    596595        BaseEnum,
     596        BaselineCalvingCalvingrateEnum,
    597597        BaseOldEnum,
    598598        BaseSlopeXEnum,
     
    609609        BottomPressureOldEnum,
    610610        CalvingCalvingrateEnum,
     611        CalvingCalvingrateNoiseEnum,
    611612        CalvingHabFractionEnum,
    612613        CalvingMeltingrateEnum,
     
    891892        SmbAdiffiniEnum,
    892893        SmbAiniEnum,
     894   SmbAutoregressionNoiseEnum,
    893895        SmbBasinsIdEnum,
    894896        SmbBMaxEnum,
     
    994996        SolidearthExternalDisplacementUpRateEnum,
    995997        SolidearthExternalGeoidRateEnum,
     998        StochasticForcingDefaultIdEnum,
    996999        StrainRateeffectiveEnum,
    9971000        StrainRateparallelEnum,
     
    10291032        TemperaturePicardEnum,
    10301033        TemperatureSEMICEnum,
     1034   ThermalforcingAutoregressionNoiseEnum,
    10311035        ThermalforcingValuesAutoregressionEnum,
    10321036        ThermalSpctemperatureEnum,
  • issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp

    r26550 r26604  
    400400                case SolidearthSettingsOceanAreaScalingEnum : return "SolidearthSettingsOceanAreaScaling";
    401401                case StochasticForcingCovarianceEnum : return "StochasticForcingCovariance";
     402                case StochasticForcingDefaultDimensionEnum : return "StochasticForcingDefaultDimension";
    402403                case StochasticForcingDimensionsEnum : return "StochasticForcingDimensions";
    403404                case StochasticForcingFieldsEnum : return "StochasticForcingFields";
     
    430431                case SmbAdThreshEnum : return "SmbAdThresh";
    431432                case SmbAutoregressionInitialTimeEnum : return "SmbAutoregressionInitialTime";
    432                 case SmbAutoregressionNoiseEnum : return "SmbAutoregressionNoise";
    433433                case SmbAutoregressionTimestepEnum : return "SmbAutoregressionTimestep";
    434434                case SmbAutoregressiveOrderEnum : return "SmbAutoregressiveOrder";
     
    506506                case StressbalanceRiftPenaltyThresholdEnum : return "StressbalanceRiftPenaltyThreshold";
    507507                case StressbalanceShelfDampeningEnum : return "StressbalanceShelfDampening";
    508                 case ThermalforcingAutoregressionNoiseEnum : return "ThermalforcingAutoregressionNoise";
    509508                case ThermalIsdrainicecolumnEnum : return "ThermalIsdrainicecolumn";
    510509                case ThermalIsdynamicbasalspcEnum : return "ThermalIsdynamicbasalspc";
     
    601600                case BasalStressEnum : return "BasalStress";
    602601                case BaseEnum : return "Base";
     602                case BaselineCalvingCalvingrateEnum : return "BaselineCalvingCalvingrate";
    603603                case BaseOldEnum : return "BaseOld";
    604604                case BaseSlopeXEnum : return "BaseSlopeX";
     
    615615                case BottomPressureOldEnum : return "BottomPressureOld";
    616616                case CalvingCalvingrateEnum : return "CalvingCalvingrate";
     617                case CalvingCalvingrateNoiseEnum : return "CalvingCalvingrateNoise";
    617618                case CalvingHabFractionEnum : return "CalvingHabFraction";
    618619                case CalvingMeltingrateEnum : return "CalvingMeltingrate";
     
    897898                case SmbAdiffiniEnum : return "SmbAdiffini";
    898899                case SmbAiniEnum : return "SmbAini";
     900                case SmbAutoregressionNoiseEnum : return "SmbAutoregressionNoise";
    899901                case SmbBasinsIdEnum : return "SmbBasinsId";
    900902                case SmbBMaxEnum : return "SmbBMax";
     
    9991001                case SolidearthExternalDisplacementUpRateEnum : return "SolidearthExternalDisplacementUpRate";
    10001002                case SolidearthExternalGeoidRateEnum : return "SolidearthExternalGeoidRate";
     1003                case StochasticForcingDefaultIdEnum : return "StochasticForcingDefaultId";
    10011004                case StrainRateeffectiveEnum : return "StrainRateeffective";
    10021005                case StrainRateparallelEnum : return "StrainRateparallel";
     
    10341037                case TemperaturePicardEnum : return "TemperaturePicard";
    10351038                case TemperatureSEMICEnum : return "TemperatureSEMIC";
     1039                case ThermalforcingAutoregressionNoiseEnum : return "ThermalforcingAutoregressionNoise";
    10361040                case ThermalforcingValuesAutoregressionEnum : return "ThermalforcingValuesAutoregression";
    10371041                case ThermalSpctemperatureEnum : return "ThermalSpctemperature";
  • issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp

    r26550 r26604  
    409409              else if (strcmp(name,"SolidearthSettingsOceanAreaScaling")==0) return SolidearthSettingsOceanAreaScalingEnum;
    410410              else if (strcmp(name,"StochasticForcingCovariance")==0) return StochasticForcingCovarianceEnum;
     411              else if (strcmp(name,"StochasticForcingDefaultDimension")==0) return StochasticForcingDefaultDimensionEnum;
    411412              else if (strcmp(name,"StochasticForcingDimensions")==0) return StochasticForcingDimensionsEnum;
    412413              else if (strcmp(name,"StochasticForcingFields")==0) return StochasticForcingFieldsEnum;
     
    439440              else if (strcmp(name,"SmbAdThresh")==0) return SmbAdThreshEnum;
    440441              else if (strcmp(name,"SmbAutoregressionInitialTime")==0) return SmbAutoregressionInitialTimeEnum;
    441               else if (strcmp(name,"SmbAutoregressionNoise")==0) return SmbAutoregressionNoiseEnum;
    442442              else if (strcmp(name,"SmbAutoregressionTimestep")==0) return SmbAutoregressionTimestepEnum;
    443443              else if (strcmp(name,"SmbAutoregressiveOrder")==0) return SmbAutoregressiveOrderEnum;
     
    518518              else if (strcmp(name,"StressbalanceRiftPenaltyThreshold")==0) return StressbalanceRiftPenaltyThresholdEnum;
    519519              else if (strcmp(name,"StressbalanceShelfDampening")==0) return StressbalanceShelfDampeningEnum;
    520               else if (strcmp(name,"ThermalforcingAutoregressionNoise")==0) return ThermalforcingAutoregressionNoiseEnum;
    521520              else if (strcmp(name,"ThermalIsdrainicecolumn")==0) return ThermalIsdrainicecolumnEnum;
    522521              else if (strcmp(name,"ThermalIsdynamicbasalspc")==0) return ThermalIsdynamicbasalspcEnum;
     
    613612              else if (strcmp(name,"BasalStress")==0) return BasalStressEnum;
    614613              else if (strcmp(name,"Base")==0) return BaseEnum;
     614              else if (strcmp(name,"BaselineCalvingCalvingrate")==0) return BaselineCalvingCalvingrateEnum;
    615615              else if (strcmp(name,"BaseOld")==0) return BaseOldEnum;
    616616              else if (strcmp(name,"BaseSlopeX")==0) return BaseSlopeXEnum;
     
    627627              else if (strcmp(name,"BottomPressureOld")==0) return BottomPressureOldEnum;
    628628              else if (strcmp(name,"CalvingCalvingrate")==0) return CalvingCalvingrateEnum;
     629              else if (strcmp(name,"CalvingCalvingrateNoise")==0) return CalvingCalvingrateNoiseEnum;
    629630              else if (strcmp(name,"CalvingHabFraction")==0) return CalvingHabFractionEnum;
    630               else if (strcmp(name,"CalvingMeltingrate")==0) return CalvingMeltingrateEnum;
    631631         else stage=6;
    632632   }
    633633   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;
    635636              else if (strcmp(name,"CalvingStressThresholdGroundedice")==0) return CalvingStressThresholdGroundediceEnum;
    636637              else if (strcmp(name,"CalvinglevermannCoeff")==0) return CalvinglevermannCoeffEnum;
     
    751752              else if (strcmp(name,"HydrologyReynolds")==0) return HydrologyReynoldsEnum;
    752753              else if (strcmp(name,"HydrologySheetConductivity")==0) return HydrologySheetConductivityEnum;
    753               else if (strcmp(name,"HydrologySheetThickness")==0) return HydrologySheetThicknessEnum;
    754754         else stage=7;
    755755   }
    756756   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;
    758759              else if (strcmp(name,"HydrologyTws")==0) return HydrologyTwsEnum;
    759760              else if (strcmp(name,"HydrologyTwsSpc")==0) return HydrologyTwsSpcEnum;
     
    874875              else if (strcmp(name,"SealevelUNorthEsa")==0) return SealevelUNorthEsaEnum;
    875876              else if (strcmp(name,"SealevelchangeIndices")==0) return SealevelchangeIndicesEnum;
    876               else if (strcmp(name,"SealevelchangeG")==0) return SealevelchangeGEnum;
    877877         else stage=8;
    878878   }
    879879   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;
    881882              else if (strcmp(name,"SealevelchangeGE")==0) return SealevelchangeGEEnum;
    882883              else if (strcmp(name,"SealevelchangeGN")==0) return SealevelchangeGNEnum;
     
    918919              else if (strcmp(name,"SmbAdiffini")==0) return SmbAdiffiniEnum;
    919920              else if (strcmp(name,"SmbAini")==0) return SmbAiniEnum;
     921              else if (strcmp(name,"SmbAutoregressionNoise")==0) return SmbAutoregressionNoiseEnum;
    920922              else if (strcmp(name,"SmbBasinsId")==0) return SmbBasinsIdEnum;
    921923              else if (strcmp(name,"SmbBMax")==0) return SmbBMaxEnum;
     
    996998              else if (strcmp(name,"SmbSzaValue")==0) return SmbSzaValueEnum;
    997999              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;
    10001000         else stage=9;
    10011001   }
    10021002   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;
    10041006              else if (strcmp(name,"SmbTemperaturesLgm")==0) return SmbTemperaturesLgmEnum;
    10051007              else if (strcmp(name,"SmbTemperaturesPresentday")==0) return SmbTemperaturesPresentdayEnum;
     
    10231025              else if (strcmp(name,"SolidearthExternalDisplacementUpRate")==0) return SolidearthExternalDisplacementUpRateEnum;
    10241026              else if (strcmp(name,"SolidearthExternalGeoidRate")==0) return SolidearthExternalGeoidRateEnum;
     1027              else if (strcmp(name,"StochasticForcingDefaultId")==0) return StochasticForcingDefaultIdEnum;
    10251028              else if (strcmp(name,"StrainRateeffective")==0) return StrainRateeffectiveEnum;
    10261029              else if (strcmp(name,"StrainRateparallel")==0) return StrainRateparallelEnum;
     
    10581061              else if (strcmp(name,"TemperaturePicard")==0) return TemperaturePicardEnum;
    10591062              else if (strcmp(name,"TemperatureSEMIC")==0) return TemperatureSEMICEnum;
     1063              else if (strcmp(name,"ThermalforcingAutoregressionNoise")==0) return ThermalforcingAutoregressionNoiseEnum;
    10601064              else if (strcmp(name,"ThermalforcingValuesAutoregression")==0) return ThermalforcingValuesAutoregressionEnum;
    10611065              else if (strcmp(name,"ThermalSpctemperature")==0) return ThermalSpctemperatureEnum;
     
    11171121              else if (strcmp(name,"Outputdefinition24")==0) return Outputdefinition24Enum;
    11181122              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;
    11201127              else if (strcmp(name,"Outputdefinition27")==0) return Outputdefinition27Enum;
    11211128              else if (strcmp(name,"Outputdefinition28")==0) return Outputdefinition28Enum;
    11221129              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;
    11271131              else if (strcmp(name,"Outputdefinition30")==0) return Outputdefinition30Enum;
    11281132              else if (strcmp(name,"Outputdefinition31")==0) return Outputdefinition31Enum;
     
    12401244              else if (strcmp(name,"CalvingVonmises")==0) return CalvingVonmisesEnum;
    12411245              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;
    12431250              else if (strcmp(name,"Cfsurfacesquare")==0) return CfsurfacesquareEnum;
    12441251              else if (strcmp(name,"Cflevelsetmisfit")==0) return CflevelsetmisfitEnum;
    12451252              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;
    12501254              else if (strcmp(name,"ChannelAreaOld")==0) return ChannelAreaOldEnum;
    12511255              else if (strcmp(name,"ChannelDischarge")==0) return ChannelDischargeEnum;
     
    13631367              else if (strcmp(name,"IntParam")==0) return IntParamEnum;
    13641368              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;
    13661373              else if (strcmp(name,"Internal")==0) return InternalEnum;
    13671374              else if (strcmp(name,"Intersect")==0) return IntersectEnum;
    13681375              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;
    13731377              else if (strcmp(name,"L1L2Approximation")==0) return L1L2ApproximationEnum;
    13741378              else if (strcmp(name,"MLHOApproximation")==0) return MLHOApproximationEnum;
     
    14861490              else if (strcmp(name,"SMBcomponents")==0) return SMBcomponentsEnum;
    14871491              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;
    14891496              else if (strcmp(name,"SMBgcm")==0) return SMBgcmEnum;
    14901497              else if (strcmp(name,"SMBgemb")==0) return SMBgembEnum;
    14911498              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;
    14961500              else if (strcmp(name,"SMBgradientsela")==0) return SMBgradientselaEnum;
    14971501              else if (strcmp(name,"SMBhenning")==0) return SMBhenningEnum;
  • issm/trunk-jpl/src/m/classes/stochasticforcing.m

    r26553 r26604  
    88                isstochasticforcing  = 0;
    99                fields               = NaN;
    10                 dimensions           = NaN;
     10                defaultdimension     = 0;
     11      default_id           = NaN;
    1112                covariance           = NaN;
    1213                randomflag           = 1;
     
    3435
    3536                        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
    3783
    3884                        md = checkfield(md,'fieldname','stochasticforcing.isstochasticforcing','values',[0 1]);
    3985                        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
    4186                        md = checkfield(md,'fieldname','stochasticforcing.covariance','NaN',1,'Inf',1,'size',[size_tot,size_tot]); %global covariance matrix
    4287                        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
    5792                end % }}}
    5893                function disp(self) % {{{
     
    6095                        fielddisplay(self,'isstochasticforcing','is stochasticity activated?');
    6196                        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)');
    6399                        fielddisplay(self,'covariance','covariance matrix for within- and between-fields covariance (units must be squared field units)');
    64100                        fielddisplay(self,'randomflag','whether to apply real randomness (true) or pseudo-randomness with fixed seed (false)');
     
    77113                                return
    78114                        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
    79130                                %Scaling covariance matrix (scale column-by-column and row-by-row)
    80                                 scaledfields = {'SMBautoregression'}; %list of fields that need scaling *1/yts
     131                                scaledfields = {'DefaultCalving','SMBautoregression'}; %list of fields that need scaling *1/yts
    81132                                tempcovariance = self.covariance; %copy of covariance to avoid writing back in member variable
    82133                                for i=1:num_fields
    83134                                        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))];
    85136                                                for row=inds %scale rows corresponding to scaled field
    86137                                                        tempcovariance(row,:) = 1./yts*tempcovariance(row,:);
     
    93144                                WriteData(fid,prefix,'data',num_fields,'name','md.stochasticforcing.num_fields','format','Integer');
    94145                                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');
    96149                                WriteData(fid,prefix,'data',tempcovariance,'name','md.stochasticforcing.covariance','format','DoubleMat');
    97150                                WriteData(fid,prefix,'object',self,'fieldname','randomflag','format','Boolean');
     
    105158
    106159   list = {...
    107       'SMBautoregression',...
    108       'FrontalForcingsRignotAutoregression'
     160      'DefaultCalving',...
     161                'FrontalForcingsRignotAutoregression',...
     162      'SMBautoregression'
    109163      };
    110164end % }}}
  • issm/trunk-jpl/test/NightlyRun/test257.m

    r26553 r26604  
    4949md.stochasticforcing.isstochasticforcing = 1;
    5050md.stochasticforcing.fields              = [{'SMBautoregression'}];
    51 md.stochasticforcing.dimensions          = [md.smb.num_basins]; %dimension of each field
    5251md.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
    5352md.stochasticforcing.randomflag          = 0; %fixed random seeds
  • issm/trunk-jpl/test/NightlyRun/test543.m

    r26553 r26604  
    3939md.stochasticforcing.isstochasticforcing = 1;
    4040md.stochasticforcing.fields              = [{'FrontalForcingsRignotAutoregression'}];
    41 md.stochasticforcing.dimensions          = [md.frontalforcings.num_basins]; %dimension of each field
    4241md.stochasticforcing.covariance          = 1e-4*[[1.5,0.5];[0.5,0.4]]; %global covariance among- and between-fields
    4342md.stochasticforcing.randomflag          = 0; %determines true/false randomness
Note: See TracChangeset for help on using the changeset viewer.