Changeset 26608


Ignore:
Timestamp:
11/11/21 09:56:50 (3 years ago)
Author:
Mathieu Morlighem
Message:

BUG: reverting Vincent's commit

Location:
issm/trunk-jpl/src
Files:
12 edited

Legend:

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

    r26604 r26608  
    1212
    1313void LevelsetAnalysis::CreateConstraints(Constraints* constraints,IoModel* iomodel){/*{{{*/
     14       
     15        /*intermediary: */
    1416        int finiteelement;
     17        int         code,vector_layout;
     18        IssmDouble *spcdata = NULL;
     19        int         M,N;
     20
     21        /*Get finite element type for this analysis*/
    1522        iomodel->FindConstant(&finiteelement,"md.levelset.fe");
    16         IoModelToDynamicConstraintsx(constraints,iomodel,"md.levelset.spclevelset",LevelsetAnalysisEnum,finiteelement);
    17         //IoModelToConstraintsx(constraints,iomodel,"md.levelset.spclevelset",LevelsetAnalysisEnum,finiteelement);
     23
     24        /*First of, find the record for the enum, and get code  of data type: */
     25        iomodel->SetFilePointerToData(&code, &vector_layout,"md.levelset.spclevelset");
     26        if(code!=7)_error_("expecting a IssmDouble vector for constraints md.levelset.spclevelset");
     27        if(vector_layout!=1)_error_("expecting a nodal vector for constraints md.levelset.spclevelset");
     28
     29        /*Fetch vector:*/
     30        iomodel->FetchData(&spcdata,&M,&N,"md.levelset.spclevelset");
     31
     32        /*Call IoModelToConstraintsx*/
     33        if(N>1){
     34                /*If it is a time series, most likely we are forcing the ice front position and do not want to have a Dynamic Constraint*/
     35                _assert_(M==iomodel->numberofvertices+1);
     36                IoModelToConstraintsx(constraints,iomodel,spcdata,M,N,LevelsetAnalysisEnum,finiteelement);
     37        }
     38        else{
     39                /*This is not a time series, we probably have calving on, we need the levelset constraints to update as the levelset moves*/
     40                _assert_(N==1);
     41                _assert_(M==iomodel->numberofvertices);
     42                IoModelToDynamicConstraintsx(constraints,iomodel,spcdata,M,N,LevelsetAnalysisEnum,finiteelement);
     43        }
     44
     45        /*Clean up*/
     46        xDelete<IssmDouble>(spcdata);
    1847}
    1948/*}}}*/
     
    5483
    5584        /*Get moving front parameters*/
    56         bool isstochastic;
    5785        int  calvinglaw;
    5886        iomodel->FindConstant(&calvinglaw,"md.calving.law");
    59         iomodel->FindConstant(&isstochastic,"md.stochasticforcing.isstochasticforcing");
    6087        switch(calvinglaw){
    6188                case DefaultCalvingEnum:
    6289                        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                         }
    6790                        break;
    6891                case CalvingLevermannEnum:
  • issm/trunk-jpl/src/c/classes/Elements/Element.cpp

    r26604 r26608  
    9999   xDelete<IssmDouble>(phi_basin);     
    100100}/*}}}*/
    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;
     101void       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;
    106106   IssmDouble* phi_basin  = xNew<IssmDouble>(arorder);
    107107   IssmDouble* varlist     = xNew<IssmDouble>(numvertices);
    108108   IssmDouble* valuesautoregression = NULL;
    109    Input*      noiseterm_input      = NULL;
    110 
    111    /*Get field-specific enums*/
    112         switch(enum_type){
    113       case(SMBautoregressionEnum):
    114                         arenum_type    = SmbValuesAutoregressionEnum;
    115                         basinenum_type = SmbBasinsIdEnum;
    116                         noiseenum_type = SmbAutoregressionNoiseEnum;
    117          outenum_type   = SmbMassBalanceEnum;
    118                         break;
    119                 case(FrontalForcingsRignotAutoregressionEnum):
    120          arenum_type    = ThermalforcingValuesAutoregressionEnum;
    121          basinenum_type = FrontalForcingsBasinIdEnum;
    122          noiseenum_type = ThermalforcingAutoregressionNoiseEnum;
    123          outenum_type   = FrontalForcingsThermalForcingEnum;
    124                         break;
    125         }
    126 
    127         /*Get noise and autoregressive terms*/
    128         this->GetInputValue(&basinid,basinenum_type);
    129         if(isfieldstochastic){
    130       noiseterm_input = this->GetInput(noiseenum_type);
    131       Gauss* gauss = this->NewGauss();
    132       noiseterm_input->GetInputValue(&noiseterm,gauss);
    133       delete gauss;
    134    }
    135         else noiseterm = 0.0;
    136    this->inputs->GetArray(arenum_type,this->lid,&valuesautoregression,&M);
    137 
    138 
    139         /*
    140          this->GetInputValue(&basinid,SmbBasinsIdEnum);
    141          if(isfieldstochastic){
    142             noiseterm_input = this->GetInput(SmbAutoregressionNoiseEnum);
    143             Gauss* gauss = this->NewGauss();
    144             noiseterm_input->GetInputValue(&noiseterm,gauss);
    145             delete gauss;
    146          }
    147          else noiseterm = 0.0;
    148          this->inputs->GetArray(SmbValuesAutoregressionEnum,this->lid,&valuesautoregression,&M);
    149          arenum_type  = SmbValuesAutoregressionEnum;
    150          outenum_type = SmbMassBalanceEnum;
    151          break;
    152       case(FrontalForcingsRignotAutoregressionEnum):
    153          this->GetInputValue(&basinid,FrontalForcingsBasinIdEnum);
    154          if(isfieldstochastic){
    155             noiseterm_input = this->GetInput(ThermalforcingAutoregressionNoiseEnum);
    156             Gauss* gauss = this->NewGauss();
    157             noiseterm_input->GetInputValue(&noiseterm,gauss);
    158             delete gauss;
    159          }
    160          else noiseterm = 0.0;
    161          this->inputs->GetArray(ThermalforcingValuesAutoregressionEnum,this->lid,&valuesautoregression,&M);
    162          arenum_type  = ThermalforcingValuesAutoregressionEnum;
    163          outenum_type = FrontalForcingsThermalForcingEnum;
    164          break;
    165    }
    166         */
    167 
    168         /*Get basin coefficients*/
     109
     110   /*Get Basin ID and Basin coefficients*/
     111   if(enum_type==SMBautoregressionEnum)                   this->GetInputValue(&basinid,SmbBasinsIdEnum);
     112   if(enum_type==FrontalForcingsRignotAutoregressionEnum) this->GetInputValue(&basinid,FrontalForcingsBasinIdEnum);
    169113   for(int ii=0;ii<arorder;ii++) phi_basin[ii] = phi[basinid*arorder+ii];
    170114   beta0_basin   = beta0[basinid];
    171115   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);
    172119
    173120   /*If not AR model timestep: take the old values of variable*/
     
    184131
    185132         /*Stochastic variable value*/
    186          varlist[v] = beta0_basin+beta1_basin*telapsed_ar+autoregressionterm+noiseterm;
     133         varlist[v] = beta0_basin+beta1_basin*telapsed_ar+autoregressionterm+noise_basin;
    187134      }
    188       /*Update autoregression values*/
     135      /*Update autoregression TF values*/
    189136      IssmDouble* temparray = xNew<IssmDouble>(numvertices*arorder);
    190137      /*Assign newest values and shift older values*/
    191138      for(int i=0;i<numvertices;i++) temparray[i] = varlist[i];
    192139      for(int i=0;i<(arorder-1)*numvertices;i++) temparray[i+numvertices] = valuesautoregression[i];
    193       this->inputs->SetArrayInput(arenum_type,this->lid,temparray,numvertices*arorder);
     140      if(enum_type==SMBautoregressionEnum)                   this->inputs->SetArrayInput(SmbValuesAutoregressionEnum,this->lid,temparray,numvertices*arorder);
     141      if(enum_type==FrontalForcingsRignotAutoregressionEnum) this->inputs->SetArrayInput(ThermalforcingValuesAutoregressionEnum,this->lid,temparray,numvertices*arorder);
    194142      xDelete<IssmDouble>(temparray);
    195143   }
    196144
    197145   /*Add input to element*/
    198    this->AddInput(outenum_type,varlist,P1Enum);
     146   if(enum_type==SMBautoregressionEnum)                   this->AddInput(SmbMassBalanceEnum,varlist,P1Enum);
     147   if(enum_type==FrontalForcingsRignotAutoregressionEnum) this->AddInput(FrontalForcingsThermalForcingEnum,varlist,P1Enum);
    199148
    200149   /*Cleanup*/
    201150   xDelete<IssmDouble>(phi_basin);
    202151   xDelete<IssmDouble>(varlist);
    203    xDelete<IssmDouble>(valuesautoregression); 
     152   xDelete<IssmDouble>(valuesautoregression);
    204153}/*}}}*/
    205154void       Element::ComputeLambdaS(){/*{{{*/
     
    38293778        IssmDouble teValue=1.0;
    38303779        IssmDouble aValue=0.0;
     3780        IssmDouble dulwrfValue=0.0;
    38313781        IssmDouble szaValue=0.0;
    38323782        IssmDouble cotValue=0.0;
     
    38353785        IssmDouble dt,time,smb_dt;
    38363786        int        aIdx=0;
     3787        int        eIdx=0;
    38373788        int        denIdx=0;
    38383789        int        dsnowIdx=0;
     
    38643815        bool isgraingrowth,isalbedo,isshortwave,isthermal,isaccumulation,ismelt,isdensification,isturbulentflux;
    38653816        bool isconstrainsurfaceT=false;
     3817        bool isdeltaLWup=false;
    38663818        IssmDouble init_scaling=0.0;
    38673819        IssmDouble thermo_scaling=1.0;
    38683820        IssmDouble adThresh=1023.0;
     3821        IssmDouble teThresh=10;
    38693822        /*}}}*/
    38703823        /*Output variables:{{{ */
     
    39163869        parameters->FindParam(&smb_dt,SmbDtEnum);                     /*time period for the smb solution,  usually smaller than the glaciological dt*/
    39173870        parameters->FindParam(&aIdx,SmbAIdxEnum);
     3871        parameters->FindParam(&eIdx,SmbEIdxEnum);
    39183872        parameters->FindParam(&denIdx,SmbDenIdxEnum);
    39193873        parameters->FindParam(&swIdx,SmbSwIdxEnum);
     
    39323886        parameters->FindParam(&isturbulentflux,SmbIsturbulentfluxEnum);
    39333887        parameters->FindParam(&isconstrainsurfaceT,SmbIsconstrainsurfaceTEnum);
     3888        parameters->FindParam(&isdeltaLWup,SmbIsdeltaLWupEnum);
    39343889        parameters->FindParam(&init_scaling,SmbInitDensityScalingEnum);
    39353890        parameters->FindParam(&thermo_scaling,SmbThermoDeltaTScalingEnum);
    39363891        parameters->FindParam(&adThresh,SmbAdThreshEnum);
     3892        parameters->FindParam(&teThresh,SmbTeThreshEnum);
    39373893        /*}}}*/
    39383894        /*Retrieve inputs: {{{*/
     
    41244080        Input *teValue_input= this->GetInput(SmbTeValueEnum,timeinputs); _assert_(teValue_input);
    41254081        Input *aValue_input= this->GetInput(SmbAValueEnum,timeinputs); _assert_(aValue_input);
     4082        Input *dulwrfValue_input= this->GetInput(SmbDulwrfValueEnum,timeinputs); _assert_(dulwrfValue_input);
    41264083        Input *szaValue_input= this->GetInput(SmbSzaValueEnum,timeinputs); _assert_(szaValue_input);
    41274084        Input *cotValue_input= this->GetInput(SmbCotValueEnum,timeinputs); _assert_(cotValue_input);
     
    41394096        pAir_input->GetInputValue(&pAir,gauss);  // screen level air pressure [Pa]
    41404097        teValue_input->GetInputValue(&teValue,gauss);  // Emissivity [0-1]
     4098        dulwrfValue_input->GetInputValue(&dulwrfValue,gauss);  // LWup perturbation [W m-2]
    41414099        aValue_input->GetInputValue(&aValue,gauss);  // Albedo [0 1]
    41424100        szaValue_input->GetInputValue(&szaValue,gauss);  // Solar Zenith Angle [degree]
     
    41644122        }
    41654123        /*Thermal profile computation:*/
    4166         if(isthermal)thermo(&EC, &T, &ulw, dz, d, swf, dlw, Ta, V, eAir, pAir, teValue, W[0], smb_dt, m, Vz, Tz, thermo_scaling,rho_ice,this->Sid(),isconstrainsurfaceT);
     4124        if(isthermal)thermo(&EC, &T, &ulw, re, dz, d, swf, dlw, Ta, V, eAir, pAir, eIdx, teValue, dulwrfValue, teThresh, W[0], smb_dt, m, Vz, Tz, thermo_scaling,rho_ice,this->Sid(),isconstrainsurfaceT,isdeltaLWup);
    41674125
    41684126        /*Change in thickness of top cell due to evaporation/condensation  assuming same density as top cell.
  • issm/trunk-jpl/src/c/classes/Elements/Element.h

    r26604 r26608  
    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,bool isfieldstochastic,int enum_type);
     71      void               Autoregression(bool isstepforar,int arorder,IssmDouble telapsed_ar,IssmDouble* beta0,IssmDouble* beta1,IssmDouble* phi,IssmDouble* noiseterms,int enum_type);
    7272                void               ComputeLambdaS(void);
    7373                void               ComputeNewDamage();
  • issm/trunk-jpl/src/c/modules/FrontalForcingsx/FrontalForcingsx.cpp

    r26604 r26608  
    8080   /*Load parameters*/
    8181        bool isstochastic;
    82    bool istfstochastic = false;
    83         int M,N,Nphi,arorder,numbasins,my_rank;
     82   int M,N,Nphi,arorder,numbasins,my_rank;
    8483   femmodel->parameters->FindParam(&numbasins,FrontalForcingsNumberofBasinsEnum);
    8584   femmodel->parameters->FindParam(&arorder,FrontalForcingsAutoregressiveOrderEnum);
     
    8887   IssmDouble* beta1      = NULL;
    8988   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*/
    9697        femmodel->parameters->FindParam(&isstochastic,StochasticForcingIsStochasticForcingEnum);
    9798        if(isstochastic){
     
    101102                femmodel->parameters->FindParam(&stochasticfields,&N,StochasticForcingFieldsEnum); _assert_(N==numstochasticfields);
    102103                for(int i=0;i<numstochasticfields;i++){
    103                         if(stochasticfields[i]==FrontalForcingsRignotAutoregressionEnum) istfstochastic = true;
     104                        if(stochasticfields[i]==FrontalForcingsRignotAutoregressionEnum){
     105                                femmodel->parameters->FindParam(&noiseterms,&M,ThermalforcingAutoregressionNoiseEnum);  _assert_(M==numbasins);
     106                        }
    104107                }
    105                 xDelete<int>(stochasticfields);
    106108        }
    107109   /*Time elapsed with respect to AR model initial time*/
     
    111113   for(Object* &object:femmodel->elements->objects){
    112114      Element* element = xDynamicCast<Element*>(object);
    113       element->Autoregression(isstepforar,arorder,telapsed_ar,beta0,beta1,phi,istfstochastic,FrontalForcingsRignotAutoregressionEnum);
     115      element->Autoregression(isstepforar,arorder,telapsed_ar,beta0,beta1,phi,noiseterms,FrontalForcingsRignotAutoregressionEnum);
    114116   }
    115117
     
    118120   xDelete<IssmDouble>(beta1);
    119121   xDelete<IssmDouble>(phi);
     122   xDelete<IssmDouble>(noiseterms);
    120123}/*}}}*/
  • issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp

    r26604 r26608  
    502502        parameters->FindParam(&isstochasticforcing,StochasticForcingIsStochasticForcingEnum);
    503503        if(isstochasticforcing){
    504                 int num_fields,stochastic_dim;
     504                int num_fields;
    505505                char** fields;
    506506                parameters->AddObject(iomodel->CopyConstantObject("md.stochasticforcing.num_fields",StochasticForcingNumFieldsEnum));
    507                 parameters->AddObject(iomodel->CopyConstantObject("md.stochasticforcing.defaultdimension",StochasticForcingDefaultDimensionEnum));
    508507                iomodel->FindConstant(&fields,&num_fields,"md.stochasticforcing.fields");
    509508                if(num_fields<1) _error_("no stochasticforcing fields found");
     
    516515                parameters->AddObject(new IntVecParam(StochasticForcingFieldsEnum,stochasticforcing_enums,num_fields));
    517516                xDelete<int>(stochasticforcing_enums);
    518                 parameters->AddObject(iomodel->CopyConstantObject("md.stochasticforcing.randomflag",StochasticForcingRandomflagEnum));
     517
     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

    r26604 r26608  
    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 dimenum_type,noiseenum_type;
     48      int enum_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                 int dimensionid;
    55 
    56                 /*Deal with the autoregressive models*/
    57                 if(fields[j]==SMBautoregressionEnum || fields[j]==FrontalForcingsRignotAutoregressionEnum){
    58                         switch(fields[j]){
    59                                 case SMBautoregressionEnum:
    60                                         dimenum_type   = SmbBasinsIdEnum;
    61                                         noiseenum_type = SmbAutoregressionNoiseEnum;
    62                                         break;
    63                                 case FrontalForcingsRignotAutoregressionEnum:
    64                                         dimenum_type   = FrontalForcingsBasinIdEnum;
    65                                         noiseenum_type = ThermalforcingAutoregressionNoiseEnum;
    66                                         break;
    67                         }
    68                         for(Object* &object:femmodel->elements->objects){
    69             Element* element = xDynamicCast<Element*>(object);
    70             int numvertices  = element->GetNumberOfVertices();
    71             IssmDouble* noise_element = xNew<IssmDouble>(numvertices);
    72             element->GetInputValue(&dimensionid,dimenum_type);
    73             for(int i=0;i<numvertices;i++) noise_element[i] = noisefield[dimensionid];
    74             element->AddInput(noiseenum_type,noise_element,P0Enum);
    75             xDelete<IssmDouble>(noise_element);
    76                         }
    77                 }
    78                 else{
    79                         switch(fields[j]){
    80                                 case SMBautoregressionEnum:
    81                                 case FrontalForcingsRignotAutoregressionEnum:
    82                                         /*Already done above*/
    83                                         break;
    84                                 case DefaultCalvingEnum:
    85                                         /*Delete CalvingCalvingrateEnum at previous time step (required if it is transient)*/
    86                                         femmodel->inputs->DeleteInput(CalvingCalvingrateEnum);
    87                                         for(Object* &object:femmodel->elements->objects){
    88                                                 Element* element = xDynamicCast<Element*>(object);
    89                                                 int numvertices  = element->GetNumberOfVertices();
    90                                                 IssmDouble baselinecalvingrate;
    91                                                 IssmDouble calvingrate_tot[numvertices];
    92                                                 Input* baselinecalvingrate_input  = NULL;
    93                                                 baselinecalvingrate_input = element->GetInput(BaselineCalvingCalvingrateEnum); _assert_(baselinecalvingrate_input);
    94                                                 element->GetInputValue(&dimensionid,StochasticForcingDefaultIdEnum);
    95                                                 Gauss* gauss = element->NewGauss();
    96                                                 for(int i=0;i<numvertices;i++){
    97                                                         gauss->GaussVertex(i);
    98                                                         baselinecalvingrate_input->GetInputValue(&baselinecalvingrate,gauss);
    99                                                         calvingrate_tot[i] = max(0.0,baselinecalvingrate+noisefield[dimensionid]);
    100                                                 }
    101                                                 element->AddInput(CalvingCalvingrateEnum,&calvingrate_tot[0],P1DGEnum);
    102                                                 delete gauss;
    103                                         }
    104                                         break;
    105                                 default:
    106                                         _error_("Field "<<EnumToStringx(fields[j])<<" does not support stochasticity yet.");
    107                         }
    108                 }
    109                 i=i+dimensions[j];
     53     
     54      if(fields[j]==SMBautoregressionEnum)                        enum_type = SmbAutoregressionNoiseEnum;
     55                else if(fields[j]==FrontalForcingsRignotAutoregressionEnum) enum_type = ThermalforcingAutoregressionNoiseEnum;
     56                else _error_("Field "<<EnumToStringx(fields[j])<<" does not support stochasticity yet.\n");
     57      femmodel->parameters->SetParam(noisefield,dimensions[j],enum_type);
     58      i=i+dimensions[j];
    11059      xDelete<IssmDouble>(noisefield);
    11160   }
  • issm/trunk-jpl/src/c/modules/SurfaceMassBalancex/SurfaceMassBalancex.cpp

    r26604 r26608  
    197197        /*Load parameters*/
    198198        bool isstochastic;
    199         bool issmbstochastic = false;
    200199        int M,N,Nphi,arorder,numbasins,my_rank;
    201200        femmodel->parameters->FindParam(&numbasins,SmbNumBasinsEnum);
     
    211210        femmodel->parameters->FindParam(&phi,&M,&Nphi,SmbPhiEnum);  _assert_(M==numbasins); _assert_(Nphi==arorder);
    212211
     212        /*Retrieve noise terms if stochasticity, otherwise leave noiseterms as 0*/
     213   IssmDouble* noiseterms = xNewZeroInit<IssmDouble>(numbasins);
    213214        femmodel->parameters->FindParam(&isstochastic,StochasticForcingIsStochasticForcingEnum);
    214215   if(isstochastic){
     
    218219      femmodel->parameters->FindParam(&stochasticfields,&N,StochasticForcingFieldsEnum); _assert_(N==numstochasticfields);
    219220      for(int i=0;i<numstochasticfields;i++){
    220          if(stochasticfields[i]==SMBautoregressionEnum) issmbstochastic = true;
     221         if(stochasticfields[i]==SMBautoregressionEnum){
     222                                femmodel->parameters->FindParam(&noiseterms,&M,SmbAutoregressionNoiseEnum);  _assert_(M==numbasins);
     223                        }
    221224                }
    222225                xDelete<int>(stochasticfields);
     
    228231        for(Object* &object:femmodel->elements->objects){
    229232                Element* element = xDynamicCast<Element*>(object);
    230                 element->Autoregression(isstepforar,arorder,telapsed_ar,beta0,beta1,phi,issmbstochastic,SMBautoregressionEnum);
     233                element->Autoregression(isstepforar,arorder,telapsed_ar,beta0,beta1,phi,noiseterms,SMBautoregressionEnum);
    231234        }
    232235
     
    235238        xDelete<IssmDouble>(beta1);
    236239        xDelete<IssmDouble>(phi);
     240        xDelete<IssmDouble>(noiseterms);
    237241}/*}}}*/
    238242void Delta18oParameterizationx(FemModel* femmodel){/*{{{*/
  • issm/trunk-jpl/src/c/shared/Enum/Enum.vim

    r26604 r26608  
    398398syn keyword cConstant SolidearthSettingsOceanAreaScalingEnum
    399399syn keyword cConstant StochasticForcingCovarianceEnum
    400 syn keyword cConstant StochasticForcingDefaultDimensionEnum
    401400syn keyword cConstant StochasticForcingDimensionsEnum
    402401syn keyword cConstant StochasticForcingFieldsEnum
     
    429428syn keyword cConstant SmbAdThreshEnum
    430429syn keyword cConstant SmbAutoregressionInitialTimeEnum
     430syn keyword cConstant SmbAutoregressionNoiseEnum
    431431syn keyword cConstant SmbAutoregressionTimestepEnum
    432432syn keyword cConstant SmbAutoregressiveOrderEnum
     
    504504syn keyword cConstant StressbalanceRiftPenaltyThresholdEnum
    505505syn keyword cConstant StressbalanceShelfDampeningEnum
     506syn keyword cConstant ThermalforcingAutoregressionNoiseEnum
    506507syn keyword cConstant ThermalIsdrainicecolumnEnum
    507508syn keyword cConstant ThermalIsdynamicbasalspcEnum
     
    598599syn keyword cConstant BasalStressEnum
    599600syn keyword cConstant BaseEnum
    600 syn keyword cConstant BaselineCalvingCalvingrateEnum
    601601syn keyword cConstant BaseOldEnum
    602602syn keyword cConstant BaseSlopeXEnum
     
    613613syn keyword cConstant BottomPressureOldEnum
    614614syn keyword cConstant CalvingCalvingrateEnum
    615 syn keyword cConstant CalvingCalvingrateNoiseEnum
    616615syn keyword cConstant CalvingHabFractionEnum
    617616syn keyword cConstant CalvingMeltingrateEnum
     
    896895syn keyword cConstant SmbAdiffiniEnum
    897896syn keyword cConstant SmbAiniEnum
    898 syn keyword cConstant SmbAutoregressionNoiseEnum
    899897syn keyword cConstant SmbBasinsIdEnum
    900898syn keyword cConstant SmbBMaxEnum
     
    999997syn keyword cConstant SolidearthExternalDisplacementUpRateEnum
    1000998syn keyword cConstant SolidearthExternalGeoidRateEnum
    1001 syn keyword cConstant StochasticForcingDefaultIdEnum
    1002999syn keyword cConstant StrainRateeffectiveEnum
    10031000syn keyword cConstant StrainRateparallelEnum
     
    10351032syn keyword cConstant TemperaturePicardEnum
    10361033syn keyword cConstant TemperatureSEMICEnum
    1037 syn keyword cConstant ThermalforcingAutoregressionNoiseEnum
    10381034syn keyword cConstant ThermalforcingValuesAutoregressionEnum
    10391035syn keyword cConstant ThermalSpctemperatureEnum
  • issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h

    r26604 r26608  
    392392        SolidearthSettingsOceanAreaScalingEnum,
    393393        StochasticForcingCovarianceEnum,
    394         StochasticForcingDefaultDimensionEnum,
    395394        StochasticForcingDimensionsEnum,
    396395        StochasticForcingFieldsEnum,
     
    423422        SmbAdThreshEnum,
    424423        SmbAutoregressionInitialTimeEnum,
     424   SmbAutoregressionNoiseEnum,
    425425        SmbAutoregressionTimestepEnum,
    426426   SmbAutoregressiveOrderEnum,
     
    498498        StressbalanceRiftPenaltyThresholdEnum,
    499499        StressbalanceShelfDampeningEnum,
     500   ThermalforcingAutoregressionNoiseEnum,
    500501        ThermalIsdrainicecolumnEnum,
    501502        ThermalIsdynamicbasalspcEnum,
     
    594595        BasalStressEnum,
    595596        BaseEnum,
    596         BaselineCalvingCalvingrateEnum,
    597597        BaseOldEnum,
    598598        BaseSlopeXEnum,
     
    609609        BottomPressureOldEnum,
    610610        CalvingCalvingrateEnum,
    611         CalvingCalvingrateNoiseEnum,
    612611        CalvingHabFractionEnum,
    613612        CalvingMeltingrateEnum,
     
    892891        SmbAdiffiniEnum,
    893892        SmbAiniEnum,
    894    SmbAutoregressionNoiseEnum,
    895893        SmbBasinsIdEnum,
    896894        SmbBMaxEnum,
     
    996994        SolidearthExternalDisplacementUpRateEnum,
    997995        SolidearthExternalGeoidRateEnum,
    998         StochasticForcingDefaultIdEnum,
    999996        StrainRateeffectiveEnum,
    1000997        StrainRateparallelEnum,
     
    10321029        TemperaturePicardEnum,
    10331030        TemperatureSEMICEnum,
    1034    ThermalforcingAutoregressionNoiseEnum,
    10351031        ThermalforcingValuesAutoregressionEnum,
    10361032        ThermalSpctemperatureEnum,
  • issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp

    r26604 r26608  
    400400                case SolidearthSettingsOceanAreaScalingEnum : return "SolidearthSettingsOceanAreaScaling";
    401401                case StochasticForcingCovarianceEnum : return "StochasticForcingCovariance";
    402                 case StochasticForcingDefaultDimensionEnum : return "StochasticForcingDefaultDimension";
    403402                case StochasticForcingDimensionsEnum : return "StochasticForcingDimensions";
    404403                case StochasticForcingFieldsEnum : return "StochasticForcingFields";
     
    431430                case SmbAdThreshEnum : return "SmbAdThresh";
    432431                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";
    508509                case ThermalIsdrainicecolumnEnum : return "ThermalIsdrainicecolumn";
    509510                case ThermalIsdynamicbasalspcEnum : return "ThermalIsdynamicbasalspc";
     
    600601                case BasalStressEnum : return "BasalStress";
    601602                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";
    618617                case CalvingHabFractionEnum : return "CalvingHabFraction";
    619618                case CalvingMeltingrateEnum : return "CalvingMeltingrate";
     
    898897                case SmbAdiffiniEnum : return "SmbAdiffini";
    899898                case SmbAiniEnum : return "SmbAini";
    900                 case SmbAutoregressionNoiseEnum : return "SmbAutoregressionNoise";
    901899                case SmbBasinsIdEnum : return "SmbBasinsId";
    902900                case SmbBMaxEnum : return "SmbBMax";
     
    1001999                case SolidearthExternalDisplacementUpRateEnum : return "SolidearthExternalDisplacementUpRate";
    10021000                case SolidearthExternalGeoidRateEnum : return "SolidearthExternalGeoidRate";
    1003                 case StochasticForcingDefaultIdEnum : return "StochasticForcingDefaultId";
    10041001                case StrainRateeffectiveEnum : return "StrainRateeffective";
    10051002                case StrainRateparallelEnum : return "StrainRateparallel";
     
    10371034                case TemperaturePicardEnum : return "TemperaturePicard";
    10381035                case TemperatureSEMICEnum : return "TemperatureSEMIC";
    1039                 case ThermalforcingAutoregressionNoiseEnum : return "ThermalforcingAutoregressionNoise";
    10401036                case ThermalforcingValuesAutoregressionEnum : return "ThermalforcingValuesAutoregression";
    10411037                case ThermalSpctemperatureEnum : return "ThermalSpctemperature";
  • issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp

    r26604 r26608  
    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;
    412411              else if (strcmp(name,"StochasticForcingDimensions")==0) return StochasticForcingDimensionsEnum;
    413412              else if (strcmp(name,"StochasticForcingFields")==0) return StochasticForcingFieldsEnum;
     
    440439              else if (strcmp(name,"SmbAdThresh")==0) return SmbAdThreshEnum;
    441440              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;
    520521              else if (strcmp(name,"ThermalIsdrainicecolumn")==0) return ThermalIsdrainicecolumnEnum;
    521522              else if (strcmp(name,"ThermalIsdynamicbasalspc")==0) return ThermalIsdynamicbasalspcEnum;
     
    612613              else if (strcmp(name,"BasalStress")==0) return BasalStressEnum;
    613614              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;
    630629              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,"CalvingMeltingrate")==0) return CalvingMeltingrateEnum;
    635               else if (strcmp(name,"CalvingStressThresholdFloatingice")==0) return CalvingStressThresholdFloatingiceEnum;
     634              if (strcmp(name,"CalvingStressThresholdFloatingice")==0) return CalvingStressThresholdFloatingiceEnum;
    636635              else if (strcmp(name,"CalvingStressThresholdGroundedice")==0) return CalvingStressThresholdGroundediceEnum;
    637636              else if (strcmp(name,"CalvinglevermannCoeff")==0) return CalvinglevermannCoeffEnum;
     
    752751              else if (strcmp(name,"HydrologyReynolds")==0) return HydrologyReynoldsEnum;
    753752              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,"HydrologySheetThickness")==0) return HydrologySheetThicknessEnum;
    758               else if (strcmp(name,"HydrologySheetThicknessOld")==0) return HydrologySheetThicknessOldEnum;
     757              if (strcmp(name,"HydrologySheetThicknessOld")==0) return HydrologySheetThicknessOldEnum;
    759758              else if (strcmp(name,"HydrologyTws")==0) return HydrologyTwsEnum;
    760759              else if (strcmp(name,"HydrologyTwsSpc")==0) return HydrologyTwsSpcEnum;
     
    875874              else if (strcmp(name,"SealevelUNorthEsa")==0) return SealevelUNorthEsaEnum;
    876875              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,"SealevelchangeG")==0) return SealevelchangeGEnum;
    881               else if (strcmp(name,"SealevelchangeGU")==0) return SealevelchangeGUEnum;
     880              if (strcmp(name,"SealevelchangeGU")==0) return SealevelchangeGUEnum;
    882881              else if (strcmp(name,"SealevelchangeGE")==0) return SealevelchangeGEEnum;
    883882              else if (strcmp(name,"SealevelchangeGN")==0) return SealevelchangeGNEnum;
     
    919918              else if (strcmp(name,"SmbAdiffini")==0) return SmbAdiffiniEnum;
    920919              else if (strcmp(name,"SmbAini")==0) return SmbAiniEnum;
    921               else if (strcmp(name,"SmbAutoregressionNoise")==0) return SmbAutoregressionNoiseEnum;
    922920              else if (strcmp(name,"SmbBasinsId")==0) return SmbBasinsIdEnum;
    923921              else if (strcmp(name,"SmbBMax")==0) return SmbBMaxEnum;
     
    998996              else if (strcmp(name,"SmbSzaValue")==0) return SmbSzaValueEnum;
    999997              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,"SmbTa")==0) return SmbTaEnum;
    1004               else if (strcmp(name,"SmbTeValue")==0) return SmbTeValueEnum;
    1005               else if (strcmp(name,"SmbTemperaturesAnomaly")==0) return SmbTemperaturesAnomalyEnum;
     1003              if (strcmp(name,"SmbTemperaturesAnomaly")==0) return SmbTemperaturesAnomalyEnum;
    10061004              else if (strcmp(name,"SmbTemperaturesLgm")==0) return SmbTemperaturesLgmEnum;
    10071005              else if (strcmp(name,"SmbTemperaturesPresentday")==0) return SmbTemperaturesPresentdayEnum;
     
    10251023              else if (strcmp(name,"SolidearthExternalDisplacementUpRate")==0) return SolidearthExternalDisplacementUpRateEnum;
    10261024              else if (strcmp(name,"SolidearthExternalGeoidRate")==0) return SolidearthExternalGeoidRateEnum;
    1027               else if (strcmp(name,"StochasticForcingDefaultId")==0) return StochasticForcingDefaultIdEnum;
    10281025              else if (strcmp(name,"StrainRateeffective")==0) return StrainRateeffectiveEnum;
    10291026              else if (strcmp(name,"StrainRateparallel")==0) return StrainRateparallelEnum;
     
    10611058              else if (strcmp(name,"TemperaturePicard")==0) return TemperaturePicardEnum;
    10621059              else if (strcmp(name,"TemperatureSEMIC")==0) return TemperatureSEMICEnum;
    1063               else if (strcmp(name,"ThermalforcingAutoregressionNoise")==0) return ThermalforcingAutoregressionNoiseEnum;
    10641060              else if (strcmp(name,"ThermalforcingValuesAutoregression")==0) return ThermalforcingValuesAutoregressionEnum;
    10651061              else if (strcmp(name,"ThermalSpctemperature")==0) return ThermalSpctemperatureEnum;
     
    11211117              else if (strcmp(name,"Outputdefinition24")==0) return Outputdefinition24Enum;
    11221118              else if (strcmp(name,"Outputdefinition25")==0) return Outputdefinition25Enum;
     1119              else if (strcmp(name,"Outputdefinition26")==0) return Outputdefinition26Enum;
     1120              else if (strcmp(name,"Outputdefinition27")==0) return Outputdefinition27Enum;
     1121              else if (strcmp(name,"Outputdefinition28")==0) return Outputdefinition28Enum;
     1122              else if (strcmp(name,"Outputdefinition29")==0) return Outputdefinition29Enum;
    11231123         else stage=10;
    11241124   }
    11251125   if(stage==10){
    1126               if (strcmp(name,"Outputdefinition26")==0) return Outputdefinition26Enum;
    1127               else if (strcmp(name,"Outputdefinition27")==0) return Outputdefinition27Enum;
    1128               else if (strcmp(name,"Outputdefinition28")==0) return Outputdefinition28Enum;
    1129               else if (strcmp(name,"Outputdefinition29")==0) return Outputdefinition29Enum;
    1130               else if (strcmp(name,"Outputdefinition2")==0) return Outputdefinition2Enum;
     1126              if (strcmp(name,"Outputdefinition2")==0) return Outputdefinition2Enum;
    11311127              else if (strcmp(name,"Outputdefinition30")==0) return Outputdefinition30Enum;
    11321128              else if (strcmp(name,"Outputdefinition31")==0) return Outputdefinition31Enum;
     
    12441240              else if (strcmp(name,"CalvingVonmises")==0) return CalvingVonmisesEnum;
    12451241              else if (strcmp(name,"Cfdragcoeffabsgrad")==0) return CfdragcoeffabsgradEnum;
     1242              else if (strcmp(name,"Cfsurfacelogvel")==0) return CfsurfacelogvelEnum;
     1243              else if (strcmp(name,"Cfsurfacesquare")==0) return CfsurfacesquareEnum;
     1244              else if (strcmp(name,"Cflevelsetmisfit")==0) return CflevelsetmisfitEnum;
     1245              else if (strcmp(name,"Channel")==0) return ChannelEnum;
    12461246         else stage=11;
    12471247   }
    12481248   if(stage==11){
    1249               if (strcmp(name,"Cfsurfacelogvel")==0) return CfsurfacelogvelEnum;
    1250               else if (strcmp(name,"Cfsurfacesquare")==0) return CfsurfacesquareEnum;
    1251               else if (strcmp(name,"Cflevelsetmisfit")==0) return CflevelsetmisfitEnum;
    1252               else if (strcmp(name,"Channel")==0) return ChannelEnum;
    1253               else if (strcmp(name,"ChannelArea")==0) return ChannelAreaEnum;
     1249              if (strcmp(name,"ChannelArea")==0) return ChannelAreaEnum;
    12541250              else if (strcmp(name,"ChannelAreaOld")==0) return ChannelAreaOldEnum;
    12551251              else if (strcmp(name,"ChannelDischarge")==0) return ChannelDischargeEnum;
     
    13671363              else if (strcmp(name,"IntParam")==0) return IntParamEnum;
    13681364              else if (strcmp(name,"IntVecParam")==0) return IntVecParamEnum;
     1365              else if (strcmp(name,"Inputs")==0) return InputsEnum;
     1366              else if (strcmp(name,"Internal")==0) return InternalEnum;
     1367              else if (strcmp(name,"Intersect")==0) return IntersectEnum;
     1368              else if (strcmp(name,"InversionVzObs")==0) return InversionVzObsEnum;
    13691369         else stage=12;
    13701370   }
    13711371   if(stage==12){
    1372               if (strcmp(name,"Inputs")==0) return InputsEnum;
    1373               else if (strcmp(name,"Internal")==0) return InternalEnum;
    1374               else if (strcmp(name,"Intersect")==0) return IntersectEnum;
    1375               else if (strcmp(name,"InversionVzObs")==0) return InversionVzObsEnum;
    1376               else if (strcmp(name,"J")==0) return JEnum;
     1372              if (strcmp(name,"J")==0) return JEnum;
    13771373              else if (strcmp(name,"L1L2Approximation")==0) return L1L2ApproximationEnum;
    13781374              else if (strcmp(name,"MLHOApproximation")==0) return MLHOApproximationEnum;
     
    14901486              else if (strcmp(name,"SMBcomponents")==0) return SMBcomponentsEnum;
    14911487              else if (strcmp(name,"SMBd18opdd")==0) return SMBd18opddEnum;
     1488              else if (strcmp(name,"SMBforcing")==0) return SMBforcingEnum;
     1489              else if (strcmp(name,"SMBgcm")==0) return SMBgcmEnum;
     1490              else if (strcmp(name,"SMBgemb")==0) return SMBgembEnum;
     1491              else if (strcmp(name,"SMBgradients")==0) return SMBgradientsEnum;
    14921492         else stage=13;
    14931493   }
    14941494   if(stage==13){
    1495               if (strcmp(name,"SMBforcing")==0) return SMBforcingEnum;
    1496               else if (strcmp(name,"SMBgcm")==0) return SMBgcmEnum;
    1497               else if (strcmp(name,"SMBgemb")==0) return SMBgembEnum;
    1498               else if (strcmp(name,"SMBgradients")==0) return SMBgradientsEnum;
    1499               else if (strcmp(name,"SMBgradientscomponents")==0) return SMBgradientscomponentsEnum;
     1495              if (strcmp(name,"SMBgradientscomponents")==0) return SMBgradientscomponentsEnum;
    15001496              else if (strcmp(name,"SMBgradientsela")==0) return SMBgradientselaEnum;
    15011497              else if (strcmp(name,"SMBhenning")==0) return SMBhenningEnum;
  • issm/trunk-jpl/src/m/classes/stochasticforcing.m

    r26604 r26608  
    88                isstochasticforcing  = 0;
    99                fields               = NaN;
    10                 defaultdimension     = 0;
    11       default_id           = NaN;
     10                dimensions           = NaN;
    1211                covariance           = NaN;
    1312                randomflag           = 1;
     
    3534
    3635                        num_fields = numel(self.fields);
    37                        
    38                         %Check that covariance matrix is positive definite
    39                         try
    40                                 chol(self.covariance);
    41                         catch
    42                                 error('md.stochasticforcing.covariance is not positive definite');
    43                         end
    44 
    45                         %Check that all fields agree with the corresponding md class and if any field needs the default params   
    46          checkdefaults = false; %need to check defaults only if one of the field does not have its own dimensionality
    47                         for field=self.fields
    48             %Checking agreement of classes
    49             if(contains(field,'SMB'))
    50                if~(isequal(class(md.smb),char(field)))
    51                   error('md.smb does not agree with stochasticforcing field %s', char(field));
    52                end
    53             end
    54             if(contains(field,'frontalforcings'))
    55                if~(isequal(class(md.frontalforcings),char(field)))
    56                   error('md.frontalforcings does not agree with stochasticforcing field %s', char(field));
    57                end
    58             end
    59             %Checking for specific dimensions
    60             if ~(strcmp(field,'SMBautoregression') || strcmp(field,'FrontalForcingsRignotAutoregression'))
    61                checkdefaults = true; %field with non-specific dimensionality
    62             end
    63          end
    64 
    65                         %Retrieve sum of all the field dimensionalities
    66                         size_tot   = self.defaultdimension*num_fields;
    67                         indSMBar = -1; %about to check for index of SMBautoregression
    68                         indTFar  = -1; %about to check for index of FrontalForcingsRignotAutoregression
    69                         if any(contains(self.fields,'SMBautoregression'))
    70             size_tot = size_tot-self.defaultdimension+md.smb.num_basins;
    71                                 indSMBar = find(contains(self.fields,'SMBautoregression')); %index of SMBar, now check for consistency with TFar timestep (08Nov2021)
    72          end
    73          if any(contains(self.fields,'FrontalForcingsRignotAutoregression'))
    74             size_tot = size_tot-self.defaultdimension+md.frontalforcings.num_basins;
    75                                 indTFar  = find(contains(self.fields,'FrontalForcingsRignotAutoregression')); %index of TFar, now check for consistency with SMBar timestep (08Nov2021)
    76          end
    77 
    78                         if(indSMBar~=-1 && indTFar~=-1) %both autoregressive models are used: check autoregressive time step consistency
    79                                 if((md.smb.ar_timestep~=md.frontalforcings.ar_timestep) && any(self.covariance(1+sum(self.dimensions(1:indSMBar-1)):sum(self.dimensions(1:indSMBar)),1+sum(self.dimensions(1:indTFar-1)):sum(self.dimensions(1:indTFar)))))
    80                                         error('SMBautoregression and FrontalForcingsRignotAutoregression have different ar_timestep and non-zero covariance');
    81                                 end
    82                         end
     36                        size_tot   = sum(self.dimensions);
    8337
    8438                        md = checkfield(md,'fieldname','stochasticforcing.isstochasticforcing','values',[0 1]);
    8539                        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
    8641                        md = checkfield(md,'fieldname','stochasticforcing.covariance','NaN',1,'Inf',1,'size',[size_tot,size_tot]); %global covariance matrix
    8742                        md = checkfield(md,'fieldname','stochasticforcing.randomflag','numel',[1],'values',[0 1]);
    88                         if(checkdefaults) %need to check the defaults
    89             md = checkfield(md,'fieldname','stochasticforcing.defaultdimension','numel',1,'NaN',1,'Inf',1,'>',0);
    90             md = checkfield(md,'fieldname','stochasticforcing.default_id','Inf',1,'>=',0,'<=',self.defaultdimension,'size',[md.mesh.numberofelements,1]);
    91          end
     43
     44                        %Check that all fields agree with the corresponding md class
     45                        for field=self.fields
     46                                if(contains(field,'SMB'))
     47                                        if~(isequal(class(md.smb),char(field)))
     48                                                error('md.smb does not agree with stochasticforcing field %s', char(field));
     49                                        end
     50                                end
     51                                if(contains(field,'frontalforcings'))
     52                                        if~(isequal(class(md.frontalforcings),char(field)))
     53                                                error('md.frontalforcings does not agree with stochasticforcing field %s', char(field));
     54                                        end
     55                                end
     56                        end
    9257                end % }}}
    9358                function disp(self) % {{{
     
    9560                        fielddisplay(self,'isstochasticforcing','is stochasticity activated?');
    9661                        fielddisplay(self,'fields','fields with stochasticity applied, ex: {''SMBautoregression''}, or {''FrontalForcingsRignotAutoregression''}');
    97                         fielddisplay(self,'defaultdimension','dimensionality of the noise terms (does not apply to fields with their specific dimension)');
    98          fielddisplay(self,'default_id','id of each element for partitioning of the noise terms (does not apply to fields with their specific partition)');
     62                        fielddisplay(self,'dimensions','dimensionality of each field');
    9963                        fielddisplay(self,'covariance','covariance matrix for within- and between-fields covariance (units must be squared field units)');
    10064                        fielddisplay(self,'randomflag','whether to apply real randomness (true) or pseudo-randomness with fixed seed (false)');
     
    11377                                return
    11478                        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 
    13079                                %Scaling covariance matrix (scale column-by-column and row-by-row)
    131                                 scaledfields = {'DefaultCalving','SMBautoregression'}; %list of fields that need scaling *1/yts
     80                                scaledfields = {'SMBautoregression'}; %list of fields that need scaling *1/yts
    13281                                tempcovariance = self.covariance; %copy of covariance to avoid writing back in member variable
    13382                                for i=1:num_fields
    13483                                        if any(strcmp(scaledfields,self.fields(i)))
    135                                                 inds = [1+sum(dimensions(1:i-1)):1:sum(dimensions(1:i))];
     84                                                inds = [1+sum(self.dimensions(1:i-1)):1:sum(self.dimensions(1:i))];
    13685                                                for row=inds %scale rows corresponding to scaled field
    13786                                                        tempcovariance(row,:) = 1./yts*tempcovariance(row,:);
     
    14493                                WriteData(fid,prefix,'data',num_fields,'name','md.stochasticforcing.num_fields','format','Integer');
    14594                                WriteData(fid,prefix,'object',self,'fieldname','fields','format','StringArray');
    146                                 WriteData(fid,prefix,'data',dimensions,'name','md.stochasticforcing.dimensions','format','IntMat');
    147             WriteData(fid,prefix,'object',self,'fieldname','default_id','data',self.default_id-1,'format','IntMat','mattype',2); %0-indexed
    148                                 WriteData(fid,prefix,'object',self,'fieldname','defaultdimension','format','Integer');
     95                                WriteData(fid,prefix,'object',self,'fieldname','dimensions','format','IntMat');
    14996                                WriteData(fid,prefix,'data',tempcovariance,'name','md.stochasticforcing.covariance','format','DoubleMat');
    15097                                WriteData(fid,prefix,'object',self,'fieldname','randomflag','format','Boolean');
     
    158105
    159106   list = {...
    160       'DefaultCalving',...
    161                 'FrontalForcingsRignotAutoregression',...
    162       'SMBautoregression'
     107      'SMBautoregression',...
     108      'FrontalForcingsRignotAutoregression'
    163109      };
    164110end % }}}
Note: See TracChangeset for help on using the changeset viewer.