Changeset 27318


Ignore:
Timestamp:
10/21/22 11:51:59 (3 years ago)
Author:
vverjans
Message:

NEW piecewise polynomials implemented in ARMA model schemes

Location:
issm/trunk-jpl
Files:
27 edited

Legend:

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

    r27287 r27318  
    246246                case FrontalForcingsRignotarmaEnum:
    247247                        /*Retrieve autoregressive parameters*/
     248                        parameters->AddObject(iomodel->CopyConstantObject("md.frontalforcings.num_params",FrontalForcingsNumberofParamsEnum));
     249                        parameters->AddObject(iomodel->CopyConstantObject("md.frontalforcings.num_breaks",FrontalForcingsNumberofBreaksEnum));
    248250         parameters->AddObject(iomodel->CopyConstantObject("md.frontalforcings.ar_order",FrontalForcingsARMAarOrderEnum));
    249251         parameters->AddObject(iomodel->CopyConstantObject("md.frontalforcings.ma_order",FrontalForcingsARMAmaOrderEnum));
    250          parameters->AddObject(iomodel->CopyConstantObject("md.frontalforcings.arma_initialtime",FrontalForcingsARMAInitialTimeEnum));
    251252         parameters->AddObject(iomodel->CopyConstantObject("md.frontalforcings.arma_timestep",FrontalForcingsARMATimestepEnum));
    252                         iomodel->FetchData(&transparam,&M,&N,"md.frontalforcings.const");
    253          parameters->AddObject(new DoubleVecParam(FrontalForcingsARMAconstEnum,transparam,N));
     253         iomodel->FetchData(&transparam,&M,&N,"md.frontalforcings.polynomialparams");
     254         parameters->AddObject(new DoubleMatParam(FrontalForcingsARMApolyparamsEnum,transparam,M,N));
    254255         xDelete<IssmDouble>(transparam);
    255          iomodel->FetchData(&transparam,&M,&N,"md.frontalforcings.trend");
    256          parameters->AddObject(new DoubleVecParam(FrontalForcingsARMAtrendEnum,transparam,N));
     256         iomodel->FetchData(&transparam,&M,&N,"md.frontalforcings.datebreaks");
     257         parameters->AddObject(new DoubleMatParam(FrontalForcingsARMAdatebreaksEnum,transparam,M,N));
    257258         xDelete<IssmDouble>(transparam);
    258259         iomodel->FetchData(&transparam,&M,&N,"md.frontalforcings.arlag_coefs");
  • issm/trunk-jpl/src/c/classes/Elements/Element.cpp

    r27287 r27318  
    6161        return false;
    6262}/*}}}*/
    63 void       Element::ArmaProcess(bool isstepforarma,int arorder,int maorder,IssmDouble telapsed_arma,IssmDouble tstep_arma,IssmDouble* termconstant,IssmDouble* trend,IssmDouble* arlagcoefs,IssmDouble* malagcoefs,bool isfieldstochastic,int enum_type){/*{{{*/
     63void       Element::ArmaProcess(bool isstepforarma,int arorder,int maorder,int numparams,int numbreaks,IssmDouble tstep_arma,IssmDouble* polyparams,IssmDouble* arlagcoefs,IssmDouble* malagcoefs,IssmDouble* datebreaks,bool isfieldstochastic,int enum_type){/*{{{*/
    6464   const int numvertices = this->GetNumberOfVertices();
    65    int         basinid,M,N,arenum_type,maenum_type,basinenum_type,noiseenum_type,outenum_type;
    66    IssmDouble  time,dt,starttime,termconstant_basin,trend_basin,noiseterm;
     65        int         numperiods = numbreaks+1;
     66   int         basinid,M,N,arenum_type,maenum_type,basinenum_type,noiseenum_type,outenum_type,indperiod;
     67   IssmDouble  time,dt,starttime,noiseterm;
    6768   IssmDouble* arlagcoefs_basin     = xNew<IssmDouble>(arorder);
    6869   IssmDouble* malagcoefs_basin     = xNew<IssmDouble>(maorder);
     70   IssmDouble* datebreaks_basin     = xNew<IssmDouble>(numbreaks);
     71   IssmDouble* polyparams_basin     = xNew<IssmDouble>(numperiods*numparams);
    6972   IssmDouble* varlist              = xNew<IssmDouble>(numvertices);
     73   IssmDouble* sumpoly              = xNewZeroInit<IssmDouble>(arorder+1);
    7074   IssmDouble* valuesautoregression = NULL;
    7175   IssmDouble* valuesmovingaverage  = NULL;
     
    104108   /*Get basin coefficients*/
    105109   this->GetInputValue(&basinid,basinenum_type);
    106         for(int ii=0;ii<arorder;ii++) arlagcoefs_basin[ii] = arlagcoefs[basinid*arorder+ii];
    107         for(int ii=0;ii<maorder;ii++) malagcoefs_basin[ii] = malagcoefs[basinid*maorder+ii];
    108    termconstant_basin   = termconstant[basinid];
    109    trend_basin          = trend[basinid];
    110 
     110        for(int i=0;i<arorder;i++) arlagcoefs_basin[i]   = arlagcoefs[basinid*arorder+i];
     111        for(int i=0;i<maorder;i++) malagcoefs_basin[i]   = malagcoefs[basinid*maorder+i];
     112        for(int i=0;i<numparams;i++){
     113                for(int j=0;j<numperiods;j++) polyparams_basin[i*numperiods+j] = polyparams[basinid*numparams*numperiods+i*numperiods+j];
     114        }
     115        if(numbreaks>0){
     116                for(int i=0;i<numbreaks;i++) datebreaks_basin[i] = datebreaks[basinid*numbreaks+i];
     117        }
     118
     119        /*Compute terms from polynomial parameters from arorder steps back to present*/
     120        IssmDouble telapsed_break;
     121        IssmDouble tatstep;
     122        for(int s=0;s<arorder+1;s++){
     123                tatstep = time-s*tstep_arma;
     124                if(numbreaks>0){
     125                        /*Find index of tatstep compared to the breakpoints*/
     126                        indperiod = 0;
     127                        for(int i=0;i<numbreaks;i++){
     128                                if(tatstep>datebreaks_basin[i]) indperiod = i+1;
     129                        }
     130                        /*Compute polynomial with parameters of indperiod*/
     131                        if(indperiod==0) telapsed_break = tatstep;
     132                        else             telapsed_break = tatstep-datebreaks_basin[indperiod];
     133                        for(int j=0;j<numparams;j++)   sumpoly[s] = sumpoly[s]+polyparams_basin[indperiod+j*numperiods]*pow(telapsed_break,j);
     134                }
     135                else for(int j=0;j<numparams;j++) sumpoly[s] = sumpoly[s]+polyparams_basin[j*numperiods]*pow(tatstep,j);
     136        }
    111137        /*Initialze autoregressive and moving-average values at first time step*/
    112138        if(time<=starttime+dt){
    113139                IssmDouble* initvaluesautoregression = xNewZeroInit<IssmDouble>(numvertices*arorder);
    114140                IssmDouble* initvaluesmovingaverage  = xNewZeroInit<IssmDouble>(numvertices*maorder);
    115                 for(int i=0;i<numvertices*arorder;i++) initvaluesautoregression[i]=termconstant_basin;
     141                for(int i=0;i<numvertices*arorder;i++) initvaluesautoregression[i]=polyparams_basin[0];
    116142      this->inputs->SetArrayInput(arenum_type,this->lid,initvaluesautoregression,numvertices*arorder);
    117143      this->inputs->SetArrayInput(maenum_type,this->lid,initvaluesmovingaverage,numvertices*maorder);
     
    141167         /*Compute autoregressive term*/
    142168         IssmDouble autoregressionterm=0.;
    143          for(int ii=0;ii<arorder;ii++) autoregressionterm += arlagcoefs_basin[ii]*(valuesautoregression[v+ii*numvertices]-(termconstant_basin+trend_basin*(telapsed_arma-(ii+1)*tstep_arma)));
    144          /*Compute moving-average term*/
     169         for(int ii=0;ii<arorder;ii++) autoregressionterm += arlagcoefs_basin[ii]*(valuesautoregression[v+ii*numvertices]-sumpoly[ii+1]);
     170                        /*Compute moving-average term*/
    145171         IssmDouble movingaverageterm=0.;
    146172         for(int ii=0;ii<maorder;ii++) movingaverageterm  += malagcoefs_basin[ii]*valuesmovingaverage[v+ii*numvertices];
    147173
    148174                        /*Stochastic variable value*/
    149          varlist[v] = termconstant_basin+trend_basin*telapsed_arma+autoregressionterm+movingaverageterm+noiseterm;
     175         varlist[v] = sumpoly[0]+autoregressionterm+movingaverageterm+noiseterm;
    150176      }
    151177      /*Update autoregression and moving-average values*/
     
    169195   xDelete<IssmDouble>(arlagcoefs_basin);
    170196   xDelete<IssmDouble>(malagcoefs_basin);
     197   xDelete<IssmDouble>(datebreaks_basin);
     198   xDelete<IssmDouble>(polyparams_basin);
     199   xDelete<IssmDouble>(sumpoly);
    171200   xDelete<IssmDouble>(varlist);
    172201   xDelete<IssmDouble>(valuesautoregression);
    173202   xDelete<IssmDouble>(valuesmovingaverage);
    174 }/*}}}*/
    175 void       Element::Autoregression(bool isstepforar,int arorder,IssmDouble telapsed_ar,IssmDouble tstep_ar,IssmDouble* termconstant,IssmDouble* trend,IssmDouble* lagcoefs,bool isfieldstochastic,int enum_type){/*{{{*/
    176 
    177    const int numvertices = this->GetNumberOfVertices();
    178    int         basinid,M,N,arenum_type,basinenum_type,noiseenum_type,outenum_type;
    179    IssmDouble  time,dt,starttime,termconstant_basin,trend_basin,noiseterm;
    180    IssmDouble* lagcoefs_basin  = xNew<IssmDouble>(arorder);
    181    IssmDouble* varlist         = xNew<IssmDouble>(numvertices);
    182    IssmDouble* valuesautoregression = NULL;
    183    Input*      noiseterm_input      = NULL;
    184 
    185    /*Get field-specific enums*/
    186    switch(enum_type){
    187       case(SMBarmaEnum):
    188          arenum_type    = SmbValuesAutoregressionEnum;
    189          basinenum_type = SmbBasinsIdEnum;
    190          noiseenum_type = SmbARMANoiseEnum;
    191          outenum_type   = SmbMassBalanceEnum;
    192          break;
    193       case(FrontalForcingsRignotarmaEnum):
    194          arenum_type    = ThermalforcingValuesAutoregressionEnum;
    195          basinenum_type = FrontalForcingsBasinIdEnum;
    196          noiseenum_type = ThermalforcingARMANoiseEnum;
    197          outenum_type   = ThermalForcingEnum;
    198          break;
    199                 case(BasalforcingsDeepwaterMeltingRatearmaEnum):
    200          arenum_type    = BasalforcingsDeepwaterMeltingRateValuesAutoregressionEnum;
    201          basinenum_type = BasalforcingsLinearBasinIdEnum;
    202          noiseenum_type = BasalforcingsDeepwaterMeltingRateNoiseEnum;
    203          outenum_type   = BasalforcingsSpatialDeepwaterMeltingRateEnum;
    204          break;
    205    }
    206 
    207         /*Get time parameters*/
    208    this->parameters->FindParam(&time,TimeEnum);
    209    this->parameters->FindParam(&dt,TimesteppingTimeStepEnum);
    210    this->parameters->FindParam(&starttime,TimesteppingStartTimeEnum);
    211 
    212    /*Get basin coefficients*/
    213    this->GetInputValue(&basinid,basinenum_type);
    214         for(int ii=0;ii<arorder;ii++) lagcoefs_basin[ii] = lagcoefs[basinid*arorder+ii];
    215    termconstant_basin   = termconstant[basinid];
    216    trend_basin   = trend[basinid];
    217 
    218         /*Initialze autoregressive values at first time step*/
    219         if(time<=starttime+dt){
    220                 IssmDouble* initvaluesautoregression = xNewZeroInit<IssmDouble>(numvertices*arorder);
    221                 for(int i=0;i<numvertices*arorder;i++) initvaluesautoregression[i]=termconstant_basin;
    222       this->inputs->SetArrayInput(arenum_type,this->lid,initvaluesautoregression,numvertices*arorder);
    223       xDelete<IssmDouble>(initvaluesautoregression);
    224         }
    225 
    226    /*Get noise and autoregressive terms*/
    227         if(isfieldstochastic){
    228       noiseterm_input = this->GetInput(noiseenum_type);
    229       Gauss* gauss = this->NewGauss();
    230       noiseterm_input->GetInputValue(&noiseterm,gauss);
    231       delete gauss;
    232    }
    233    else noiseterm = 0.0;
    234    this->inputs->GetArray(arenum_type,this->lid,&valuesautoregression,&M);
    235 
    236         /*If not AR model timestep: take the old values of variable*/
    237    if(isstepforar==false){
    238       for(int i=0;i<numvertices;i++) varlist[i]=valuesautoregression[i];
    239    }
    240    /*If AR model timestep: compute variable values on vertices from AR*/
    241    else{
    242       for(int v=0;v<numvertices;v++){
    243 
    244          /*Compute autoregressive term*/
    245          IssmDouble autoregressionterm=0.;
    246          for(int ii=0;ii<arorder;ii++) autoregressionterm += lagcoefs_basin[ii]*(valuesautoregression[v+ii*numvertices]-(termconstant_basin+trend_basin*(telapsed_ar-(ii+1)*tstep_ar)));
    247 
    248          /*Stochastic variable value*/
    249          varlist[v] = termconstant_basin+trend_basin*telapsed_ar+autoregressionterm+noiseterm;
    250       }
    251       /*Update autoregression values*/
    252       IssmDouble* temparray = xNew<IssmDouble>(numvertices*arorder);
    253       /*Assign newest values and shift older values*/
    254       for(int i=0;i<numvertices;i++) temparray[i] = varlist[i];
    255       for(int i=0;i<(arorder-1)*numvertices;i++) temparray[i+numvertices] = valuesautoregression[i];
    256       this->inputs->SetArrayInput(arenum_type,this->lid,temparray,numvertices*arorder);
    257       xDelete<IssmDouble>(temparray);
    258    }
    259 
    260    /*Add input to element*/
    261    this->AddInput(outenum_type,varlist,P1Enum);
    262 
    263    /*Cleanup*/
    264    xDelete<IssmDouble>(lagcoefs_basin);
    265    xDelete<IssmDouble>(varlist);
    266    xDelete<IssmDouble>(valuesautoregression);
    267 }/*}}}*/
     203}
     204
     205/*}}}*/
    268206void       Element::BasinLinearFloatingiceMeltingRate(IssmDouble* deepwaterel,IssmDouble* upperwatermelt,IssmDouble* upperwaterel,IssmDouble* perturbation){/*{{{*/
    269207
     
    38893827         /* calculate melt rates */
    38903828         meltrates[iv]=((A*max(-bed,0.)*pow(max(qsg_basin,0.),alpha)+B)*pow(max(TF,0.),beta))/86400; //[m/s]
    3891       }
     3829                }
    38923830
    38933831      if(xIsNan<IssmDouble>(meltrates[iv])) _error_("NaN found in vector");
  • issm/trunk-jpl/src/c/classes/Elements/Element.h

    r27308 r27318  
    6868                /*bool               AnyActive(void);*/
    6969                bool               AnyFSet(void);
    70       void               ArmaProcess(bool isstepforarma,int arorder,int maorder,IssmDouble telapsed_arma,IssmDouble tstep_arma,IssmDouble* termconstant,IssmDouble* trend,IssmDouble* arlagcoefs,IssmDouble* malagcoefs,bool isfieldstochastic,int enum_type);
    71       void               Autoregression(bool isstepforar,int arorder,IssmDouble telapsed_ar,IssmDouble tstep_ar,IssmDouble* termconstant,IssmDouble* trend,IssmDouble* lagcoefs,bool isfieldstochastic,int enum_type);
     70      void               ArmaProcess_pre18Oct2022(bool isstepforarma,int arorder,int maorder,IssmDouble telapsed_arma,IssmDouble tstep_arma,IssmDouble* termconstant,IssmDouble* trend,IssmDouble* arlagcoefs,IssmDouble* malagcoefs,bool isfieldstochastic,int enum_type);
     71      void               ArmaProcess(bool isstepforarma,int arorder,int maorder,int numparams,int numbreaks,IssmDouble tstep_arma,IssmDouble* polyparams,IssmDouble* arlagcoefs,IssmDouble* malagcoefs,IssmDouble* datebreaks,bool isfieldstochastic,int enum_type);
    7272                void               BasinLinearFloatingiceMeltingRate(IssmDouble* deepwaterel,IssmDouble* upperwatermelt,IssmDouble* upperwaterel,IssmDouble* perturbation);
    7373                void               CalvingSetZeroRate(void);
  • issm/trunk-jpl/src/c/modules/FloatingiceMeltingRatex/FloatingiceMeltingRatex.cpp

    r27260 r27318  
    231231   bool isstochastic;
    232232   bool isdeepmeltingstochastic = false;
    233    int M,N,Narlagcoefs,Nmalagcoefs,arorder,maorder,numbasins,my_rank;
     233   int M,N,arorder,maorder,numbasins,numparams,numbreaks,my_rank;
    234234   femmodel->parameters->FindParam(&numbasins,BasalforcingsLinearNumBasinsEnum);
    235235        femmodel->parameters->FindParam(&arorder,BasalforcingsARMAarOrderEnum);
    236236        femmodel->parameters->FindParam(&maorder,BasalforcingsARMAmaOrderEnum);
    237    IssmDouble tinit_arma;
    238    IssmDouble* termconstant   = NULL;
    239    IssmDouble* trend          = NULL;
    240    IssmDouble* arlagcoefs     = NULL;
     237        femmodel->parameters->FindParam(&numparams,BasalforcingsLinearNumParamsEnum);
     238   femmodel->parameters->FindParam(&numbreaks,BasalforcingsLinearNumBreaksEnum);
     239   IssmDouble* datebreaks     = NULL;
     240        IssmDouble* arlagcoefs     = NULL;
    241241   IssmDouble* malagcoefs     = NULL;
    242    IssmDouble* deepwaterel    = NULL;
     242   IssmDouble* polyparams     = NULL;
     243        IssmDouble* deepwaterel    = NULL;
    243244   IssmDouble* upperwaterel   = NULL;
    244245   IssmDouble* upperwatermelt = NULL;
     
    246247
    247248        /*Get autoregressive parameters*/
    248    femmodel->parameters->FindParam(&tinit_arma,BasalforcingsARMAInitialTimeEnum);
    249    femmodel->parameters->FindParam(&termconstant,&M,BasalforcingsARMAconstEnum);              _assert_(M==numbasins);
    250    femmodel->parameters->FindParam(&trend,&M,BasalforcingsARMAtrendEnum);                     _assert_(M==numbasins);
    251    femmodel->parameters->FindParam(&arlagcoefs,&M,&Narlagcoefs,BasalforcingsARMAarlagcoefsEnum);  _assert_(M==numbasins); _assert_(Narlagcoefs==arorder);
    252    femmodel->parameters->FindParam(&malagcoefs,&M,&Nmalagcoefs,BasalforcingsARMAmalagcoefsEnum);  _assert_(M==numbasins); _assert_(Nmalagcoefs==maorder);
     249   femmodel->parameters->FindParam(&datebreaks,&M,&N,BasalforcingsARMAdatebreaksEnum);  _assert_(M==numbasins); _assert_(N==numbreaks);
     250   femmodel->parameters->FindParam(&polyparams,&M,&N,BasalforcingsARMApolyparamsEnum);  _assert_(M==numbasins); _assert_(N==numbreaks*numparams);
     251        femmodel->parameters->FindParam(&arlagcoefs,&M,&N,BasalforcingsARMAarlagcoefsEnum);  _assert_(M==numbasins); _assert_(N==arorder);
     252   femmodel->parameters->FindParam(&malagcoefs,&M,&N,BasalforcingsARMAmalagcoefsEnum);  _assert_(M==numbasins); _assert_(N==maorder);
    253253
    254254        /*Get basin-specific parameters*/
     
    269269      xDelete<int>(stochasticfields);
    270270   }
    271    /*Time elapsed with respect to ARMA model initial time*/
    272    IssmDouble telapsed_arma = time-tinit_arma;
    273271
    274272        /*Loop over each element to compute FloatingiceMeltingRate at vertices*/
     
    276274      Element* element = xDynamicCast<Element*>(object);
    277275      /*Compute ARMA*/
    278       element->ArmaProcess(isstepforarma,arorder,maorder,telapsed_arma,tstep_arma,termconstant,trend,arlagcoefs,malagcoefs,isdeepmeltingstochastic,BasalforcingsDeepwaterMeltingRatearmaEnum);
     276      element->ArmaProcess(isstepforarma,arorder,maorder,numparams,numbreaks,tstep_arma,polyparams,arlagcoefs,malagcoefs,datebreaks,isdeepmeltingstochastic,BasalforcingsDeepwaterMeltingRatearmaEnum);
    279277                element->BasinLinearFloatingiceMeltingRate(deepwaterel,upperwatermelt,upperwaterel,perturbation);
    280278        }
    281279
    282280        /*Cleanup*/
    283         xDelete<IssmDouble>(termconstant);
    284         xDelete<IssmDouble>(trend);
    285281        xDelete<IssmDouble>(arlagcoefs);
    286282        xDelete<IssmDouble>(malagcoefs);
     283        xDelete<IssmDouble>(polyparams);
     284        xDelete<IssmDouble>(datebreaks);
    287285        xDelete<IssmDouble>(deepwaterel);
    288286        xDelete<IssmDouble>(upperwaterel);
  • issm/trunk-jpl/src/c/modules/FrontalForcingsx/FrontalForcingsx.cpp

    r27285 r27318  
    5050        bool isstochastic;
    5151   bool istfstochastic = false;
    52         int M,N,Narlagcoefs,Nmalagcoefs,arorder,maorder,numbasins,my_rank;
     52        int M,N,arorder,maorder,numbasins,numparams,numbreaks,my_rank;
    5353   femmodel->parameters->FindParam(&numbasins,FrontalForcingsNumberofBasinsEnum);
     54   femmodel->parameters->FindParam(&numparams,FrontalForcingsNumberofParamsEnum);
     55   femmodel->parameters->FindParam(&numbreaks,FrontalForcingsNumberofBreaksEnum);
    5456   femmodel->parameters->FindParam(&arorder,FrontalForcingsARMAarOrderEnum);
    5557   femmodel->parameters->FindParam(&maorder,FrontalForcingsARMAmaOrderEnum);
    56    IssmDouble tinit_arma;
    57    IssmDouble* termconstant  = NULL;
    58    IssmDouble* trend         = NULL;
     58   IssmDouble* datebreaks    = NULL;
    5959   IssmDouble* arlagcoefs    = NULL;
    6060   IssmDouble* malagcoefs    = NULL;
    6161   IssmDouble* monthlyeff    = NULL;
     62        IssmDouble* polyparams    = NULL;
    6263
    63         femmodel->parameters->FindParam(&tinit_arma,FrontalForcingsARMAInitialTimeEnum);
    64    femmodel->parameters->FindParam(&termconstant,&M,FrontalForcingsARMAconstEnum);                  _assert_(M==numbasins);
    65    femmodel->parameters->FindParam(&trend,&M,FrontalForcingsARMAtrendEnum);                         _assert_(M==numbasins);
    66    femmodel->parameters->FindParam(&arlagcoefs,&M,&Narlagcoefs,FrontalForcingsARMAarlagcoefsEnum);  _assert_(M==numbasins); _assert_(Narlagcoefs==arorder);
    67    femmodel->parameters->FindParam(&malagcoefs,&M,&Nmalagcoefs,FrontalForcingsARMAmalagcoefsEnum);  _assert_(M==numbasins); _assert_(Nmalagcoefs==maorder);
    68    femmodel->parameters->FindParam(&monthlyeff,&M,&N,ThermalForcingMonthlyEffectsEnum);             _assert_(M==numbasins); _assert_(N==12);
     64   femmodel->parameters->FindParam(&datebreaks,&M,&N,FrontalForcingsARMAdatebreaksEnum); _assert_(M==numbasins); _assert_(N==numbreaks);       
     65   femmodel->parameters->FindParam(&polyparams,&M,&N,FrontalForcingsARMApolyparamsEnum); _assert_(M==numbasins); _assert_(N==numbreaks*numparams);       
     66   femmodel->parameters->FindParam(&arlagcoefs,&M,&N,FrontalForcingsARMAarlagcoefsEnum); _assert_(M==numbasins); _assert_(N==arorder);
     67   femmodel->parameters->FindParam(&malagcoefs,&M,&N,FrontalForcingsARMAmalagcoefsEnum); _assert_(M==numbasins); _assert_(N==maorder);
     68   femmodel->parameters->FindParam(&monthlyeff,&M,&N,ThermalForcingMonthlyEffectsEnum);  _assert_(M==numbasins); _assert_(N==12);
    6969
    7070        femmodel->parameters->FindParam(&isstochastic,StochasticForcingIsStochasticForcingEnum);
     
    7979                xDelete<int>(stochasticfields);
    8080        }
    81    /*Time elapsed with respect to ARMA model initial time*/
    82    IssmDouble telapsed_arma = time-tinit_arma;
    8381
    8482   /*Loop over each element to compute Thermal Forcing at vertices*/
     
    8684      Element* element = xDynamicCast<Element*>(object);
    8785                /*Compute ARMA*/
    88       element->ArmaProcess(isstepforarma,arorder,maorder,telapsed_arma,tstep_arma,termconstant,trend,arlagcoefs,malagcoefs,istfstochastic,FrontalForcingsRignotarmaEnum);
     86      element->ArmaProcess(isstepforarma,arorder,maorder,numparams,numbreaks,tstep_arma,polyparams,arlagcoefs,malagcoefs,datebreaks,istfstochastic,FrontalForcingsRignotarmaEnum);
    8987                /*Compute monthly effects*/
    9088                element->MonthlyEffectBasin(monthlyeff,FrontalForcingsRignotarmaEnum);
     
    9290
    9391   /*Cleanup*/
    94    xDelete<IssmDouble>(termconstant);
    95    xDelete<IssmDouble>(trend);
    9692   xDelete<IssmDouble>(arlagcoefs);
    9793   xDelete<IssmDouble>(malagcoefs);
    9894   xDelete<IssmDouble>(monthlyeff);
     95   xDelete<IssmDouble>(polyparams);
     96   xDelete<IssmDouble>(datebreaks);
    9997}/*}}}*/
  • issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp

    r27298 r27318  
    259259                        /*Add parameters that are not in standard nbvertices format*/
    260260         parameters->AddObject(iomodel->CopyConstantObject("md.basalforcings.num_basins",BasalforcingsLinearNumBasinsEnum));
     261         parameters->AddObject(iomodel->CopyConstantObject("md.basalforcings.num_breaks",BasalforcingsLinearNumBreaksEnum));
     262         parameters->AddObject(iomodel->CopyConstantObject("md.basalforcings.num_params",BasalforcingsLinearNumParamsEnum));
    261263         parameters->AddObject(iomodel->CopyConstantObject("md.basalforcings.ar_order",BasalforcingsARMAarOrderEnum));
    262264         parameters->AddObject(iomodel->CopyConstantObject("md.basalforcings.ma_order",BasalforcingsARMAmaOrderEnum));
    263          parameters->AddObject(iomodel->CopyConstantObject("md.basalforcings.arma_initialtime",BasalforcingsARMAInitialTimeEnum));
    264265         parameters->AddObject(iomodel->CopyConstantObject("md.basalforcings.arma_timestep",BasalforcingsARMATimestepEnum));
    265                         iomodel->FetchData(&transparam,&M,&N,"md.basalforcings.const");
    266          parameters->AddObject(new DoubleVecParam(BasalforcingsARMAconstEnum,transparam,N));
    267          xDelete<IssmDouble>(transparam);
    268          iomodel->FetchData(&transparam,&M,&N,"md.basalforcings.trend");
    269          parameters->AddObject(new DoubleVecParam(BasalforcingsARMAtrendEnum,transparam,N));
     266         iomodel->FetchData(&transparam,&M,&N,"md.basalforcings.datebreaks");
     267         parameters->AddObject(new DoubleMatParam(BasalforcingsARMAdatebreaksEnum,transparam,M,N));
     268         xDelete<IssmDouble>(transparam);
     269         iomodel->FetchData(&transparam,&M,&N,"md.basalforcings.polynomialparams");
     270         parameters->AddObject(new DoubleMatParam(BasalforcingsARMApolyparamsEnum,transparam,M,N));
    270271         xDelete<IssmDouble>(transparam);
    271272         iomodel->FetchData(&transparam,&M,&N,"md.basalforcings.arlag_coefs");
     
    435436         /*Add parameters that are not in standard nbvertices format*/
    436437         parameters->AddObject(iomodel->CopyConstantObject("md.smb.num_basins",SmbNumBasinsEnum));
     438         parameters->AddObject(iomodel->CopyConstantObject("md.smb.num_params",SmbNumParamsEnum));
     439         parameters->AddObject(iomodel->CopyConstantObject("md.smb.num_breaks",SmbNumBreaksEnum));
    437440         parameters->AddObject(iomodel->CopyConstantObject("md.smb.ar_order",SmbARMAarOrderEnum));
    438441         parameters->AddObject(iomodel->CopyConstantObject("md.smb.ma_order",SmbARMAmaOrderEnum));
    439          parameters->AddObject(iomodel->CopyConstantObject("md.smb.arma_initialtime",SmbARMAInitialTimeEnum));
    440442         parameters->AddObject(iomodel->CopyConstantObject("md.smb.arma_timestep",SmbARMATimestepEnum));
    441443         parameters->AddObject(iomodel->CopyConstantObject("md.smb.num_bins",SmbNumElevationBinsEnum));
    442          iomodel->FetchData(&transparam,&M,&N,"md.smb.const");
    443          parameters->AddObject(new DoubleVecParam(SmbARMAconstEnum,transparam,N));
    444          xDelete<IssmDouble>(transparam);
    445          iomodel->FetchData(&transparam,&M,&N,"md.smb.trend");
    446          parameters->AddObject(new DoubleVecParam(SmbARMAtrendEnum,transparam,N));
    447          xDelete<IssmDouble>(transparam);
    448          iomodel->FetchData(&transparam,&M,&N,"md.smb.arlag_coefs");
     444         iomodel->FetchData(&transparam,&M,&N,"md.smb.datebreaks");
     445         parameters->AddObject(new DoubleMatParam(SmbARMAdatebreaksEnum,transparam,M,N));
     446         xDelete<IssmDouble>(transparam);
     447         iomodel->FetchData(&transparam,&M,&N,"md.smb.polynomialparams");
     448         parameters->AddObject(new DoubleMatParam(SmbARMApolyparamsEnum,transparam,M,N));
     449         xDelete<IssmDouble>(transparam);
     450                        iomodel->FetchData(&transparam,&M,&N,"md.smb.arlag_coefs");
    449451         parameters->AddObject(new DoubleMatParam(SmbARMAarlagcoefsEnum,transparam,M,N));
    450452         xDelete<IssmDouble>(transparam);
  • issm/trunk-jpl/src/c/modules/SurfaceMassBalancex/SurfaceMassBalancex.cpp

    r27297 r27318  
    168168   bool isstochastic;
    169169   bool issmbstochastic = false;
    170    int M,N,Narlagcoefs,Nmalagcoefs,arorder,maorder,numbasins,numelevbins,my_rank;
     170   int M,N,arorder,maorder,numbasins,numparams,numbreaks,numelevbins,my_rank;
    171171   femmodel->parameters->FindParam(&numbasins,SmbNumBasinsEnum);
    172    femmodel->parameters->FindParam(&arorder,SmbARMAarOrderEnum);
     172   femmodel->parameters->FindParam(&numparams,SmbNumParamsEnum);
     173   femmodel->parameters->FindParam(&numbreaks,SmbNumBreaksEnum);
     174        femmodel->parameters->FindParam(&arorder,SmbARMAarOrderEnum);
    173175   femmodel->parameters->FindParam(&maorder,SmbARMAmaOrderEnum);
    174176   femmodel->parameters->FindParam(&numelevbins,SmbNumElevationBinsEnum);
    175    IssmDouble tinit_arma;
    176    IssmDouble* termconstant  = NULL;
    177    IssmDouble* trend         = NULL;
    178    IssmDouble* arlagcoefs    = NULL;
     177   IssmDouble* datebreaks    = NULL;
     178        IssmDouble* arlagcoefs    = NULL;
    179179   IssmDouble* malagcoefs    = NULL;
     180        IssmDouble* polyparams    = NULL;
    180181   IssmDouble* lapserates    = NULL;
    181182   IssmDouble* elevbins      = NULL;
    182183   IssmDouble* refelevation  = NULL;
    183184
    184    femmodel->parameters->FindParam(&tinit_arma,SmbARMAInitialTimeEnum);
    185    femmodel->parameters->FindParam(&termconstant,&M,SmbARMAconstEnum);                   _assert_(M==numbasins);
    186    femmodel->parameters->FindParam(&trend,&M,SmbARMAtrendEnum);                          _assert_(M==numbasins);
    187    femmodel->parameters->FindParam(&arlagcoefs,&M,&Narlagcoefs,SmbARMAarlagcoefsEnum);   _assert_(M==numbasins); _assert_(Narlagcoefs==arorder);
    188    femmodel->parameters->FindParam(&malagcoefs,&M,&Nmalagcoefs,SmbARMAmalagcoefsEnum);   _assert_(M==numbasins); _assert_(Nmalagcoefs==maorder);
     185   femmodel->parameters->FindParam(&datebreaks,&M,&N,SmbARMAdatebreaksEnum);             _assert_(M==numbasins); _assert_(N==numbreaks);
     186   femmodel->parameters->FindParam(&polyparams,&M,&N,SmbARMApolyparamsEnum);             _assert_(M==numbasins); _assert_(N==numbreaks*numparams);
     187        femmodel->parameters->FindParam(&arlagcoefs,&M,&N,SmbARMAarlagcoefsEnum);             _assert_(M==numbasins); _assert_(N==arorder);
     188   femmodel->parameters->FindParam(&malagcoefs,&M,&N,SmbARMAmalagcoefsEnum);             _assert_(M==numbasins); _assert_(N==maorder);
    189189   femmodel->parameters->FindParam(&lapserates,&M,&N,SmbLapseRatesEnum);                 _assert_(M==numbasins); _assert_(N==numelevbins);
    190190   femmodel->parameters->FindParam(&elevbins,&M,&N,SmbElevationBinsEnum);                _assert_(M==numbasins); _assert_(N==numelevbins-1);
     
    202202      xDelete<int>(stochasticfields);
    203203   }
    204    /*Time elapsed with respect to ARMA model initial time*/
    205    IssmDouble telapsed_arma = time-tinit_arma;
    206204
    207205   /*Loop over each element to compute SMB at vertices*/
     
    209207      Element* element = xDynamicCast<Element*>(object);
    210208      /*Compute ARMA*/
    211                 element->ArmaProcess(isstepforarma,arorder,maorder,telapsed_arma,tstep_arma,termconstant,trend,arlagcoefs,malagcoefs,issmbstochastic,SMBarmaEnum);
     209                element->ArmaProcess(isstepforarma,arorder,maorder,numparams,numbreaks,tstep_arma,polyparams,arlagcoefs,malagcoefs,datebreaks,issmbstochastic,SMBarmaEnum);
    212210                /*Compute lapse rate adjustment*/
    213211                element->LapseRateBasinSMB(numelevbins,lapserates,elevbins,refelevation);
     
    215213
    216214   /*Cleanup*/
    217    xDelete<IssmDouble>(termconstant);
    218    xDelete<IssmDouble>(trend);
    219215   xDelete<IssmDouble>(arlagcoefs);
    220216   xDelete<IssmDouble>(malagcoefs);
     217        xDelete<IssmDouble>(polyparams);
     218   xDelete<IssmDouble>(datebreaks);
    221219   xDelete<IssmDouble>(lapserates);
    222220   xDelete<IssmDouble>(elevbins);
  • issm/trunk-jpl/src/c/shared/Enum/Enum.vim

    r27299 r27318  
    6767syn keyword cConstant BalancethicknessStabilizationEnum
    6868syn keyword cConstant BarystaticContributionsEnum
    69 syn keyword cConstant BasalforcingsARMAInitialTimeEnum
    7069syn keyword cConstant BasalforcingsARMATimestepEnum
    7170syn keyword cConstant BasalforcingsARMAarOrderEnum
    7271syn keyword cConstant BasalforcingsARMAmaOrderEnum
    73 syn keyword cConstant BasalforcingsARMAconstEnum
    74 syn keyword cConstant BasalforcingsARMAtrendEnum
    7572syn keyword cConstant BasalforcingsBottomplumedepthEnum
    7673syn keyword cConstant BasalforcingsCrustthicknessEnum
     
    8784syn keyword cConstant BasalforcingsIsmip6TfDepthsEnum
    8885syn keyword cConstant BasalforcingsLinearNumBasinsEnum
    89 syn keyword cConstant BasalforcingsLowercrustheatEnum
     86syn keyword cConstant BasalforcingsLinearNumBreaksEnum
     87syn keyword cConstant BasalforcingsLinearNumParamsEnum
    9088syn keyword cConstant BasalforcingsMantleconductivityEnum
    9189syn keyword cConstant BasalforcingsNusseltEnum
    9290syn keyword cConstant BasalforcingsARMAarlagcoefsEnum
     91syn keyword cConstant BasalforcingsARMAdatebreaksEnum
    9392syn keyword cConstant BasalforcingsARMAmalagcoefsEnum
     93syn keyword cConstant BasalforcingsARMApolyparamsEnum
    9494syn keyword cConstant BasalforcingsIsThermalForcingEnum
     95syn keyword cConstant BasalforcingsLowercrustheatEnum
    9596syn keyword cConstant BasalforcingsPicoAverageOverturningEnum
    9697syn keyword cConstant BasalforcingsPicoAverageSalinityEnum
     
    213214syn keyword cConstant FrictionVoidRatioEnum
    214215syn keyword cConstant FrontalForcingsBasinIcefrontAreaEnum
    215 syn keyword cConstant FrontalForcingsARMAInitialTimeEnum
    216216syn keyword cConstant FrontalForcingsARMATimestepEnum
    217217syn keyword cConstant FrontalForcingsARMAarOrderEnum
    218218syn keyword cConstant FrontalForcingsARMAmaOrderEnum
    219 syn keyword cConstant FrontalForcingsARMAconstEnum
    220 syn keyword cConstant FrontalForcingsARMAtrendEnum
     219syn keyword cConstant FrontalForcingsARMAdatebreaksEnum
     220syn keyword cConstant FrontalForcingsARMApolyparamsEnum
    221221syn keyword cConstant FrontalForcingsNumberofBasinsEnum
     222syn keyword cConstant FrontalForcingsNumberofBreaksEnum
     223syn keyword cConstant FrontalForcingsNumberofParamsEnum
    222224syn keyword cConstant FrontalForcingsParamEnum
    223225syn keyword cConstant FrontalForcingsARMAarlagcoefsEnum
     
    318320syn keyword cConstant LoveMinIntegrationStepsEnum
    319321syn keyword cConstant LoveMaxIntegrationdrEnum
     322syn keyword cConstant LoveIntegrationSchemeEnum
    320323syn keyword cConstant LoveKernelsEnum
    321324syn keyword cConstant LoveMu0Enum
     
    493496syn keyword cConstant SmbAccurefEnum
    494497syn keyword cConstant SmbAdThreshEnum
    495 syn keyword cConstant SmbARMAInitialTimeEnum
    496498syn keyword cConstant SmbARMATimestepEnum
    497499syn keyword cConstant SmbARMAarOrderEnum
    498500syn keyword cConstant SmbARMAmaOrderEnum
    499501syn keyword cConstant SmbAveragingEnum
    500 syn keyword cConstant SmbARMAconstEnum
    501 syn keyword cConstant SmbARMAtrendEnum
    502502syn keyword cConstant SmbDesfacEnum
    503503syn keyword cConstant SmbDpermilEnum
     
    533533syn keyword cConstant SmbLapseRatesEnum
    534534syn keyword cConstant SmbNumBasinsEnum
     535syn keyword cConstant SmbNumBreaksEnum
    535536syn keyword cConstant SmbNumElevationBinsEnum
     537syn keyword cConstant SmbNumParamsEnum
    536538syn keyword cConstant SmbNumRequestedOutputsEnum
    537539syn keyword cConstant SmbPfacEnum
    538540syn keyword cConstant SmbARMAarlagcoefsEnum
     541syn keyword cConstant SmbARMAdatebreaksEnum
    539542syn keyword cConstant SmbARMAmalagcoefsEnum
     543syn keyword cConstant SmbARMApolyparamsEnum
    540544syn keyword cConstant SmbRdlEnum
    541545syn keyword cConstant SmbRefElevationEnum
     
    939943syn keyword cConstant SealevelUNorthEsaEnum
    940944syn keyword cConstant SealevelchangeIndicesEnum
     945syn keyword cConstant SealevelchangeConvolutionVerticesEnum
    941946syn keyword cConstant SealevelchangeAlphaIndexEnum
    942947syn keyword cConstant SealevelchangeAzimuthIndexEnum
     
    957962syn keyword cConstant SealevelchangeViscousNEnum
    958963syn keyword cConstant SealevelchangeViscousEEnum
     964syn keyword cConstant CouplingTransferCountEnum
    959965syn keyword cConstant SedimentHeadEnum
    960966syn keyword cConstant SedimentHeadOldEnum
     
    16801686syn keyword cType Cfsurfacesquare
    16811687syn keyword cType Channel
     1688syn keyword cType classes
    16821689syn keyword cType Constraint
    16831690syn keyword cType Constraints
     
    16861693syn keyword cType ControlInput
    16871694syn keyword cType Covertree
     1695syn keyword cType DatasetInput
    16881696syn keyword cType DataSetParam
    1689 syn keyword cType DatasetInput
    16901697syn keyword cType Definition
    16911698syn keyword cType DependentObject
     
    17001707syn keyword cType ElementInput
    17011708syn keyword cType ElementMatrix
     1709syn keyword cType Elements
    17021710syn keyword cType ElementVector
    1703 syn keyword cType Elements
    17041711syn keyword cType ExponentialVariogram
    17051712syn keyword cType ExternalResult
     
    17081715syn keyword cType Friction
    17091716syn keyword cType Gauss
     1717syn keyword cType GaussianVariogram
     1718syn keyword cType gaussobjects
    17101719syn keyword cType GaussPenta
    17111720syn keyword cType GaussSeg
    17121721syn keyword cType GaussTetra
    17131722syn keyword cType GaussTria
    1714 syn keyword cType GaussianVariogram
    17151723syn keyword cType GenericExternalResult
    17161724syn keyword cType GenericOption
     
    17291737syn keyword cType IssmDirectApplicInterface
    17301738syn keyword cType IssmParallelDirectApplicInterface
     1739syn keyword cType krigingobjects
    17311740syn keyword cType Load
    17321741syn keyword cType Loads
     
    17391748syn keyword cType Matice
    17401749syn keyword cType Matlitho
     1750syn keyword cType matrixobjects
    17411751syn keyword cType MatrixParam
    17421752syn keyword cType Misfit
     
    17511761syn keyword cType Observations
    17521762syn keyword cType Option
     1763syn keyword cType Options
    17531764syn keyword cType OptionUtilities
    1754 syn keyword cType Options
    17551765syn keyword cType Param
    17561766syn keyword cType Parameters
     
    17661776syn keyword cType Regionaloutput
    17671777syn keyword cType Results
     1778syn keyword cType Riftfront
    17681779syn keyword cType RiftStruct
    1769 syn keyword cType Riftfront
    17701780syn keyword cType SealevelGeometry
    17711781syn keyword cType Seg
    17721782syn keyword cType SegInput
     1783syn keyword cType Segment
    17731784syn keyword cType SegRef
    1774 syn keyword cType Segment
    17751785syn keyword cType SpcDynamic
    17761786syn keyword cType SpcStatic
     
    17911801syn keyword cType Vertex
    17921802syn keyword cType Vertices
    1793 syn keyword cType classes
    1794 syn keyword cType gaussobjects
    1795 syn keyword cType krigingobjects
    1796 syn keyword cType matrixobjects
    17971803syn keyword cType AdjointBalancethickness2Analysis
    17981804syn keyword cType AdjointBalancethicknessAnalysis
     
    18051811syn keyword cType BalancevelocityAnalysis
    18061812syn keyword cType DamageEvolutionAnalysis
     1813syn keyword cType DebrisAnalysis
    18071814syn keyword cType DepthAverageAnalysis
    18081815syn keyword cType EnthalpyAnalysis
  • issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h

    r27308 r27318  
    6161        BalancethicknessStabilizationEnum,
    6262        BarystaticContributionsEnum,
    63         BasalforcingsARMAInitialTimeEnum,
    6463        BasalforcingsARMATimestepEnum,
    6564        BasalforcingsARMAarOrderEnum,
    6665        BasalforcingsARMAmaOrderEnum,
    67         BasalforcingsARMAconstEnum,
    68         BasalforcingsARMAtrendEnum,
    6966        BasalforcingsBottomplumedepthEnum,
    7067        BasalforcingsCrustthicknessEnum,
     
    8178        BasalforcingsIsmip6TfDepthsEnum,
    8279        BasalforcingsLinearNumBasinsEnum,
    83         BasalforcingsLowercrustheatEnum,
     80        BasalforcingsLinearNumBreaksEnum,
     81        BasalforcingsLinearNumParamsEnum,
    8482        BasalforcingsMantleconductivityEnum,
    8583        BasalforcingsNusseltEnum,
    8684        BasalforcingsARMAarlagcoefsEnum,
     85        BasalforcingsARMAdatebreaksEnum,
    8786        BasalforcingsARMAmalagcoefsEnum,
     87        BasalforcingsARMApolyparamsEnum,
    8888        BasalforcingsIsThermalForcingEnum,
     89        BasalforcingsLowercrustheatEnum,
    8990        BasalforcingsPicoAverageOverturningEnum,
    9091        BasalforcingsPicoAverageSalinityEnum,
     
    207208        FrictionVoidRatioEnum,
    208209        FrontalForcingsBasinIcefrontAreaEnum,
    209         FrontalForcingsARMAInitialTimeEnum,
    210210   FrontalForcingsARMATimestepEnum,
    211211   FrontalForcingsARMAarOrderEnum,
    212212   FrontalForcingsARMAmaOrderEnum,
    213         FrontalForcingsARMAconstEnum,
    214    FrontalForcingsARMAtrendEnum,
     213   FrontalForcingsARMAdatebreaksEnum,
     214   FrontalForcingsARMApolyparamsEnum,
    215215        FrontalForcingsNumberofBasinsEnum,
     216        FrontalForcingsNumberofBreaksEnum,
     217        FrontalForcingsNumberofParamsEnum,
    216218        FrontalForcingsParamEnum,
    217219   FrontalForcingsARMAarlagcoefsEnum,
     
    488490        SmbAccurefEnum,
    489491        SmbAdThreshEnum,
    490         SmbARMAInitialTimeEnum,
    491492        SmbARMATimestepEnum,
    492493   SmbARMAarOrderEnum,
    493494   SmbARMAmaOrderEnum,
    494495        SmbAveragingEnum,
    495         SmbARMAconstEnum,
    496    SmbARMAtrendEnum,
    497496        SmbDesfacEnum,
    498497        SmbDpermilEnum,
     
    528527   SmbLapseRatesEnum,
    529528        SmbNumBasinsEnum,
     529        SmbNumBreaksEnum,
    530530        SmbNumElevationBinsEnum,
     531        SmbNumParamsEnum,
    531532        SmbNumRequestedOutputsEnum,
    532533        SmbPfacEnum,
    533534        SmbARMAarlagcoefsEnum,
     535        SmbARMAdatebreaksEnum,
    534536        SmbARMAmalagcoefsEnum,
     537        SmbARMApolyparamsEnum,
    535538        SmbRdlEnum,
    536539        SmbRefElevationEnum,
  • issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp

    r27308 r27318  
    6969                case BalancethicknessStabilizationEnum : return "BalancethicknessStabilization";
    7070                case BarystaticContributionsEnum : return "BarystaticContributions";
    71                 case BasalforcingsARMAInitialTimeEnum : return "BasalforcingsARMAInitialTime";
    7271                case BasalforcingsARMATimestepEnum : return "BasalforcingsARMATimestep";
    7372                case BasalforcingsARMAarOrderEnum : return "BasalforcingsARMAarOrder";
    7473                case BasalforcingsARMAmaOrderEnum : return "BasalforcingsARMAmaOrder";
    75                 case BasalforcingsARMAconstEnum : return "BasalforcingsARMAconst";
    76                 case BasalforcingsARMAtrendEnum : return "BasalforcingsARMAtrend";
    7774                case BasalforcingsBottomplumedepthEnum : return "BasalforcingsBottomplumedepth";
    7875                case BasalforcingsCrustthicknessEnum : return "BasalforcingsCrustthickness";
     
    8986                case BasalforcingsIsmip6TfDepthsEnum : return "BasalforcingsIsmip6TfDepths";
    9087                case BasalforcingsLinearNumBasinsEnum : return "BasalforcingsLinearNumBasins";
    91                 case BasalforcingsLowercrustheatEnum : return "BasalforcingsLowercrustheat";
     88                case BasalforcingsLinearNumBreaksEnum : return "BasalforcingsLinearNumBreaks";
     89                case BasalforcingsLinearNumParamsEnum : return "BasalforcingsLinearNumParams";
    9290                case BasalforcingsMantleconductivityEnum : return "BasalforcingsMantleconductivity";
    9391                case BasalforcingsNusseltEnum : return "BasalforcingsNusselt";
    9492                case BasalforcingsARMAarlagcoefsEnum : return "BasalforcingsARMAarlagcoefs";
     93                case BasalforcingsARMAdatebreaksEnum : return "BasalforcingsARMAdatebreaks";
    9594                case BasalforcingsARMAmalagcoefsEnum : return "BasalforcingsARMAmalagcoefs";
     95                case BasalforcingsARMApolyparamsEnum : return "BasalforcingsARMApolyparams";
    9696                case BasalforcingsIsThermalForcingEnum : return "BasalforcingsIsThermalForcing";
     97                case BasalforcingsLowercrustheatEnum : return "BasalforcingsLowercrustheat";
    9798                case BasalforcingsPicoAverageOverturningEnum : return "BasalforcingsPicoAverageOverturning";
    9899                case BasalforcingsPicoAverageSalinityEnum : return "BasalforcingsPicoAverageSalinity";
     
    215216                case FrictionVoidRatioEnum : return "FrictionVoidRatio";
    216217                case FrontalForcingsBasinIcefrontAreaEnum : return "FrontalForcingsBasinIcefrontArea";
    217                 case FrontalForcingsARMAInitialTimeEnum : return "FrontalForcingsARMAInitialTime";
    218218                case FrontalForcingsARMATimestepEnum : return "FrontalForcingsARMATimestep";
    219219                case FrontalForcingsARMAarOrderEnum : return "FrontalForcingsARMAarOrder";
    220220                case FrontalForcingsARMAmaOrderEnum : return "FrontalForcingsARMAmaOrder";
    221                 case FrontalForcingsARMAconstEnum : return "FrontalForcingsARMAconst";
    222                 case FrontalForcingsARMAtrendEnum : return "FrontalForcingsARMAtrend";
     221                case FrontalForcingsARMAdatebreaksEnum : return "FrontalForcingsARMAdatebreaks";
     222                case FrontalForcingsARMApolyparamsEnum : return "FrontalForcingsARMApolyparams";
    223223                case FrontalForcingsNumberofBasinsEnum : return "FrontalForcingsNumberofBasins";
     224                case FrontalForcingsNumberofBreaksEnum : return "FrontalForcingsNumberofBreaks";
     225                case FrontalForcingsNumberofParamsEnum : return "FrontalForcingsNumberofParams";
    224226                case FrontalForcingsParamEnum : return "FrontalForcingsParam";
    225227                case FrontalForcingsARMAarlagcoefsEnum : return "FrontalForcingsARMAarlagcoefs";
     
    496498                case SmbAccurefEnum : return "SmbAccuref";
    497499                case SmbAdThreshEnum : return "SmbAdThresh";
    498                 case SmbARMAInitialTimeEnum : return "SmbARMAInitialTime";
    499500                case SmbARMATimestepEnum : return "SmbARMATimestep";
    500501                case SmbARMAarOrderEnum : return "SmbARMAarOrder";
    501502                case SmbARMAmaOrderEnum : return "SmbARMAmaOrder";
    502503                case SmbAveragingEnum : return "SmbAveraging";
    503                 case SmbARMAconstEnum : return "SmbARMAconst";
    504                 case SmbARMAtrendEnum : return "SmbARMAtrend";
    505504                case SmbDesfacEnum : return "SmbDesfac";
    506505                case SmbDpermilEnum : return "SmbDpermil";
     
    536535                case SmbLapseRatesEnum : return "SmbLapseRates";
    537536                case SmbNumBasinsEnum : return "SmbNumBasins";
     537                case SmbNumBreaksEnum : return "SmbNumBreaks";
    538538                case SmbNumElevationBinsEnum : return "SmbNumElevationBins";
     539                case SmbNumParamsEnum : return "SmbNumParams";
    539540                case SmbNumRequestedOutputsEnum : return "SmbNumRequestedOutputs";
    540541                case SmbPfacEnum : return "SmbPfac";
    541542                case SmbARMAarlagcoefsEnum : return "SmbARMAarlagcoefs";
     543                case SmbARMAdatebreaksEnum : return "SmbARMAdatebreaks";
    542544                case SmbARMAmalagcoefsEnum : return "SmbARMAmalagcoefs";
     545                case SmbARMApolyparamsEnum : return "SmbARMApolyparams";
    543546                case SmbRdlEnum : return "SmbRdl";
    544547                case SmbRefElevationEnum : return "SmbRefElevation";
  • issm/trunk-jpl/src/c/shared/Enum/Enumjl.vim

    r27299 r27318  
    6060syn keyword juliaConstC BalancethicknessStabilizationEnum
    6161syn keyword juliaConstC BarystaticContributionsEnum
    62 syn keyword juliaConstC BasalforcingsARMAInitialTimeEnum
    6362syn keyword juliaConstC BasalforcingsARMATimestepEnum
    6463syn keyword juliaConstC BasalforcingsARMAarOrderEnum
    6564syn keyword juliaConstC BasalforcingsARMAmaOrderEnum
    66 syn keyword juliaConstC BasalforcingsARMAconstEnum
    67 syn keyword juliaConstC BasalforcingsARMAtrendEnum
    6865syn keyword juliaConstC BasalforcingsBottomplumedepthEnum
    6966syn keyword juliaConstC BasalforcingsCrustthicknessEnum
     
    8077syn keyword juliaConstC BasalforcingsIsmip6TfDepthsEnum
    8178syn keyword juliaConstC BasalforcingsLinearNumBasinsEnum
    82 syn keyword juliaConstC BasalforcingsLowercrustheatEnum
     79syn keyword juliaConstC BasalforcingsLinearNumBreaksEnum
     80syn keyword juliaConstC BasalforcingsLinearNumParamsEnum
    8381syn keyword juliaConstC BasalforcingsMantleconductivityEnum
    8482syn keyword juliaConstC BasalforcingsNusseltEnum
    8583syn keyword juliaConstC BasalforcingsARMAarlagcoefsEnum
     84syn keyword juliaConstC BasalforcingsARMAdatebreaksEnum
    8685syn keyword juliaConstC BasalforcingsARMAmalagcoefsEnum
     86syn keyword juliaConstC BasalforcingsARMApolyparamsEnum
    8787syn keyword juliaConstC BasalforcingsIsThermalForcingEnum
     88syn keyword juliaConstC BasalforcingsLowercrustheatEnum
    8889syn keyword juliaConstC BasalforcingsPicoAverageOverturningEnum
    8990syn keyword juliaConstC BasalforcingsPicoAverageSalinityEnum
     
    206207syn keyword juliaConstC FrictionVoidRatioEnum
    207208syn keyword juliaConstC FrontalForcingsBasinIcefrontAreaEnum
    208 syn keyword juliaConstC FrontalForcingsARMAInitialTimeEnum
    209209syn keyword juliaConstC FrontalForcingsARMATimestepEnum
    210210syn keyword juliaConstC FrontalForcingsARMAarOrderEnum
    211211syn keyword juliaConstC FrontalForcingsARMAmaOrderEnum
    212 syn keyword juliaConstC FrontalForcingsARMAconstEnum
    213 syn keyword juliaConstC FrontalForcingsARMAtrendEnum
     212syn keyword juliaConstC FrontalForcingsARMAdatebreaksEnum
     213syn keyword juliaConstC FrontalForcingsARMApolyparamsEnum
    214214syn keyword juliaConstC FrontalForcingsNumberofBasinsEnum
     215syn keyword juliaConstC FrontalForcingsNumberofBreaksEnum
     216syn keyword juliaConstC FrontalForcingsNumberofParamsEnum
    215217syn keyword juliaConstC FrontalForcingsParamEnum
    216218syn keyword juliaConstC FrontalForcingsARMAarlagcoefsEnum
     
    311313syn keyword juliaConstC LoveMinIntegrationStepsEnum
    312314syn keyword juliaConstC LoveMaxIntegrationdrEnum
     315syn keyword juliaConstC LoveIntegrationSchemeEnum
    313316syn keyword juliaConstC LoveKernelsEnum
    314317syn keyword juliaConstC LoveMu0Enum
     
    486489syn keyword juliaConstC SmbAccurefEnum
    487490syn keyword juliaConstC SmbAdThreshEnum
    488 syn keyword juliaConstC SmbARMAInitialTimeEnum
    489491syn keyword juliaConstC SmbARMATimestepEnum
    490492syn keyword juliaConstC SmbARMAarOrderEnum
    491493syn keyword juliaConstC SmbARMAmaOrderEnum
    492494syn keyword juliaConstC SmbAveragingEnum
    493 syn keyword juliaConstC SmbARMAconstEnum
    494 syn keyword juliaConstC SmbARMAtrendEnum
    495495syn keyword juliaConstC SmbDesfacEnum
    496496syn keyword juliaConstC SmbDpermilEnum
     
    526526syn keyword juliaConstC SmbLapseRatesEnum
    527527syn keyword juliaConstC SmbNumBasinsEnum
     528syn keyword juliaConstC SmbNumBreaksEnum
    528529syn keyword juliaConstC SmbNumElevationBinsEnum
     530syn keyword juliaConstC SmbNumParamsEnum
    529531syn keyword juliaConstC SmbNumRequestedOutputsEnum
    530532syn keyword juliaConstC SmbPfacEnum
    531533syn keyword juliaConstC SmbARMAarlagcoefsEnum
     534syn keyword juliaConstC SmbARMAdatebreaksEnum
    532535syn keyword juliaConstC SmbARMAmalagcoefsEnum
     536syn keyword juliaConstC SmbARMApolyparamsEnum
    533537syn keyword juliaConstC SmbRdlEnum
    534538syn keyword juliaConstC SmbRefElevationEnum
     
    932936syn keyword juliaConstC SealevelUNorthEsaEnum
    933937syn keyword juliaConstC SealevelchangeIndicesEnum
     938syn keyword juliaConstC SealevelchangeConvolutionVerticesEnum
    934939syn keyword juliaConstC SealevelchangeAlphaIndexEnum
    935940syn keyword juliaConstC SealevelchangeAzimuthIndexEnum
     
    950955syn keyword juliaConstC SealevelchangeViscousNEnum
    951956syn keyword juliaConstC SealevelchangeViscousEEnum
     957syn keyword juliaConstC CouplingTransferCountEnum
    952958syn keyword juliaConstC SedimentHeadEnum
    953959syn keyword juliaConstC SedimentHeadOldEnum
  • issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp

    r27308 r27318  
    6969              else if (strcmp(name,"BalancethicknessStabilization")==0) return BalancethicknessStabilizationEnum;
    7070              else if (strcmp(name,"BarystaticContributions")==0) return BarystaticContributionsEnum;
    71               else if (strcmp(name,"BasalforcingsARMAInitialTime")==0) return BasalforcingsARMAInitialTimeEnum;
    7271              else if (strcmp(name,"BasalforcingsARMATimestep")==0) return BasalforcingsARMATimestepEnum;
    7372              else if (strcmp(name,"BasalforcingsARMAarOrder")==0) return BasalforcingsARMAarOrderEnum;
    7473              else if (strcmp(name,"BasalforcingsARMAmaOrder")==0) return BasalforcingsARMAmaOrderEnum;
    75               else if (strcmp(name,"BasalforcingsARMAconst")==0) return BasalforcingsARMAconstEnum;
    76               else if (strcmp(name,"BasalforcingsARMAtrend")==0) return BasalforcingsARMAtrendEnum;
    7774              else if (strcmp(name,"BasalforcingsBottomplumedepth")==0) return BasalforcingsBottomplumedepthEnum;
    7875              else if (strcmp(name,"BasalforcingsCrustthickness")==0) return BasalforcingsCrustthicknessEnum;
     
    8986              else if (strcmp(name,"BasalforcingsIsmip6TfDepths")==0) return BasalforcingsIsmip6TfDepthsEnum;
    9087              else if (strcmp(name,"BasalforcingsLinearNumBasins")==0) return BasalforcingsLinearNumBasinsEnum;
    91               else if (strcmp(name,"BasalforcingsLowercrustheat")==0) return BasalforcingsLowercrustheatEnum;
     88              else if (strcmp(name,"BasalforcingsLinearNumBreaks")==0) return BasalforcingsLinearNumBreaksEnum;
     89              else if (strcmp(name,"BasalforcingsLinearNumParams")==0) return BasalforcingsLinearNumParamsEnum;
    9290              else if (strcmp(name,"BasalforcingsMantleconductivity")==0) return BasalforcingsMantleconductivityEnum;
    9391              else if (strcmp(name,"BasalforcingsNusselt")==0) return BasalforcingsNusseltEnum;
    9492              else if (strcmp(name,"BasalforcingsARMAarlagcoefs")==0) return BasalforcingsARMAarlagcoefsEnum;
     93              else if (strcmp(name,"BasalforcingsARMAdatebreaks")==0) return BasalforcingsARMAdatebreaksEnum;
    9594              else if (strcmp(name,"BasalforcingsARMAmalagcoefs")==0) return BasalforcingsARMAmalagcoefsEnum;
     95              else if (strcmp(name,"BasalforcingsARMApolyparams")==0) return BasalforcingsARMApolyparamsEnum;
    9696              else if (strcmp(name,"BasalforcingsIsThermalForcing")==0) return BasalforcingsIsThermalForcingEnum;
     97              else if (strcmp(name,"BasalforcingsLowercrustheat")==0) return BasalforcingsLowercrustheatEnum;
    9798              else if (strcmp(name,"BasalforcingsPicoAverageOverturning")==0) return BasalforcingsPicoAverageOverturningEnum;
    9899              else if (strcmp(name,"BasalforcingsPicoAverageSalinity")==0) return BasalforcingsPicoAverageSalinityEnum;
     
    136137              else if (strcmp(name,"ConstantsNewtonGravity")==0) return ConstantsNewtonGravityEnum;
    137138              else if (strcmp(name,"ConstantsReferencetemperature")==0) return ConstantsReferencetemperatureEnum;
    138               else if (strcmp(name,"ConstantsYts")==0) return ConstantsYtsEnum;
    139139         else stage=2;
    140140   }
    141141   if(stage==2){
    142               if (strcmp(name,"ControlInputSizeM")==0) return ControlInputSizeMEnum;
     142              if (strcmp(name,"ConstantsYts")==0) return ConstantsYtsEnum;
     143              else if (strcmp(name,"ControlInputSizeM")==0) return ControlInputSizeMEnum;
    143144              else if (strcmp(name,"ControlInputSizeN")==0) return ControlInputSizeNEnum;
    144145              else if (strcmp(name,"ControlInputInterpolation")==0) return ControlInputInterpolationEnum;
     
    218219              else if (strcmp(name,"FrictionVoidRatio")==0) return FrictionVoidRatioEnum;
    219220              else if (strcmp(name,"FrontalForcingsBasinIcefrontArea")==0) return FrontalForcingsBasinIcefrontAreaEnum;
    220               else if (strcmp(name,"FrontalForcingsARMAInitialTime")==0) return FrontalForcingsARMAInitialTimeEnum;
    221221              else if (strcmp(name,"FrontalForcingsARMATimestep")==0) return FrontalForcingsARMATimestepEnum;
    222222              else if (strcmp(name,"FrontalForcingsARMAarOrder")==0) return FrontalForcingsARMAarOrderEnum;
    223223              else if (strcmp(name,"FrontalForcingsARMAmaOrder")==0) return FrontalForcingsARMAmaOrderEnum;
    224               else if (strcmp(name,"FrontalForcingsARMAconst")==0) return FrontalForcingsARMAconstEnum;
    225               else if (strcmp(name,"FrontalForcingsARMAtrend")==0) return FrontalForcingsARMAtrendEnum;
     224              else if (strcmp(name,"FrontalForcingsARMAdatebreaks")==0) return FrontalForcingsARMAdatebreaksEnum;
     225              else if (strcmp(name,"FrontalForcingsARMApolyparams")==0) return FrontalForcingsARMApolyparamsEnum;
    226226              else if (strcmp(name,"FrontalForcingsNumberofBasins")==0) return FrontalForcingsNumberofBasinsEnum;
     227              else if (strcmp(name,"FrontalForcingsNumberofBreaks")==0) return FrontalForcingsNumberofBreaksEnum;
     228              else if (strcmp(name,"FrontalForcingsNumberofParams")==0) return FrontalForcingsNumberofParamsEnum;
    227229              else if (strcmp(name,"FrontalForcingsParam")==0) return FrontalForcingsParamEnum;
    228230              else if (strcmp(name,"FrontalForcingsARMAarlagcoefs")==0) return FrontalForcingsARMAarlagcoefsEnum;
     
    258260              else if (strcmp(name,"HydrologydcEplflipLock")==0) return HydrologydcEplflipLockEnum;
    259261              else if (strcmp(name,"HydrologydcIsefficientlayer")==0) return HydrologydcIsefficientlayerEnum;
    260               else if (strcmp(name,"HydrologydcLeakageFactor")==0) return HydrologydcLeakageFactorEnum;
    261               else if (strcmp(name,"HydrologydcMaxIter")==0) return HydrologydcMaxIterEnum;
    262262         else stage=3;
    263263   }
    264264   if(stage==3){
    265               if (strcmp(name,"HydrologydcPenaltyFactor")==0) return HydrologydcPenaltyFactorEnum;
     265              if (strcmp(name,"HydrologydcLeakageFactor")==0) return HydrologydcLeakageFactorEnum;
     266              else if (strcmp(name,"HydrologydcMaxIter")==0) return HydrologydcMaxIterEnum;
     267              else if (strcmp(name,"HydrologydcPenaltyFactor")==0) return HydrologydcPenaltyFactorEnum;
    266268              else if (strcmp(name,"HydrologydcPenaltyLock")==0) return HydrologydcPenaltyLockEnum;
    267269              else if (strcmp(name,"HydrologydcRelTol")==0) return HydrologydcRelTolEnum;
     
    381383              else if (strcmp(name,"OceanGridY")==0) return OceanGridYEnum;
    382384              else if (strcmp(name,"OutputBufferPointer")==0) return OutputBufferPointerEnum;
    383               else if (strcmp(name,"OutputBufferSizePointer")==0) return OutputBufferSizePointerEnum;
    384               else if (strcmp(name,"OutputFileName")==0) return OutputFileNameEnum;
    385385         else stage=4;
    386386   }
    387387   if(stage==4){
    388               if (strcmp(name,"OutputFilePointer")==0) return OutputFilePointerEnum;
     388              if (strcmp(name,"OutputBufferSizePointer")==0) return OutputBufferSizePointerEnum;
     389              else if (strcmp(name,"OutputFileName")==0) return OutputFileNameEnum;
     390              else if (strcmp(name,"OutputFilePointer")==0) return OutputFilePointerEnum;
    389391              else if (strcmp(name,"Outputdefinition")==0) return OutputdefinitionEnum;
    390392              else if (strcmp(name,"QmuErrName")==0) return QmuErrNameEnum;
     
    504506              else if (strcmp(name,"SmbAccugrad")==0) return SmbAccugradEnum;
    505507              else if (strcmp(name,"SmbAccuref")==0) return SmbAccurefEnum;
    506               else if (strcmp(name,"SmbAdThresh")==0) return SmbAdThreshEnum;
    507               else if (strcmp(name,"SmbARMAInitialTime")==0) return SmbARMAInitialTimeEnum;
    508508         else stage=5;
    509509   }
    510510   if(stage==5){
    511               if (strcmp(name,"SmbARMATimestep")==0) return SmbARMATimestepEnum;
     511              if (strcmp(name,"SmbAdThresh")==0) return SmbAdThreshEnum;
     512              else if (strcmp(name,"SmbARMATimestep")==0) return SmbARMATimestepEnum;
    512513              else if (strcmp(name,"SmbARMAarOrder")==0) return SmbARMAarOrderEnum;
    513514              else if (strcmp(name,"SmbARMAmaOrder")==0) return SmbARMAmaOrderEnum;
    514515              else if (strcmp(name,"SmbAveraging")==0) return SmbAveragingEnum;
    515               else if (strcmp(name,"SmbARMAconst")==0) return SmbARMAconstEnum;
    516               else if (strcmp(name,"SmbARMAtrend")==0) return SmbARMAtrendEnum;
    517516              else if (strcmp(name,"SmbDesfac")==0) return SmbDesfacEnum;
    518517              else if (strcmp(name,"SmbDpermil")==0) return SmbDpermilEnum;
     
    548547              else if (strcmp(name,"SmbLapseRates")==0) return SmbLapseRatesEnum;
    549548              else if (strcmp(name,"SmbNumBasins")==0) return SmbNumBasinsEnum;
     549              else if (strcmp(name,"SmbNumBreaks")==0) return SmbNumBreaksEnum;
    550550              else if (strcmp(name,"SmbNumElevationBins")==0) return SmbNumElevationBinsEnum;
     551              else if (strcmp(name,"SmbNumParams")==0) return SmbNumParamsEnum;
    551552              else if (strcmp(name,"SmbNumRequestedOutputs")==0) return SmbNumRequestedOutputsEnum;
    552553              else if (strcmp(name,"SmbPfac")==0) return SmbPfacEnum;
    553554              else if (strcmp(name,"SmbARMAarlagcoefs")==0) return SmbARMAarlagcoefsEnum;
     555              else if (strcmp(name,"SmbARMAdatebreaks")==0) return SmbARMAdatebreaksEnum;
    554556              else if (strcmp(name,"SmbARMAmalagcoefs")==0) return SmbARMAmalagcoefsEnum;
     557              else if (strcmp(name,"SmbARMApolyparams")==0) return SmbARMApolyparamsEnum;
    555558              else if (strcmp(name,"SmbRdl")==0) return SmbRdlEnum;
    556559              else if (strcmp(name,"SmbRefElevation")==0) return SmbRefElevationEnum;
     
    626629              else if (strcmp(name,"TransientIsdebris")==0) return TransientIsdebrisEnum;
    627630              else if (strcmp(name,"TransientIsesa")==0) return TransientIsesaEnum;
    628               else if (strcmp(name,"TransientIsgia")==0) return TransientIsgiaEnum;
    629               else if (strcmp(name,"TransientIsgroundingline")==0) return TransientIsgroundinglineEnum;
    630               else if (strcmp(name,"TransientIshydrology")==0) return TransientIshydrologyEnum;
    631631         else stage=6;
    632632   }
    633633   if(stage==6){
    634               if (strcmp(name,"TransientIsmasstransport")==0) return TransientIsmasstransportEnum;
     634              if (strcmp(name,"TransientIsgia")==0) return TransientIsgiaEnum;
     635              else if (strcmp(name,"TransientIsgroundingline")==0) return TransientIsgroundinglineEnum;
     636              else if (strcmp(name,"TransientIshydrology")==0) return TransientIshydrologyEnum;
     637              else if (strcmp(name,"TransientIsmasstransport")==0) return TransientIsmasstransportEnum;
    635638              else if (strcmp(name,"TransientIsoceantransport")==0) return TransientIsoceantransportEnum;
    636639              else if (strcmp(name,"TransientIsmovingfront")==0) return TransientIsmovingfrontEnum;
     
    749752              else if (strcmp(name,"StrOld")==0) return StrOldEnum;
    750753              else if (strcmp(name,"Str")==0) return StrEnum;
    751               else if (strcmp(name,"DeviatoricStresseffective")==0) return DeviatoricStresseffectiveEnum;
    752               else if (strcmp(name,"DeviatoricStressxx")==0) return DeviatoricStressxxEnum;
    753               else if (strcmp(name,"DeviatoricStressxy")==0) return DeviatoricStressxyEnum;
    754754         else stage=7;
    755755   }
    756756   if(stage==7){
    757               if (strcmp(name,"DeviatoricStressxz")==0) return DeviatoricStressxzEnum;
     757              if (strcmp(name,"DeviatoricStresseffective")==0) return DeviatoricStresseffectiveEnum;
     758              else if (strcmp(name,"DeviatoricStressxx")==0) return DeviatoricStressxxEnum;
     759              else if (strcmp(name,"DeviatoricStressxy")==0) return DeviatoricStressxyEnum;
     760              else if (strcmp(name,"DeviatoricStressxz")==0) return DeviatoricStressxzEnum;
    758761              else if (strcmp(name,"DeviatoricStressyy")==0) return DeviatoricStressyyEnum;
    759762              else if (strcmp(name,"DeviatoricStressyz")==0) return DeviatoricStressyzEnum;
     
    872875              else if (strcmp(name,"MaskOceanLevelset")==0) return MaskOceanLevelsetEnum;
    873876              else if (strcmp(name,"MaskIceLevelset")==0) return MaskIceLevelsetEnum;
    874               else if (strcmp(name,"MaskIceRefLevelset")==0) return MaskIceRefLevelsetEnum;
    875               else if (strcmp(name,"MasstransportSpcthickness")==0) return MasstransportSpcthicknessEnum;
    876               else if (strcmp(name,"MaterialsRheologyB")==0) return MaterialsRheologyBEnum;
    877877         else stage=8;
    878878   }
    879879   if(stage==8){
    880               if (strcmp(name,"MaterialsRheologyBbar")==0) return MaterialsRheologyBbarEnum;
     880              if (strcmp(name,"MaskIceRefLevelset")==0) return MaskIceRefLevelsetEnum;
     881              else if (strcmp(name,"MasstransportSpcthickness")==0) return MasstransportSpcthicknessEnum;
     882              else if (strcmp(name,"MaterialsRheologyB")==0) return MaterialsRheologyBEnum;
     883              else if (strcmp(name,"MaterialsRheologyBbar")==0) return MaterialsRheologyBbarEnum;
    881884              else if (strcmp(name,"MaterialsRheologyE")==0) return MaterialsRheologyEEnum;
    882885              else if (strcmp(name,"MaterialsRheologyEbar")==0) return MaterialsRheologyEbarEnum;
     
    995998              else if (strcmp(name,"SmbAccumulatedMelt")==0) return SmbAccumulatedMeltEnum;
    996999              else if (strcmp(name,"SmbAccumulatedPrecipitation")==0) return SmbAccumulatedPrecipitationEnum;
    997               else if (strcmp(name,"SmbAccumulatedRain")==0) return SmbAccumulatedRainEnum;
    998               else if (strcmp(name,"SmbAccumulatedRefreeze")==0) return SmbAccumulatedRefreezeEnum;
    999               else if (strcmp(name,"SmbAccumulatedRunoff")==0) return SmbAccumulatedRunoffEnum;
    10001000         else stage=9;
    10011001   }
    10021002   if(stage==9){
    1003               if (strcmp(name,"SmbA")==0) return SmbAEnum;
     1003              if (strcmp(name,"SmbAccumulatedRain")==0) return SmbAccumulatedRainEnum;
     1004              else if (strcmp(name,"SmbAccumulatedRefreeze")==0) return SmbAccumulatedRefreezeEnum;
     1005              else if (strcmp(name,"SmbAccumulatedRunoff")==0) return SmbAccumulatedRunoffEnum;
     1006              else if (strcmp(name,"SmbA")==0) return SmbAEnum;
    10041007              else if (strcmp(name,"SmbAdiff")==0) return SmbAdiffEnum;
    10051008              else if (strcmp(name,"SmbAValue")==0) return SmbAValueEnum;
     
    11181121              else if (strcmp(name,"StrainRatexy")==0) return StrainRatexyEnum;
    11191122              else if (strcmp(name,"StrainRatexz")==0) return StrainRatexzEnum;
    1120               else if (strcmp(name,"StrainRateyy")==0) return StrainRateyyEnum;
    1121               else if (strcmp(name,"StrainRateyz")==0) return StrainRateyzEnum;
    1122               else if (strcmp(name,"StrainRatezz")==0) return StrainRatezzEnum;
    11231123         else stage=10;
    11241124   }
    11251125   if(stage==10){
    1126               if (strcmp(name,"StressMaxPrincipal")==0) return StressMaxPrincipalEnum;
     1126              if (strcmp(name,"StrainRateyy")==0) return StrainRateyyEnum;
     1127              else if (strcmp(name,"StrainRateyz")==0) return StrainRateyzEnum;
     1128              else if (strcmp(name,"StrainRatezz")==0) return StrainRatezzEnum;
     1129              else if (strcmp(name,"StressMaxPrincipal")==0) return StressMaxPrincipalEnum;
    11271130              else if (strcmp(name,"StressTensorxx")==0) return StressTensorxxEnum;
    11281131              else if (strcmp(name,"StressTensorxy")==0) return StressTensorxyEnum;
     
    12411244              else if (strcmp(name,"Outputdefinition49")==0) return Outputdefinition49Enum;
    12421245              else if (strcmp(name,"Outputdefinition4")==0) return Outputdefinition4Enum;
    1243               else if (strcmp(name,"Outputdefinition50")==0) return Outputdefinition50Enum;
    1244               else if (strcmp(name,"Outputdefinition51")==0) return Outputdefinition51Enum;
    1245               else if (strcmp(name,"Outputdefinition52")==0) return Outputdefinition52Enum;
    12461246         else stage=11;
    12471247   }
    12481248   if(stage==11){
    1249               if (strcmp(name,"Outputdefinition53")==0) return Outputdefinition53Enum;
     1249              if (strcmp(name,"Outputdefinition50")==0) return Outputdefinition50Enum;
     1250              else if (strcmp(name,"Outputdefinition51")==0) return Outputdefinition51Enum;
     1251              else if (strcmp(name,"Outputdefinition52")==0) return Outputdefinition52Enum;
     1252              else if (strcmp(name,"Outputdefinition53")==0) return Outputdefinition53Enum;
    12501253              else if (strcmp(name,"Outputdefinition54")==0) return Outputdefinition54Enum;
    12511254              else if (strcmp(name,"Outputdefinition55")==0) return Outputdefinition55Enum;
     
    13641367              else if (strcmp(name,"DamageEvolutionAnalysis")==0) return DamageEvolutionAnalysisEnum;
    13651368              else if (strcmp(name,"DamageEvolutionSolution")==0) return DamageEvolutionSolutionEnum;
    1366               else if (strcmp(name,"DataSet")==0) return DataSetEnum;
    1367               else if (strcmp(name,"DataSetParam")==0) return DataSetParamEnum;
    1368               else if (strcmp(name,"DatasetInput")==0) return DatasetInputEnum;
    13691369         else stage=12;
    13701370   }
    13711371   if(stage==12){
    1372               if (strcmp(name,"DebrisAnalysis")==0) return DebrisAnalysisEnum;
     1372              if (strcmp(name,"DataSet")==0) return DataSetEnum;
     1373              else if (strcmp(name,"DataSetParam")==0) return DataSetParamEnum;
     1374              else if (strcmp(name,"DatasetInput")==0) return DatasetInputEnum;
     1375              else if (strcmp(name,"DebrisAnalysis")==0) return DebrisAnalysisEnum;
    13731376              else if (strcmp(name,"DebrisSolution")==0) return DebrisSolutionEnum;
    13741377              else if (strcmp(name,"DefaultAnalysis")==0) return DefaultAnalysisEnum;
     
    14871490              else if (strcmp(name,"LliboutryDuval")==0) return LliboutryDuvalEnum;
    14881491              else if (strcmp(name,"Loads")==0) return LoadsEnum;
    1489               else if (strcmp(name,"LoveAnalysis")==0) return LoveAnalysisEnum;
    1490               else if (strcmp(name,"LoveHf")==0) return LoveHfEnum;
    1491               else if (strcmp(name,"LoveHt")==0) return LoveHtEnum;
    14921492         else stage=13;
    14931493   }
    14941494   if(stage==13){
    1495               if (strcmp(name,"LoveKernelsImag")==0) return LoveKernelsImagEnum;
     1495              if (strcmp(name,"LoveAnalysis")==0) return LoveAnalysisEnum;
     1496              else if (strcmp(name,"LoveHf")==0) return LoveHfEnum;
     1497              else if (strcmp(name,"LoveHt")==0) return LoveHtEnum;
     1498              else if (strcmp(name,"LoveKernelsImag")==0) return LoveKernelsImagEnum;
    14961499              else if (strcmp(name,"LoveKernelsReal")==0) return LoveKernelsRealEnum;
    14971500              else if (strcmp(name,"LoveKf")==0) return LoveKfEnum;
     
    16101613              else if (strcmp(name,"SMBmeltcomponents")==0) return SMBmeltcomponentsEnum;
    16111614              else if (strcmp(name,"SMBpdd")==0) return SMBpddEnum;
    1612               else if (strcmp(name,"SMBpddSicopolis")==0) return SMBpddSicopolisEnum;
    1613               else if (strcmp(name,"SMBsemic")==0) return SMBsemicEnum;
    1614               else if (strcmp(name,"SSAApproximation")==0) return SSAApproximationEnum;
    16151615         else stage=14;
    16161616   }
    16171617   if(stage==14){
    1618               if (strcmp(name,"SSAFSApproximation")==0) return SSAFSApproximationEnum;
     1618              if (strcmp(name,"SMBpddSicopolis")==0) return SMBpddSicopolisEnum;
     1619              else if (strcmp(name,"SMBsemic")==0) return SMBsemicEnum;
     1620              else if (strcmp(name,"SSAApproximation")==0) return SSAApproximationEnum;
     1621              else if (strcmp(name,"SSAFSApproximation")==0) return SSAFSApproximationEnum;
    16191622              else if (strcmp(name,"SSAHOApproximation")==0) return SSAHOApproximationEnum;
    16201623              else if (strcmp(name,"Scaled")==0) return ScaledEnum;
  • issm/trunk-jpl/src/m/classes/SMBarma.m

    r27260 r27318  
    77        properties (SetAccess=public)
    88                num_basins        = 0;
    9                 const             = NaN;
    10                 trend             = NaN;
    11                 arma_initialtime  = 0;
     9                num_breaks        = 0;
     10                num_params        = 0;
    1211                arma_timestep     = 0;
    1312                ar_order          = 0;
     
    1514                ma_order          = 0;
    1615                malag_coefs       = NaN;
     16                polynomialparams  = NaN;
     17                datebreaks        = NaN;
    1718                basin_id          = NaN;
    1819                lapserates        = NaN;
     
    5354                                disp('      smb.ma_order (order of moving-average model) not specified: order of moving-average model set to 0');
    5455                        end
    55                         if (self.arma_initialtime==0)
    56                                 self.ar_initialtime = md.timestepping.start_time; %ARMA model has no prescribed initial time
    57                                 disp('      smb.arma_initialtime (initial time in the ARMA model parameterization) not specified: set to md.timestepping.start_time');
    58                         end
    5956                        if (self.arma_timestep==0)
    6057                                self.arma_timestep = md.timestepping.time_step; %ARMA model has no prescribed time step
     
    7774
    7875                        if ismember('MasstransportAnalysis',analyses),
     76                                nbas = md.smb.num_basins;
     77                                nprm = md.smb.num_params;
     78                                nbrk = md.smb.num_breaks;
    7979                                md = checkfield(md,'fieldname','smb.num_basins','numel',1,'NaN',1,'Inf',1,'>',0);
     80                                md = checkfield(md,'fieldname','smb.num_params','numel',1,'NaN',1,'Inf',1,'>',0);
     81                                md = checkfield(md,'fieldname','smb.num_breaks','numel',1,'NaN',1,'Inf',1,'>=',0);
    8082                                md = checkfield(md,'fieldname','smb.basin_id','Inf',1,'>=',0,'<=',md.smb.num_basins,'size',[md.mesh.numberofelements,1]);
    81                                 md = checkfield(md,'fieldname','smb.const','NaN',1,'Inf',1,'size',[1,md.smb.num_basins],'numel',md.smb.num_basins); %scheme fails if passed as column vector
    82                                 md = checkfield(md,'fieldname','smb.trend','NaN',1,'Inf',1,'size',[1,md.smb.num_basins],'numel',md.smb.num_basins); %scheme fails if passed as column vector
     83                                if(nbas>1 && nbrk>=1 && nprm>1)
     84                                        md = checkfield(md,'fieldname','smb.polynomialparams','NaN',1,'Inf',1,'size',[nbas,nbrk+1,nprm],'numel',nbas*(nbrk+1)*nprm);
     85                                elseif(nbas==1)
     86                                        md = checkfield(md,'fieldname','smb.polynomialparams','NaN',1,'Inf',1,'size',[nprm,nbrk+1],'numel',nbas*(nbrk+1)*nprm);
     87                                elseif(nbrk==0)
     88                                        md = checkfield(md,'fieldname','smb.polynomialparams','NaN',1,'Inf',1,'size',[nbas,nprm],'numel',nbas*(nbrk+1)*nprm);
     89                                elseif(nprm==1)
     90                                        md = checkfield(md,'fieldname','smb.polynomialparams','NaN',1,'Inf',1,'size',[nbas,nbrk+1],'numel',nbas*(nbrk+1)*nprm);
     91                                end
    8392                                md = checkfield(md,'fieldname','smb.ar_order','numel',1,'NaN',1,'Inf',1,'>=',0);
    8493                                md = checkfield(md,'fieldname','smb.ma_order','numel',1,'NaN',1,'Inf',1,'>=',0);
    85                                 md = checkfield(md,'fieldname','smb.arma_initialtime','numel',1,'NaN',1,'Inf',1);
    8694                                md = checkfield(md,'fieldname','smb.arma_timestep','numel',1,'NaN',1,'Inf',1,'>=',md.timestepping.time_step); %arma time step cannot be finer than ISSM timestep
    8795                                md = checkfield(md,'fieldname','smb.arlag_coefs','NaN',1,'Inf',1,'size',[md.smb.num_basins,md.smb.ar_order]);
    8896                                md = checkfield(md,'fieldname','smb.malag_coefs','NaN',1,'Inf',1,'size',[md.smb.num_basins,md.smb.ma_order]);
    89 
     97                               
     98                                if(nbrk>0)
     99                                        md = checkfield(md,'fieldname','smb.datebreaks','NaN',1,'Inf',1,'size',[nbas,nbrk]);
     100                                elseif(numel(md.smb.datebreaks)==0 || all(isnan(md.smb.datebreaks)))
     101                                        ;
     102                                else
     103                                        error('md.smb.num_breaks is 0 but md.smb.datebreaks is not empty');
     104                                end
    90105                                if (any(isnan(md.smb.refelevation)==0) || numel(md.smb.refelevation)>1)
    91106               md = checkfield(md,'fieldname','smb.refelevation','NaN',1,'Inf',1,'>=',0,'size',[1,md.smb.num_basins],'numel',md.smb.num_basins);
     
    114129                        fielddisplay(self,'num_basins','number of different basins [unitless]');
    115130                        fielddisplay(self,'basin_id','basin number assigned to each element [unitless]');
    116                         fielddisplay(self,'const','basin-specific constant values [m ice eq./yr]');
    117                         fielddisplay(self,'trend','basin-specific trend values [m ice eq. yr^(-2)]');
     131                        fielddisplay(self,'num_breaks','number of different breakpoints in the piecewise-polynomial (separating num_breaks+1 periods)');
     132         fielddisplay(self,'num_params','number of different parameters in the piecewise-polynomial (1:intercept only, 2:with linear trend, 3:with quadratic trend, etc.)');
     133         fielddisplay(self,'polynomialparams','coefficients for the polynomial (const,trend,quadratic,etc.),dim1 for basins,dim2 for periods,dim3 for orders');
     134         disp(sprintf('%51s  ex: polyparams=cat(3,intercepts,trendlinearcoefs,trendquadraticcoefs)',' '));
     135                        fielddisplay(self,'datebreaks','dates at which the breakpoints in the piecewise polynomial occur (1 row per basin) [yr]');
    118136                        fielddisplay(self,'ar_order','order of the autoregressive model [unitless]');
    119137                        fielddisplay(self,'ma_order','order of the moving-average model [unitless]');
    120                         fielddisplay(self,'arma_initialtime','initial time assumed in the ARMA model parameterization [yr]');
    121138                        fielddisplay(self,'arma_timestep','time resolution of the ARMA model [yr]');
    122139                        fielddisplay(self,'arlag_coefs','basin-specific vectors of AR lag coefficients [unitless]');
     
    136153
    137154                        yts=md.constants.yts;
     155                        nbas = md.smb.num_basins;
     156         nprm = md.smb.num_params;
     157         nper = md.smb.num_breaks+1;
    138158
    139159                        templapserates    = md.smb.lapserates;
     
    163183                        [nbas,nbins] = size(templapserates);
    164184
     185                        % Scale the parameters %
     186         polyparamsScaled   = md.smb.polynomialparams;
     187         polyparams2dScaled = zeros(nbas,nper*nprm);
     188                        if(nprm>1)
     189            % Case 3D %
     190            if(nbas>1 && nper>1)
     191               for(ii=[1:nprm])
     192                  polyparamsScaled(:,:,ii) = polyparamsScaled(:,:,ii)*((1/yts)^(ii));
     193               end
     194               % Fit in 2D array %
     195               for(ii=[1:nprm])
     196                  jj = 1+(ii-1)*nper;
     197                  polyparams2dScaled(:,jj:jj+nper-1) = polyparamsScaled(:,:,ii);
     198               end
     199            % Case 2D and higher-order params at increasing row index %
     200            elseif(nbas==1)
     201               for(ii=[1:nprm])
     202                  polyparamsScaled(ii,:) = polyparamsScaled(ii,:)*((1/yts)^(ii));
     203               end
     204               % Fit in row array %
     205               for(ii=[1:nprm])
     206                  jj = 1+(ii-1)*nper;
     207                  polyparams2dScaled(1,jj:jj+nper-1) = polyparamsScaled(ii,:);
     208               end
     209            % Case 2D and higher-order params at incrasing column index %
     210            elseif(nper==1)
     211               for(ii=[1:nprm])
     212                  polyparamsScaled(:,ii) = polyparamsScaled(:,ii)*((1/yts)^(ii));
     213               end
     214               % 2D array is already in correct format %
     215               polyparams2dScaled = polyparamsScaled;
     216            end
     217         else
     218                                polyparamsScaled   = polyparamsScaled*(1/yts);
     219            % 2D array is already in correct format %
     220            polyparams2dScaled = polyparamsScaled;
     221         end
     222                        if(nper==1) %a single period (no break date)
     223            dbreaks = zeros(nbas,1); %dummy
     224         else
     225            dbreaks = md.smb.datebreaks;
     226         end
     227
    165228                        WriteData(fid,prefix,'name','md.smb.model','data',13,'format','Integer');
    166229                        WriteData(fid,prefix,'object',self,'class','smb','fieldname','num_basins','format','Integer');
     230                        WriteData(fid,prefix,'object',self,'class','smb','fieldname','num_params','format','Integer');
     231                        WriteData(fid,prefix,'object',self,'class','smb','fieldname','num_breaks','format','Integer');
    167232                        WriteData(fid,prefix,'object',self,'class','smb','fieldname','ar_order','format','Integer');
    168233                        WriteData(fid,prefix,'object',self,'class','smb','fieldname','ma_order','format','Integer');
    169                         WriteData(fid,prefix,'object',self,'class','smb','fieldname','arma_initialtime','format','Double','scale',yts);
    170234                        WriteData(fid,prefix,'object',self,'class','smb','fieldname','arma_timestep','format','Double','scale',yts);
    171235                        WriteData(fid,prefix,'object',self,'class','smb','fieldname','basin_id','data',self.basin_id-1,'name','md.smb.basin_id','format','IntMat','mattype',2); %0-indexed
    172                         WriteData(fid,prefix,'object',self,'class','smb','fieldname','const','format','DoubleMat','name','md.smb.const','scale',1./yts,'yts',yts);
    173                         WriteData(fid,prefix,'object',self,'class','smb','fieldname','trend','format','DoubleMat','name','md.smb.trend','scale',1./(yts^2),'yts',yts);
     236                        WriteData(fid,prefix,'data',polyparams2dScaled,'name','md.smb.polynomialparams','format','DoubleMat');
    174237                        WriteData(fid,prefix,'object',self,'class','smb','fieldname','arlag_coefs','format','DoubleMat','name','md.smb.arlag_coefs','yts',yts);
    175                         WriteData(fid,prefix,'object',self,'class','smb','fieldname','malag_coefs','format','DoubleMat','name','md.smb.malag_coefs','yts',yts);
     238                        WriteData(fid,prefix,'object',self,'class','smb','fieldname','malag_coefs','format','DoubleMat','name','md.smb.malag_coefs','yts',yts);
     239                        WriteData(fid,prefix,'data',dbreaks,'name','md.smb.datebreaks','format','DoubleMat','scale',yts);
    176240                        WriteData(fid,prefix,'data',templapserates,'format','DoubleMat','name','md.smb.lapserates','scale',1./yts,'yts',yts);
    177241                        WriteData(fid,prefix,'data',tempelevationbins,'format','DoubleMat','name','md.smb.elevationbins');
  • issm/trunk-jpl/src/m/classes/SMBarma.py

    r27260 r27318  
    1616    def __init__(self, *args):  # {{{
    1717        self.num_basins = 0
    18         self.const = np.nan
    19         self.trend = np.nan
     18        self.num_params = 0
     19        self.num_breaks = 0
     20        self.polynomialparams = np.nan
    2021        self.ar_order = 0
    21         self.arma_initialtime = 0
    22         self.arma_timestep = 0
    2322        self.arlag_coefs = np.nan
    2423        self.malag_coefs = np.nan
     
    4241        s += '{}\n'.format(fielddisplay(self, 'num_basins', 'number of different basins [unitless]'))
    4342        s += '{}\n'.format(fielddisplay(self, 'basin_id', 'basin number assigned to each element [unitless]'))
    44         s += '{}\n'.format(fielddisplay(self, 'const', 'basin-specific constant values [m ice eq./yr]'))
    45         s += '{}\n'.format(fielddisplay(self, 'trend', 'basin-specific trend values [m ice eq. yr^(-2)]'))
     43        s += '{}\n'.format(fielddisplay(self, 'num_breaks', 'number of different breakpoints in the piecewise-polynomial (separating num_breaks+1 periods)'))
     44        s += '{}\n'.format(fielddisplay(self, 'num_params', 'number of different parameters in the piecewise-polynomial (1:intercept only, 2:with linear trend, 3:with quadratic trend, etc.)'))
     45        s += '{}\n'.format(fielddisplay(self, 'polynomialparams', 'coefficients for the polynomial (const,trend,quadratic,etc.),dim1 for basins,dim2 for periods,dim3 for orders, ex: polyparams=cat(num_params,intercepts,trendlinearcoefs,trendquadraticcoefs)'))
     46        s += '{}\n'.format(fielddisplay(self, 'datebreaks', 'dates at which the breakpoints in the piecewise polynomial occur (1 row per basin) [yr]'))
    4647        s += '{}\n'.format(fielddisplay(self, 'ar_order', 'order of the autoregressive model [unitless]'))
    4748        s += '{}\n'.format(fielddisplay(self, 'ma_order', 'order of the moving-average model [unitless]'))
    48         s += '{}\n'.format(fielddisplay(self, 'arma_initialtime', 'initial time assumed in the autoregressive model parameterization [yr]'))
    4949        s += '{}\n'.format(fielddisplay(self, 'arma_timestep', 'time resolution of the ARMA model [yr]'))
    5050        s += '{}\n'.format(fielddisplay(self, 'arlag_coefs', 'basin-specific vectors of AR lag coefficients [unitless]'))
     
    8383            self.arlag_coefs = np.zeros((self.num_basins, self.ar_order)) # Autoregression coefficients all set to 0
    8484            print('      smb.ar_order (order of autoregressive model) not specified: order of autoregressive model set to 0')
    85         if self.arma_initialtime == 0:
    86             self.arma_initialtime = md.timestepping.start_time # ARMA model has no prescribed initial time
    87             print('      smb.arma_initialtime (initial time in the ARMA model parameterization) not specified: set to md.timestepping.start_time')
    8885        if self.arma_timestep == 0:
    8986            self.arma_timestep = md.timestepping.time_step # ARMA model has no prescribed time step
     
    10097    def checkconsistency(self, md, solution, analyses):  # {{{
    10198        if 'MasstransportAnalysis' in analyses:
     99            nbas = md.smb.num_basins;
     100            nprm = md.smb.num_params;
     101            nbrk = md.smb.num_breaks;
    102102            md = checkfield(md, 'fieldname', 'smb.num_basins', 'numel', 1, 'NaN', 1, 'Inf', 1, '>', 0)
     103            md = checkfield(md, 'fieldname', 'smb.num_params', 'numel', 1, 'NaN', 1, 'Inf', 1, '>', 0)
     104            md = checkfield(md, 'fieldname', 'smb.num_breaks', 'numel', 1, 'NaN', 1, 'Inf', 1, '>=', 0)
    103105            md = checkfield(md, 'fieldname', 'smb.basin_id', 'Inf', 1, '>=', 0, '<=', md.smb.num_basins, 'size', [md.mesh.numberofelements])
    104             if len(np.shape(self.const)) == 1:
    105                 self.const = np.array([self.const])
    106                 self.trend = np.array([self.trend])
    107             md = checkfield(md, 'fieldname', 'smb.const', 'NaN', 1, 'Inf', 1, 'size', [1, md.smb.num_basins], 'numel', md.smb.num_basins) # Scheme fails if passed as column vector
    108             md = checkfield(md, 'fieldname', 'smb.trend', 'NaN', 1, 'Inf', 1, 'size', [1, md.smb.num_basins], 'numel', md.smb.num_basins) # Scheme fails if passed as column vector; NOTE: As opposed to MATLAB implementation, pass list
     106            if len(np.shape(self.polynomialparams)) == 1:
     107                self.polynomialparams = np.array([[self.polynomialparams]])
     108            if(nbas>1 and nbrk>=1 and nprm>1):
     109                md = checkfield(md,'fieldname','smb.polynomialparams','NaN',1,'Inf',1,'size',[nbas,nbrk+1,nprm],'numel',nbas*(nbrk+1)*nprm)
     110            elif(nbas==1):
     111                md = checkfield(md,'fieldname','smb.polynomialparams','NaN',1,'Inf',1,'size',[nprm,nbrk+1],'numel',nbas*(nbrk+1)*nprm)
     112            elif(nbrk==0):
     113                md = checkfield(md,'fieldname','smb.polynomialparams','NaN',1,'Inf',1,'size',[nbas,nprm],'numel',nbas*(nbrk+1)*nprm)
     114            elif(nprm==1):
     115                md = checkfield(md,'fieldname','smb.polynomialparams','NaN',1,'Inf',1,'size',[nbas,nbrk],'numel',nbas*(nbrk+1)*nprm)
    109116            md = checkfield(md, 'fieldname', 'smb.ar_order', 'numel', 1, 'NaN', 1, 'Inf', 1, '>=', 0)
    110             md = checkfield(md, 'fieldname', 'smb.arma_initialtime', 'numel', 1, 'NaN', 1, 'Inf', 1)
    111117            md = checkfield(md, 'fieldname', 'smb.arma_timestep', 'numel', 1, 'NaN', 1, 'Inf', 1, '>=', md.timestepping.time_step) # Autoregression time step cannot be finer than ISSM timestep
    112118            md = checkfield(md, 'fieldname', 'smb.arlag_coefs', 'NaN', 1, 'Inf', 1, 'size', [md.smb.num_basins, md.smb.ar_order])
    113119            md = checkfield(md, 'fieldname', 'smb.malag_coefs', 'NaN', 1, 'Inf', 1, 'size', [md.smb.num_basins, md.smb.ma_order])
    114            
     120            if(nbrk>0):
     121                md = checkfield(md, 'fieldname', 'smb.datebreaks', 'NaN', 1, 'Inf', 1, 'size', [nbas,nbrk])
     122            elif(np.size(md.smb.datebreaks)==0 or np.all(np.isnan(md.smb.datebreaks))):
     123                pass
     124            else:
     125                raise RuntimeError('md.smb.num_breaks is 0 but md.smb.datebreaks is not empty')
     126
    115127            if(np.any(np.isnan(self.refelevation) is False) or np.size(self.refelevation) > 1):
    116128                if len(np.shape(self.refelevation)) == 1:
     
    149161    def marshall(self, prefix, md, fid):  # {{{
    150162        yts = md.constants.yts
    151 
     163        nbas = md.smb.num_basins;
     164        nprm = md.smb.num_params;
     165        nper = md.smb.num_breaks+1;
    152166        templapserates    = np.copy(md.smb.lapserates)
    153167        tempelevationbins = np.copy(md.smb.elevationbins)
    154168        temprefelevation  = np.copy(md.smb.refelevation)
     169        # Scale the parameters #
     170        polyparamsScaled   = np.copy(md.smb.polynomialparams)
     171        polyparams2dScaled = np.zeros((nbas,nper*nprm))
     172        if(nprm>1):
     173            # Case 3D #
     174            if(nbas>1 and nper>1):
     175                for ii in range(nprm):
     176                    polyparamsScaled[:,:,ii] = polyparamsScaled[:,:,ii]*(1/yts)**(ii+1)
     177                # Fit in 2D array #
     178                for ii in range(nprm):
     179                    polyparams2dScaled[:,ii*nper:(ii+1)*nper] = 1*polyparamsScaled[:,:,ii]
     180            # Case 2D and higher-order params at increasing row index #
     181            elif(nbas==1):
     182                for ii in range(nprm):
     183                    polyparamsScaled[ii,:] = polyparamsScaled[ii,:]*(1/yts)**(ii+1)
     184                # Fit in row array #
     185                for ii in range(nprm):
     186                    polyparams2dScaled[0,ii*nper:(ii+1)*nper] = 1*polyparamsScaled[ii,:]
     187            # Case 2D and higher-order params at incrasing column index #
     188            elif(nper==1):
     189                for ii in range(nprm):
     190                    polyparamsScaled[:,ii] = polyparamsScaled[:,ii]*(1/yts)**(ii+1)
     191                # 2D array is already in correct format #
     192                polyparams2dScaled = np.copy(polyparamsScaled)
     193        else:
     194            polyparamsScaled   = polyparamsScaled*(1/yts)
     195            # 2D array is already in correct format #
     196            polyparams2dScaled = np.copy(polyparamsScaled)
     197       
     198        if(nper==1):
     199            dbreaks = np.zeros((nbas,1))
     200        else:
     201            dbreaks = np.copy(md.smb.datebreaks)
     202
    155203        if(np.any(np.isnan(md.smb.lapserates))):
    156204            templapserates = np.zeros((md.smb.num_basins,2))
     
    172220        WriteData(fid, prefix, 'name', 'md.smb.model', 'data', 13, 'format', 'Integer')
    173221        WriteData(fid, prefix, 'object', self, 'class', 'smb', 'fieldname', 'num_basins', 'format', 'Integer')
     222        WriteData(fid, prefix, 'object', self, 'class', 'smb', 'fieldname', 'num_breaks', 'format', 'Integer')
     223        WriteData(fid, prefix, 'object', self, 'class', 'smb', 'fieldname', 'num_params', 'format', 'Integer')
    174224        WriteData(fid, prefix, 'object', self, 'class', 'smb', 'fieldname', 'ar_order', 'format', 'Integer')
    175225        WriteData(fid, prefix, 'object', self, 'class', 'smb', 'fieldname', 'ma_order', 'format', 'Integer')
    176         WriteData(fid, prefix, 'object', self, 'class', 'smb', 'fieldname', 'arma_initialtime', 'format', 'Double', 'scale', yts)
    177226        WriteData(fid, prefix, 'object', self, 'class', 'smb', 'fieldname', 'arma_timestep', 'format', 'Double', 'scale', yts)
    178227        WriteData(fid, prefix, 'object', self, 'class', 'smb', 'fieldname', 'basin_id', 'data', self.basin_id - 1, 'name', 'md.smb.basin_id', 'format', 'IntMat', 'mattype', 2)  # 0-indexed
    179         WriteData(fid, prefix, 'object', self, 'class', 'smb', 'fieldname', 'const', 'format', 'DoubleMat', 'name', 'md.smb.const', 'scale', 1 / yts, 'yts', yts)
    180         WriteData(fid, prefix, 'object', self, 'class', 'smb', 'fieldname', 'trend', 'format', 'DoubleMat', 'name', 'md.smb.trend', 'scale', 1 / (yts ** 2), 'yts', yts)
     228        WriteData(fid, prefix, 'data', polyparams2dScaled, 'name', 'md.smb.polynomialparams', 'format', 'DoubleMat')
    181229        WriteData(fid, prefix, 'object', self, 'class', 'smb', 'fieldname', 'arlag_coefs', 'format', 'DoubleMat', 'name', 'md.smb.arlag_coefs', 'yts', yts)
    182230        WriteData(fid, prefix, 'object', self, 'class', 'smb', 'fieldname', 'malag_coefs', 'format', 'DoubleMat', 'name', 'md.smb.malag_coefs', 'yts', yts)
     231        WriteData(fid, prefix, 'data', dbreaks, 'name', 'md.smb.datebreaks', 'format', 'DoubleMat','scale',yts)
    183232        WriteData(fid, prefix, 'data', templapserates, 'name', 'md.smb.lapserates', 'format', 'DoubleMat', 'scale', 1 / yts, 'yts', yts)
    184233        WriteData(fid, prefix, 'data', tempelevationbins, 'name', 'md.smb.elevationbins', 'format', 'DoubleMat')
  • issm/trunk-jpl/src/m/classes/frontalforcingsrignotarma.m

    r27285 r27318  
    77        properties (SetAccess=public)
    88                num_basins           = 0;
    9                 const                = NaN;
    10                 trend                = NaN;
     9                num_params           = 0;
     10                num_breaks           = 0;
     11                polynomialparams     = NaN;
     12                datebreaks           = NaN;
    1113                ar_order             = 0;
    1214                ma_order             = 0;
    13                 arma_initialtime     = 0;
    1415                arma_timestep        = 0;
    1516                arlag_coefs          = NaN;
     
    5455                        if (~strcmp(solution,'TransientSolution') | md.transient.ismovingfront==0), return; end
    5556
     57                        nbas = md.frontalforcings.num_basins;
     58                        nprm = md.frontalforcings.num_params;
     59                        nbrk = md.frontalforcings.num_breaks;
    5660                        md = checkfield(md,'fieldname','frontalforcings.num_basins','numel',1,'NaN',1,'Inf',1,'>',0);
     61                        md = checkfield(md,'fieldname','frontalforcings.num_params','numel',1,'NaN',1,'Inf',1,'>',0);
     62                        md = checkfield(md,'fieldname','frontalforcings.num_breaks','numel',1,'NaN',1,'Inf',1,'>=',0);
    5763         md = checkfield(md,'fieldname','frontalforcings.basin_id','Inf',1,'>=',0,'<=',md.frontalforcings.num_basins,'size',[md.mesh.numberofelements 1]);
    5864                        md = checkfield(md,'fieldname','frontalforcings.subglacial_discharge','>=',0,'NaN',1,'Inf',1,'timeseries',1);
    59                         md = checkfield(md,'fieldname','frontalforcings.const','NaN',1,'Inf',1,'size',[1,md.frontalforcings.num_basins],'numel',md.frontalforcings.num_basins);
    60          md = checkfield(md,'fieldname','frontalforcings.trend','NaN',1,'Inf',1,'size',[1,md.frontalforcings.num_basins],'numel',md.frontalforcings.num_basins);
    61          md = checkfield(md,'fieldname','frontalforcings.ar_order','numel',1,'NaN',1,'Inf',1,'>=',0);
     65                        if(nbas>1 && nbrk>=1 && nprm>1)
     66                           md = checkfield(md,'fieldname','frontalforcings.polynomialparams','NaN',1,'Inf',1,'size',[nbas,nbrk+1,nprm],'numel',nbas*(nbrk+1)*nprm);
     67                        elseif(nbas==1)
     68                                md = checkfield(md,'fieldname','frontalforcings.polynomialparams','NaN',1,'Inf',1,'size',[nprm,nbrk+1],'numel',nbas*(nbrk+1)*nprm);
     69                        elseif(nbrk==0)
     70                                md = checkfield(md,'fieldname','frontalforcings.polynomialparams','NaN',1,'Inf',1,'size',[nbas,nprm],'numel',nbas*(nbrk+1)*nprm);
     71                        elseif(nprm==1)
     72                                md = checkfield(md,'fieldname','frontalforcings.polynomialparams','NaN',1,'Inf',1,'size',[nbas,nbrk+1],'numel',nbas*(nbrk+1)*nprm);
     73                        end
     74                        md = checkfield(md,'fieldname','frontalforcings.ar_order','numel',1,'NaN',1,'Inf',1,'>=',0);
    6275         md = checkfield(md,'fieldname','frontalforcings.ma_order','numel',1,'NaN',1,'Inf',1,'>=',0);
    63          md = checkfield(md,'fieldname','frontalforcings.arma_initialtime','numel',1,'NaN',1,'Inf',1);
    6476         md = checkfield(md,'fieldname','frontalforcings.arma_timestep','numel',1,'NaN',1,'Inf',1,'>=',md.timestepping.time_step); %ARMA time step cannot be finer than ISSM timestep
    6577                        md = checkfield(md,'fieldname','frontalforcings.arlag_coefs','NaN',1,'Inf',1,'size',[md.frontalforcings.num_basins,md.frontalforcings.ar_order]);
    6678                        md = checkfield(md,'fieldname','frontalforcings.malag_coefs','NaN',1,'Inf',1,'size',[md.frontalforcings.num_basins,md.frontalforcings.ma_order]);
     79                        if(nbrk>0)
     80                                md = checkfield(md,'fieldname','frontalforcings.datebreaks','NaN',1,'Inf',1,'size',[nbas,nbrk]);
     81                        elseif(numel(md.frontalforcings.datebreaks)==0 || all(isnan(md.frontalforcings.datebreaks)))
     82                                ;
     83                        else
     84                                error('md.frontalforcings.num_breaks is 0 but md.frontalforcings.datebreaks is not empty');
     85                        end
    6786                        if(any(~isnan(md.frontalforcings.monthly_effects)))
    6887                                md = checkfield(md,'fieldname','frontalforcings.monthly_effects','NaN',1,'Inf',1,'size',[md.frontalforcings.num_basins,12]);
     
    7594                function disp(self) % {{{
    7695                        disp(sprintf('   Frontalforcings parameters:'));
    77                         fielddisplay(self,'num_basins','number of different basins [unitless]');
     96                        fielddisplay(self,'num_basins','number of different basins');
    7897         fielddisplay(self,'basin_id','basin number assigned to each element [unitless]');
    7998         fielddisplay(self,'subglacial_discharge','sum of subglacial discharge for each basin [m/d]');
    80          fielddisplay(self,'const','basin-specific constant term [∘C]');
    81          fielddisplay(self,'trend','basin-specific trend values [∘C yr^(-1)]');
     99                        fielddisplay(self,'num_breaks','number of different breakpoints in the piecewise-polynomial (separating num_breaks+1 periods)');
     100                        fielddisplay(self,'num_params','number of different parameters in the piecewise-polynomial (1:intercept only, 2:with linear trend, 3:with quadratic trend, etc.)');
     101         fielddisplay(self,'polynomialparams','coefficients for the polynomial (const,trend,quadratic,etc.),dim1 for basins,dim2 for periods,dim3 for orders');
     102                        disp(sprintf('%51s  ex: polyparams=cat(3,intercepts,trendlinearcoefs,trendquadraticcoefs)',' '));
     103         fielddisplay(self,'datebreaks','dates at which the breakpoints in the piecewise polynomial occur (1 row per basin) [yr]');
    82104         fielddisplay(self,'ar_order','order of the autoregressive model [unitless]');
    83105         fielddisplay(self,'ma_order','order of the moving-average model [unitless]');
    84          fielddisplay(self,'arma_initialtime','initial time assumed in the ARMA model parameterization [yr]');
    85106         fielddisplay(self,'arma_timestep','time resolution of the autoregressive model [yr]');
    86107         fielddisplay(self,'arlag_coefs','basin-specific vectors of AR lag coefficients [unitless]');
     
    90111                function marshall(self,prefix,md,fid) % {{{
    91112                        yts=md.constants.yts;
     113                        nbas = md.frontalforcings.num_basins;
     114                        nprm = md.frontalforcings.num_params;
     115                        nper = md.frontalforcings.num_breaks+1;
     116                        % Scale the parameters %
     117                        polyparamsScaled   = md.frontalforcings.polynomialparams;
     118                        polyparams2dScaled = zeros(nbas,nper*nprm);
     119                        if(nprm>1)
     120                                % Case 3D %
     121                                if(nbas>1 && nper>1)
     122                                        for(ii=[1:nprm])
     123                                                polyparamsScaled(:,:,ii) = polyparamsScaled(:,:,ii)*((1/yts)^(ii-1));
     124                                        end
     125                                        % Fit in 2D array %
     126                                        for(ii=[1:nprm])
     127                                                jj = 1+(ii-1)*nper;
     128                                                polyparams2dScaled(:,jj:jj+nper-1) = polyparamsScaled(:,:,ii);
     129                                        end
     130                                % Case 2D and higher-order params at increasing row index %
     131                                elseif(nbas==1)
     132                                        for(ii=[1:nprm])
     133                                                polyparamsScaled(ii,:) = polyparamsScaled(ii,:)*((1/yts)^(ii-1));
     134                                        end
     135                                        % Fit in row array %
     136                                        for(ii=[1:nprm])
     137                                                jj = 1+(ii-1)*nper;
     138                                                polyparams2dScaled(1,jj:jj+nper-1) = polyparamsScaled(ii,:);
     139                                        end
     140                                % Case 2D and higher-order params at incrasing column index %
     141                                elseif(nper==1)
     142                                        for(ii=[1:nprm])
     143                                                polyparamsScaled(:,ii) = polyparamsScaled(:,ii)*((1/yts)^(ii-1));
     144                                        end
     145                                        % 2D array is already in correct format %
     146                                        polyparams2dScaled = polyparamsScaled;
     147                                end
     148                        else
     149                                % 2D array is already in correct format and no need for scaling %
     150                                polyparams2dScaled = polyparamsScaled;
     151                        end
    92152                        if(any(isnan(md.frontalforcings.monthly_effects))) %monthly effects not provided, set to 0
    93153                                meffects = zeros(md.frontalforcings.num_basins,12);
     
    95155                                meffects = md.frontalforcings.monthly_effects;
    96156                        end
     157                        if(nper==1) %a single period (no break date)
     158                                dbreaks = zeros(nbas,1); %dummy
     159                        else
     160                                dbreaks = md.frontalforcings.datebreaks;
     161                        end
    97162
    98163                        WriteData(fid,prefix,'name','md.frontalforcings.parameterization','data',3,'format','Integer');
    99164                        WriteData(fid,prefix,'object',self,'class','frontalforcings','fieldname','num_basins','format','Integer');
     165                        WriteData(fid,prefix,'object',self,'class','frontalforcings','fieldname','num_breaks','format','Integer');
     166                        WriteData(fid,prefix,'object',self,'class','frontalforcings','fieldname','num_params','format','Integer');
    100167                        WriteData(fid,prefix,'object',self,'class','frontalforcings','fieldname','subglacial_discharge','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1,'yts',yts);
    101168         WriteData(fid,prefix,'object',self,'class','frontalforcings','fieldname','ar_order','format','Integer');
    102169         WriteData(fid,prefix,'object',self,'class','frontalforcings','fieldname','ma_order','format','Integer');
    103          WriteData(fid,prefix,'object',self,'class','frontalforcings','fieldname','arma_initialtime','format','Double','scale',yts);
    104170         WriteData(fid,prefix,'object',self,'class','frontalforcings','fieldname','arma_timestep','format','Double','scale',yts);
    105171         WriteData(fid,prefix,'object',self,'class','frontalforcings','fieldname','basin_id','data',self.basin_id-1,'name','md.frontalforcings.basin_id','format','IntMat','mattype',2); %0-indexed
    106          WriteData(fid,prefix,'object',self,'class','frontalforcings','fieldname','const','format','DoubleMat','name','md.frontalforcings.const');
    107          WriteData(fid,prefix,'object',self,'class','frontalforcings','fieldname','trend','format','DoubleMat','name','md.frontalforcings.trend','scale',1./yts,'yts',yts);
     172         WriteData(fid,prefix,'data',polyparams2dScaled,'name','md.frontalforcings.polynomialparams','format','DoubleMat');
    108173         WriteData(fid,prefix,'object',self,'class','frontalforcings','fieldname','arlag_coefs','format','DoubleMat','name','md.frontalforcings.arlag_coefs','yts',yts);
    109174         WriteData(fid,prefix,'object',self,'class','frontalforcings','fieldname','malag_coefs','format','DoubleMat','name','md.frontalforcings.malag_coefs','yts',yts);
     175         WriteData(fid,prefix,'data',dbreaks,'name','md.frontalforcings.datebreaks','format','DoubleMat','scale',yts);
    110176         WriteData(fid,prefix,'data',meffects,'name','md.frontalforcings.monthly_effects','format','DoubleMat');
    111177                end % }}}
  • issm/trunk-jpl/src/m/classes/frontalforcingsrignotarma.py

    r27285 r27318  
    1616    def __init__(self, *args):  # {{{
    1717        self.num_basins = 0
    18         self.const = np.nan
    19         self.trend = np.nan
     18        self.num_params = 0
     19        self.num_breaks = 0
     20        self.polynomialparams = np.nan
     21        self.datebreaks       = np.nan
    2022        self.ar_order = 0
    21         self.arma_initialtime = 0
     23        self.ma_order = 0
    2224        self.arma_timestep = 0
    2325        self.arlag_coefs = np.nan
     
    3739        s += '{}\n'.format(fielddisplay(self, 'basin_id', 'basin number assigned to each element [unitless]'))
    3840        s += '{}\n'.format(fielddisplay(self, 'subglacial_discharge', 'sum of subglacial discharge for each basin [m/d]'))
    39         s += '{}\n'.format(fielddisplay(self, 'const', 'basin-specific constant values [°C]'))
    40         s += '{}\n'.format(fielddisplay(self, 'trend', 'basin-specific trend values [°C yr^(-1)]'))
     41        s += '{}\n'.format(fielddisplay(self, 'num_breaks', 'number of different breakpoints in the piecewise-polynomial (separating num_breaks+1 periods)'))
     42        s += '{}\n'.format(fielddisplay(self, 'num_params', 'number of different parameters in the piecewise-polynomial (1:intercept only, 2:with linear trend, 3:with quadratic trend, etc.)'))
     43        s += '{}\n'.format(fielddisplay(self, 'polynomialparams', 'coefficients for the polynomial (const,trend,quadratic,etc.),dim1 for basins,dim2 for periods,dim3 for orders, ex: polyparams=cat(num_params,intercepts,trendlinearcoefs,trendquadraticcoefs)'))
     44        s += '{}\n'.format(fielddisplay(self, 'datebreaks', 'dates at which the breakpoints in the piecewise polynomial occur (1 row per basin) [yr]'))
    4145        s += '{}\n'.format(fielddisplay(self, 'ar_order', 'order of the autoregressive model [unitless]'))
    4246        s += '{}\n'.format(fielddisplay(self, 'ma_order', 'order of the moving-average model [unitless]'))
    43         s += '{}\n'.format(fielddisplay(self, 'arma_initialtime', 'initial time assumed in the ARMA model parameterization [yr]'))
    4447        s += '{}\n'.format(fielddisplay(self, 'arma_timestep', 'time resolution of the ARMA model [yr]'))
    4548        s += '{}\n'.format(fielddisplay(self, 'arlag_coefs', 'basin-specific vectors of AR lag coefficients [unitless]'))
     
    6366            return md
    6467
     68        nbas = md.frontalforcings.num_basins;
     69        nprm = md.frontalforcings.num_params;
     70        nbrk = md.frontalforcings.num_breaks;
    6571        md = checkfield(md, 'fieldname', 'frontalforcings.num_basins', 'numel', 1, 'NaN', 1, 'Inf', 1, '>', 0)
     72        md = checkfield(md, 'fieldname', 'frontalforcings.num_params', 'numel', 1, 'NaN', 1, 'Inf', 1, '>', 0)
     73        md = checkfield(md, 'fieldname', 'frontalforcings.num_breaks', 'numel', 1, 'NaN', 1, 'Inf', 1, '>=', 0)
    6674        md = checkfield(md, 'fieldname', 'frontalforcings.basin_id', 'Inf', 1, '>=', 0, '<=', md.frontalforcings.num_basins, 'size', [md.mesh.numberofelements])
    6775        md = checkfield(md, 'fieldname', 'frontalforcings.subglacial_discharge', '>=', 0, 'NaN', 1, 'Inf', 1, 'timeseries', 1)
    68         if len(np.shape(self.const)) == 1:
    69             self.const = np.array([self.const])
    70             self.trend = np.array([self.trend])
    71         md = checkfield(md, 'fieldname', 'frontalforcings.const', 'NaN', 1, 'Inf', 1, 'size', [1, md.frontalforcings.num_basins], 'numel', md.frontalforcings.num_basins)
    72         md = checkfield(md, 'fieldname', 'frontalforcings.trend', 'NaN', 1, 'Inf', 1, 'size', [1, md.frontalforcings.num_basins], 'numel', md.frontalforcings.num_basins)
     76        if len(np.shape(self.polynomialparams)) == 1:
     77            self.polynomialparams = np.array([[self.polynomialparams]])
     78        if(nbas>1 and nbrk>=1 and nprm>1):
     79            md = checkfield(md,'fieldname','frontalforcings.polynomialparams','NaN',1,'Inf',1,'size',[nbas,nbrk+1,nprm],'numel',nbas*(nbrk+1)*nprm)
     80        elif(nbas==1):
     81            md = checkfield(md,'fieldname','frontalforcings.polynomialparams','NaN',1,'Inf',1,'size',[nprm,nbrk+1],'numel',nbas*(nbrk+1)*nprm)
     82        elif(nbrk==0):
     83            md = checkfield(md,'fieldname','frontalforcings.polynomialparams','NaN',1,'Inf',1,'size',[nbas,nprm],'numel',nbas*(nbrk+1)*nprm)
     84        elif(nprm==1):
     85            md = checkfield(md,'fieldname','frontalforcings.polynomialparams','NaN',1,'Inf',1,'size',[nbas,nbrk],'numel',nbas*(nbrk+1)*nprm)
    7386        md = checkfield(md, 'fieldname', 'frontalforcings.ar_order', 'numel', 1, 'NaN', 1, 'Inf', 1, '>=', 0)
    7487        md = checkfield(md, 'fieldname', 'frontalforcings.ma_order', 'numel', 1, 'NaN', 1, 'Inf', 1, '>=', 0)
    75         md = checkfield(md, 'fieldname', 'frontalforcings.arma_initialtime', 'numel', 1, 'NaN', 1, 'Inf', 1)
    7688        md = checkfield(md, 'fieldname', 'frontalforcings.arma_timestep', 'numel', 1, 'NaN', 1, 'Inf', 1, '>=', md.timestepping.time_step) # ARMA time step cannot be finer than ISSM timestep
    7789        md = checkfield(md, 'fieldname', 'frontalforcings.arlag_coefs', 'NaN', 1, 'Inf', 1, 'size', [md.frontalforcings.num_basins, md.frontalforcings.ar_order])
    7890        md = checkfield(md, 'fieldname', 'frontalforcings.malag_coefs', 'NaN', 1, 'Inf', 1, 'size', [md.frontalforcings.num_basins, md.frontalforcings.ma_order])
     91        if(nbrk>0):
     92            md = checkfield(md, 'fieldname', 'frontalforcings.datebreaks', 'NaN', 1, 'Inf', 1, 'size', [nbas,nbrk])
     93        elif(np.size(md.frontalforcings.datebreaks)==0 or np.all(np.isnan(md.frontalforcings.datebreaks))):
     94            pass
     95        else:
     96            raise RuntimeError('md.frontalforcings.num_breaks is 0 but md.frontalforcings.datebreaks is not empty')
    7997        if(np.any(np.isnan(md.frontalforcings.monthly_effects)==False)):
    8098            md = checkfield(md, 'fieldname', 'frontalforcings.monthly_effects', 'NaN', 1, 'Inf', 1, 'size', [md.frontalforcings.num_basins, 12])
     
    91109    def marshall(self, prefix, md, fid):  # {{{
    92110        yts = md.constants.yts
     111        nbas = md.frontalforcings.num_basins;
     112        nprm = md.frontalforcings.num_params;
     113        nper = md.frontalforcings.num_breaks+1;
     114        # Scale the parameters #
     115        polyparamsScaled   = np.copy(md.frontalforcings.polynomialparams)
     116        polyparams2dScaled = np.zeros((nbas,nper*nprm))
     117        if(nprm>1):
     118            # Case 3D #
     119            if(nbas>1 and nper>1):
     120                for ii in range(nprm):
     121                    polyparamsScaled[:,:,ii] = polyparamsScaled[:,:,ii]*(1/yts)**ii
     122                # Fit in 2D array #
     123                for ii in range(nprm):
     124                    polyparams2dScaled[:,ii*nper:(ii+1)*nper] = 1*polyparamsScaled[:,:,ii]
     125            # Case 2D and higher-order params at increasing row index #
     126            elif(nbas==1):
     127                for ii in range(nprm):
     128                    polyparamsScaled[ii,:] = polyparamsScaled[ii,:]*(1/yts)**ii
     129                # Fit in row array #
     130                for ii in range(nprm):
     131                    polyparams2dScaled[0,ii*nper:(ii+1)*nper] = 1*polyparamsScaled[ii,:]
     132            # Case 2D and higher-order params at incrasing column index #
     133            elif(nper==1):
     134                for ii in range(nprm):
     135                    polyparamsScaled[:,ii] = polyparamsScaled[:,ii]*(1/yts)**ii
     136                # 2D array is already in correct format #
     137                polyparams2dScaled = np.copy(polyparamsScaled)
     138        else:
     139            # 2D array is already in correct format and no need for scaling #
     140            polyparams2dScaled = np.copy(polyparamsScaled)
    93141        if(np.any(np.isnan(md.frontalforcings.monthly_effects))): #monthly effects not provided, set to 0
    94142            meffects = np.zeros((md.frontalforcings.num_basins,12))
    95143        else:
    96144            meffects = 1*md.frontalforcings.monthly_effects
     145        if(nper==1):
     146            dbreaks = np.zeros((nbas,1))
     147        else:
     148            dbreaks = np.copy(md.frontalforcings.datebreaks)
     149
    97150        WriteData(fid, prefix, 'name', 'md.frontalforcings.parameterization', 'data', 3, 'format', 'Integer')
    98151        WriteData(fid, prefix, 'object', self, 'class', 'frontalforcings', 'fieldname', 'num_basins', 'format', 'Integer')
     152        WriteData(fid, prefix, 'object', self, 'class', 'frontalforcings', 'fieldname', 'num_breaks', 'format', 'Integer')
     153        WriteData(fid, prefix, 'object', self, 'class', 'frontalforcings', 'fieldname', 'num_params', 'format', 'Integer')
    99154        WriteData(fid, prefix, 'object', self, 'class', 'frontalforcings', 'fieldname', 'subglacial_discharge', 'format', 'DoubleMat', 'mattype', 1, 'timeserieslength', md.mesh.numberofvertices + 1, 'yts', yts)
    100155        WriteData(fid, prefix, 'object', self, 'class', 'frontalforcings', 'fieldname', 'ar_order', 'format', 'Integer')
    101156        WriteData(fid, prefix, 'object', self, 'class', 'frontalforcings', 'fieldname', 'ma_order', 'format', 'Integer')
    102         WriteData(fid, prefix, 'object', self, 'class', 'frontalforcings', 'fieldname', 'arma_initialtime', 'format', 'Double', 'scale', yts)
    103157        WriteData(fid, prefix, 'object', self, 'class', 'frontalforcings', 'fieldname', 'arma_timestep', 'format', 'Double', 'scale', yts)
    104158        WriteData(fid, prefix, 'object', self, 'class', 'frontalforcings', 'fieldname', 'basin_id', 'data', self.basin_id - 1, 'name', 'md.frontalforcings.basin_id', 'format', 'IntMat', 'mattype', 2)  # 0-indexed
    105         WriteData(fid, prefix, 'object', self, 'class', 'frontalforcings', 'fieldname', 'const', 'format', 'DoubleMat', 'name', 'md.frontalforcings.const')
    106         WriteData(fid, prefix, 'object', self, 'class', 'frontalforcings', 'fieldname', 'trend', 'format', 'DoubleMat', 'name', 'md.frontalforcings.trend', 'scale', 1 / yts, 'yts', yts)
     159        WriteData(fid, prefix, 'data', polyparams2dScaled, 'name', 'md.frontalforcings.polynomialparams', 'format', 'DoubleMat')
    107160        WriteData(fid, prefix, 'object', self, 'class', 'frontalforcings', 'fieldname', 'arlag_coefs', 'format', 'DoubleMat', 'name', 'md.frontalforcings.arlag_coefs', 'yts', yts)
    108161        WriteData(fid, prefix, 'object', self, 'class', 'frontalforcings', 'fieldname', 'malag_coefs', 'format', 'DoubleMat', 'name', 'md.frontalforcings.malag_coefs', 'yts', yts)
     162        WriteData(fid, prefix, 'data', dbreaks, 'name', 'md.frontalforcings.datebreaks', 'format', 'DoubleMat','scale',yts)
    109163        WriteData(fid, prefix, 'data', meffects, 'name', 'md.frontalforcings.monthly_effects', 'format', 'DoubleMat')
    110164    # }}}
  • issm/trunk-jpl/src/m/classes/linearbasalforcingsarma.m

    r27260 r27318  
    88        properties (SetAccess=public)
    99                num_basins                = 0;
    10                 const                     = NaN;
    11       trend                     = NaN;
     10                num_params                = 0;
     11                num_breaks                = 0;
     12                polynomialparams          = NaN;
     13      datebreaks                = NaN;
    1214      ar_order                  = 0;
    1315      ma_order                  = 0;
    14       arma_initialtime          = 0;
    1516      arma_timestep             = 0;
    1617      arlag_coefs               = NaN;
     
    5960            disp('      basalforcings.ma_order (order of moving-average model) not specified: order of moving-average model set to 0');
    6061         end
    61          if (self.arma_initialtime==0)
    62             self.ar_initialtime = md.timestepping.start_time; %ARMA model has no prescribed initial time
    63             disp('      basalforcings.arma_initialtime (initial time in the ARMA model parameterization) not specified: set to md.timestepping.start_time');
    64          end
    6562         if (self.arma_timestep==0)
    6663            self.arma_timestep = md.timestepping.time_step; %ARMA model has no prescribed time step
     
    8077
    8178                        if ismember('MasstransportAnalysis',analyses) & ~(strcmp(solution,'TransientSolution') & md.transient.ismasstransport==0),
     79                                nbas = md.basalforcings.num_basins;
     80                                nprm = md.basalforcings.num_params;
     81                                nbrk = md.basalforcings.num_breaks;
    8282                                md = checkfield(md,'fieldname','basalforcings.num_basins','numel',1,'NaN',1,'Inf',1,'>',0);
     83                                md = checkfield(md,'fieldname','basalforcings.num_params','numel',1,'NaN',1,'Inf',1,'>',0);
     84                                md = checkfield(md,'fieldname','basalforcings.num_breaks','numel',1,'NaN',1,'Inf',1,'>=',0);
    8385                                md = checkfield(md,'fieldname','basalforcings.groundedice_melting_rate','NaN',1,'Inf',1,'timeseries',1);
    8486                                md = checkfield(md,'fieldname','basalforcings.deepwater_elevation','NaN',1,'Inf',1,'size',[1,md.basalforcings.num_basins],'numel',md.basalforcings.num_basins);
     
    8688                                md = checkfield(md,'fieldname','basalforcings.upperwater_elevation','NaN',1,'Inf',1,'<=',0,'size',[1,md.basalforcings.num_basins],'numel',md.basalforcings.num_basins);
    8789            md = checkfield(md,'fieldname','basalforcings.basin_id','Inf',1,'>=',0,'<=',md.basalforcings.num_basins,'size',[md.mesh.numberofelements,1]);
    88             md = checkfield(md,'fieldname','basalforcings.const','NaN',1,'Inf',1,'size',[1,md.basalforcings.num_basins],'numel',md.basalforcings.num_basins);
    89                                 md = checkfield(md,'fieldname','basalforcings.trend','NaN',1,'Inf',1,'size',[1,md.basalforcings.num_basins],'numel',md.basalforcings.num_basins);
     90            if(nbas>1 && nbrk>=1 && nprm>1)
     91                                        md = checkfield(md,'fieldname','basalforcings.polynomialparams','NaN',1,'Inf',1,'size',[nbas,nbrk+1,nprm],'numel',nbas*(nbrk+1)*nprm);
     92                                elseif(nbas==1)
     93                                        md = checkfield(md,'fieldname','basalforcings.polynomialparams','NaN',1,'Inf',1,'size',[nprm,nbrk+1],'numel',nbas*(nbrk+1)*nprm);
     94                                elseif(nbrk==0)
     95                                        md = checkfield(md,'fieldname','basalforcings.polynomialparams','NaN',1,'Inf',1,'size',[nbas,nprm],'numel',nbas*(nbrk+1)*nprm);
     96                                elseif(nprm==1)
     97                                        md = checkfield(md,'fieldname','basalforcings.polynomialparams','NaN',1,'Inf',1,'size',[nbas,nbrk+1],'numel',nbas*(nbrk+1)*nprm);
     98                                end
    9099                                md = checkfield(md,'fieldname','basalforcings.ar_order','numel',1,'NaN',1,'Inf',1,'>=',0);
    91100                                md = checkfield(md,'fieldname','basalforcings.ma_order','numel',1,'NaN',1,'Inf',1,'>=',0);
    92             md = checkfield(md,'fieldname','basalforcings.arma_initialtime','numel',1,'NaN',1,'Inf',1);
    93101            md = checkfield(md,'fieldname','basalforcings.arma_timestep','numel',1,'NaN',1,'Inf',1,'>=',md.timestepping.time_step); %moving-average time step cannot be finer than ISSM timestep
    94102            md = checkfield(md,'fieldname','basalforcings.arlag_coefs','NaN',1,'Inf',1,'size',[md.basalforcings.num_basins,md.basalforcings.ar_order]);
    95103            md = checkfield(md,'fieldname','basalforcings.malag_coefs','NaN',1,'Inf',1,'size',[md.basalforcings.num_basins,md.basalforcings.ma_order]);
     104                                if(nbrk>0)
     105                                        md = checkfield(md,'fieldname','basalforcings.datebreaks','NaN',1,'Inf',1,'size',[nbas,nbrk]);
     106                                elseif(numel(md.basalforcings.datebreaks)==0 || all(isnan(md.basalforcings.datebreaks)))
     107                                        ;
     108                                else
     109                                        error('md.basalforcings.num_breaks is 0 but md.basalforcings.datebreaks is not empty');
     110         end
    96111                        end
    97112                        if ismember('BalancethicknessAnalysis',analyses),
     
    111126                        fielddisplay(self,'num_basins','number of different basins [unitless]');
    112127         fielddisplay(self,'basin_id','basin number assigned to each element [unitless]');
    113          fielddisplay(self,'const','basin-specific constant values [m/yr]');
    114          fielddisplay(self,'trend','basin-specific trend values [m  yr^(-2)]');
    115          fielddisplay(self,'ar_order','order of the autoregressive model [unitless]');
     128         fielddisplay(self,'num_breaks','number of different breakpoints in the piecewise-polynomial (separating num_breaks+1 periods)');
     129         fielddisplay(self,'num_params','number of different parameters in the piecewise-polynomial (1:intercept only, 2:with linear trend, 3:with quadratic trend, etc.)');
     130         fielddisplay(self,'polynomialparams','coefficients for the polynomial (const,trend,quadratic,etc.),dim1 for basins,dim2 for periods,dim3 for orders');
     131         disp(sprintf('%51s  ex: polyparams=cat(3,intercepts,trendlinearcoefs,trendquadraticcoefs)',' '));
     132         fielddisplay(self,'datebreaks','dates at which the breakpoints in the piecewise polynomial occur (1 row per basin) [yr]');
     133                        fielddisplay(self,'ar_order','order of the autoregressive model [unitless]');
    116134         fielddisplay(self,'ar_order','order of the moving-average model [unitless]');
    117          fielddisplay(self,'arma_initialtime','initial time assumed in the ARMA model parameterization [yr]');
    118135         fielddisplay(self,'arma_timestep','time resolution of the ARMA model [yr]');
    119136         fielddisplay(self,'arlag_coefs','basin-specific vectors of AR lag coefficients [unitless]');
     
    129146
    130147                        yts=md.constants.yts;
     148                        nbas = md.basalforcings.num_basins;
     149         nprm = md.basalforcings.num_params;
     150         nper = md.basalforcings.num_breaks+1;
     151         % Scale the parameters %
     152         polyparamsScaled   = md.basalforcings.polynomialparams;
     153         polyparams2dScaled = zeros(nbas,nper*nprm);
     154         if(nprm>1)
     155            % Case 3D %
     156            if(nbas>1 && nper>1)
     157               for(ii=[1:nprm])
     158                  polyparamsScaled(:,:,ii) = polyparamsScaled(:,:,ii)*((1/yts)^(ii));
     159               end
     160               % Fit in 2D array %
     161               for(ii=[1:nprm])
     162                  jj = 1+(ii-1)*nper;
     163                  polyparams2dScaled(:,jj:jj+nper-1) = polyparamsScaled(:,:,ii);
     164               end
     165            % Case 2D and higher-order params at increasing row index %
     166            elseif(nbas==1)
     167               for(ii=[1:nprm])
     168                  polyparamsScaled(ii,:) = polyparamsScaled(ii,:)*((1/yts)^(ii));
     169               end
     170               % Fit in row array %
     171               for(ii=[1:nprm])
     172                  jj = 1+(ii-1)*nper;
     173                  polyparams2dScaled(1,jj:jj+nper-1) = polyparamsScaled(ii,:);
     174               end
     175            % Case 2D and higher-order params at incrasing column index %
     176            elseif(nper==1)
     177               for(ii=[1:nprm])
     178                  polyparamsScaled(:,ii) = polyparamsScaled(:,ii)*((1/yts)^(ii));
     179               end
     180               % 2D array is already in correct format %
     181               polyparams2dScaled = polyparamsScaled;
     182            end
     183         else
     184                                polyparamsScaled   = polyparamsScaled*(1/yts);
     185            % 2D array is already in correct format %
     186            polyparams2dScaled = polyparamsScaled;
     187         end
     188         if(nper==1) %a single period (no break date)
     189            dbreaks = zeros(nbas,1); %dummy
     190         else
     191            dbreaks = md.basalforcings.datebreaks;
     192         end
    131193
    132194                        WriteData(fid,prefix,'name','md.basalforcings.model','data',9,'format','Integer');
     
    134196                        WriteData(fid,prefix,'object',self,'fieldname','geothermalflux','name','md.basalforcings.geothermalflux','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1,'yts',md.constants.yts);
    135197                        WriteData(fid,prefix,'object',self,'fieldname','num_basins','format','Integer');
     198                        WriteData(fid,prefix,'object',self,'fieldname','num_params','format','Integer');
     199                        WriteData(fid,prefix,'object',self,'fieldname','num_breaks','format','Integer');
    136200         WriteData(fid,prefix,'object',self,'fieldname','ar_order','format','Integer');
    137201         WriteData(fid,prefix,'object',self,'fieldname','ma_order','format','Integer');
    138          WriteData(fid,prefix,'object',self,'fieldname','arma_initialtime','format','Double','scale',yts);
    139202         WriteData(fid,prefix,'object',self,'fieldname','arma_timestep','format','Double','scale',yts);
    140203         WriteData(fid,prefix,'object',self,'fieldname','basin_id','data',self.basin_id-1,'name','md.basalforcings.basin_id','format','IntMat','mattype',2); %0-indexed
    141          WriteData(fid,prefix,'object',self,'fieldname','const','format','DoubleMat','name','md.basalforcings.const','scale',1./yts,'yts',yts);
    142          WriteData(fid,prefix,'object',self,'fieldname','trend','format','DoubleMat','name','md.basalforcings.trend','scale',1./(yts^2),'yts',yts);
    143204         WriteData(fid,prefix,'object',self,'fieldname','arlag_coefs','format','DoubleMat','name','md.basalforcings.arlag_coefs','yts',yts);   
    144205         WriteData(fid,prefix,'object',self,'fieldname','malag_coefs','format','DoubleMat','name','md.basalforcings.malag_coefs','yts',yts);   
     206                        WriteData(fid,prefix,'data',polyparams2dScaled,'name','md.basalforcings.polynomialparams','format','DoubleMat');
     207                        WriteData(fid,prefix,'data',dbreaks,'name','md.basalforcings.datebreaks','format','DoubleMat','scale',yts);
    145208                        WriteData(fid,prefix,'object',self,'fieldname','deepwater_elevation','format','DoubleMat','name','md.basalforcings.deepwater_elevation');
    146209                        WriteData(fid,prefix,'object',self,'fieldname','upperwater_melting_rate','format','DoubleMat','name','md.basalforcings.upperwater_melting_rate','scale',1./yts);
  • issm/trunk-jpl/src/m/classes/linearbasalforcingsarma.py

    r27261 r27318  
    1515    def __init__(self, *args):  # {{{
    1616        self.num_basins = 0
    17         self.const = np.nan
    18         self.trend = np.nan
     17        self.num_params = 0
     18        self.num_breaks = 0
     19        self.polynomialparams = np.nan
     20        self.datebreaks       = np.nan
    1921        self.ar_order = 0
    2022        self.ma_order = 0
    21         self.arma_initialtime = 0
    2223        self.arma_timestep = 0
    2324        self.arlag_coefs = np.nan
     
    4243        s += '{}\n'.format(fielddisplay(self, 'num_basins', 'number of different basins [unitless]'))
    4344        s += '{}\n'.format(fielddisplay(self, 'basin_id', 'basin number assigned to each element [unitless]'))
    44         s += '{}\n'.format(fielddisplay(self, 'const', 'basin-specific constant values [m ice eq./yr]'))
    45         s += '{}\n'.format(fielddisplay(self, 'trend', 'basin-specific trend values [m ice eq. yr^(-2)]'))
     45        s += '{}\n'.format(fielddisplay(self, 'num_breaks', 'number of different breakpoints in the piecewise-polynomial (separating num_breaks+1 periods)'))
     46        s += '{}\n'.format(fielddisplay(self, 'num_params', 'number of different parameters in the piecewise-polynomial (1:intercept only, 2:with linear trend, 3:with quadratic trend, etc.)'))
     47        s += '{}\n'.format(fielddisplay(self, 'polynomialparams', 'coefficients for the polynomial (const,trend,quadratic,etc.),dim1 for basins,dim2 for periods,dim3 for orders, ex: polyparams=cat(num_params,intercepts,trendlinearcoefs,trendquadraticcoefs)'))
     48        s += '{}\n'.format(fielddisplay(self, 'datebreaks', 'dates at which the breakpoints in the piecewise polynomial occur (1 row per basin) [yr]'))
    4649        s += '{}\n'.format(fielddisplay(self, 'ar_order', 'order of the autoregressive model [unitless]'))
    4750        s += '{}\n'.format(fielddisplay(self, 'ma_order', 'order of the moving-average model [unitless]'))
    48         s += '{}\n'.format(fielddisplay(self, 'arma_initialtime', 'initial time assumed in the ARMA model parameterization [yr]'))
    4951        s += '{}\n'.format(fielddisplay(self, 'arma_timestep', 'time resolution of the ARMA model [yr]'))
    5052        s += '{}\n'.format(fielddisplay(self, 'arlag_coefs', 'basin-specific vectors of AR lag coefficients [unitless]'))
     
    7981            self.arlag_coefs = np.zeros((self.num_basins, self.ar_order)) # Autoregression coefficients all set to 0
    8082            print('      basalforcings.ar_order (order of autoregressive model) not specified: order of autoregressive model set to 0')
    81         if self.arma_initialtime == 0:
    82             self.arma_initialtime = md.timestepping.start_time # ARMA model has no prescribed initial time
    83             print('      basalforcings.arma_initialtime (initial time in the ARMA model parameterization) not specified: set to md.timestepping.start_time')
    8483        if self.arma_timestep == 0:
    8584            self.arma_timestep = md.timestepping.time_step # ARMA model has no prescribed time step
     
    9695    def checkconsistency(self, md, solution, analyses):  # {{{
    9796        if 'MasstransportAnalysis' in analyses:
     97            nbas = md.basalforcings.num_basins;
     98            nprm = md.basalforcings.num_params;
     99            nbrk = md.basalforcings.num_breaks;
    98100            md = checkfield(md, 'fieldname', 'basalforcings.num_basins', 'numel', 1, 'NaN', 1, 'Inf', 1, '>', 0)
    99101            md = checkfield(md, 'fieldname', 'basalforcings.groundedice_melting_rate', 'NaN', 1, 'Inf', 1, 'timeseries', 1)
     102            md = checkfield(md, 'fieldname', 'basalforcings.num_params', 'numel', 1, 'NaN', 1, 'Inf', 1, '>', 0)
     103            md = checkfield(md, 'fieldname', 'basalforcings.num_breaks', 'numel', 1, 'NaN', 1, 'Inf', 1, '>=', 0)
    100104
    101105            if len(np.shape(self.deepwater_elevation)) == 1:
     
    103107                self.upperwater_elevation = np.array([self.upperwater_elevation])
    104108                self.upperwater_melting_rate = np.array([self.upperwater_melting_rate])
     109            if len(np.shape(self.polynomialparams)) == 1:
     110                self.polynomialparams = np.array([[self.polynomialparams]])
     111            if(nbas>1 and nbrk>=1 and nprm>1):
     112                md = checkfield(md,'fieldname','basalforcings.polynomialparams','NaN',1,'Inf',1,'size',[nbas,nbrk+1,nprm],'numel',nbas*(nbrk+1)*nprm)
     113            elif(nbas==1):
     114                md = checkfield(md,'fieldname','basalforcings.polynomialparams','NaN',1,'Inf',1,'size',[nprm,nbrk+1],'numel',nbas*(nbrk+1)*nprm)
     115            elif(nbrk==0):
     116                md = checkfield(md,'fieldname','basalforcings.polynomialparams','NaN',1,'Inf',1,'size',[nbas,nprm],'numel',nbas*(nbrk+1)*nprm)
     117            elif(nprm==1):
     118                md = checkfield(md,'fieldname','basalforcings.polynomialparams','NaN',1,'Inf',1,'size',[nbas,nbrk],'numel',nbas*(nbrk+1)*nprm)
    105119            md = checkfield(md, 'fieldname', 'basalforcings.deepwater_elevation', 'NaN', 1, 'Inf', 1, 'size', [1, md.basalforcings.num_basins], 'numel', md.basalforcings.num_basins)
    106120            md = checkfield(md, 'fieldname', 'basalforcings.upperwater_elevation', 'NaN', 1, 'Inf', 1, '<=', 0, 'size', [1, md.basalforcings.num_basins], 'numel', md.basalforcings.num_basins)
     
    108122            md = checkfield(md, 'fieldname', 'basalforcings.basin_id', 'Inf', 1, '>=', 0, '<=', md.basalforcings.num_basins, 'size', [md.mesh.numberofelements])
    109123
    110             if len(np.shape(self.const)) == 1:
    111                 self.const = np.array([self.const])
    112                 self.trend = np.array([self.trend])
    113 
    114             md = checkfield(md, 'fieldname', 'basalforcings.const', 'NaN', 1, 'Inf', 1, 'size', [1, md.basalforcings.num_basins], 'numel', md.basalforcings.num_basins) # Scheme fails if passed as column vector
    115             md = checkfield(md, 'fieldname', 'basalforcings.trend', 'NaN', 1, 'Inf', 1, 'size', [1, md.basalforcings.num_basins], 'numel', md.basalforcings.num_basins) # Scheme fails if passed as column vector; NOTE: As opposed to MATLAB implementation, pass list
     124
    116125            md = checkfield(md, 'fieldname', 'basalforcings.ar_order', 'numel', 1, 'NaN', 1, 'Inf', 1, '>=', 0)
    117126            md = checkfield(md, 'fieldname', 'basalforcings.ma_order', 'numel', 1, 'NaN', 1, 'Inf', 1, '>=', 0)
    118             md = checkfield(md, 'fieldname', 'basalforcings.arma_initialtime', 'numel', 1, 'NaN', 1, 'Inf', 1)
    119127            md = checkfield(md, 'fieldname', 'basalforcings.arma_timestep', 'numel', 1, 'NaN', 1, 'Inf', 1, '>=', md.timestepping.time_step) # Autoregression time step cannot be finer than ISSM timestep
    120128            md = checkfield(md, 'fieldname', 'basalforcings.arlag_coefs', 'NaN', 1, 'Inf', 1, 'size', [md.basalforcings.num_basins, md.basalforcings.ar_order])
    121129            md = checkfield(md, 'fieldname', 'basalforcings.malag_coefs', 'NaN', 1, 'Inf', 1, 'size', [md.basalforcings.num_basins, md.basalforcings.ma_order])
     130            if(nbrk>0):
     131                md = checkfield(md, 'fieldname', 'basalforcings.datebreaks', 'NaN', 1, 'Inf', 1, 'size', [nbas,nbrk])
     132            elif(np.size(md.basalforcings.datebreaks)==0 or np.all(np.isnan(md.basalforcings.datebreaks))):
     133                pass
     134            else:
     135                raise RuntimeError('md.basalforcings.num_breaks is 0 but md.basalforcings.datebreaks is not empty')
     136
    122137        if 'BalancethicknessAnalysis' in analyses:
    123138            raise Exception('not implemented yet!')
     
    130145    def marshall(self, prefix, md, fid):  # {{{
    131146        yts = md.constants.yts
     147        nbas = md.basalforcings.num_basins;
     148        nprm = md.basalforcings.num_params;
     149        nper = md.basalforcings.num_breaks+1;
     150        # Scale the parameters #
     151        polyparamsScaled   = np.copy(md.basalforcings.polynomialparams)
     152        polyparams2dScaled = np.zeros((nbas,nper*nprm))
     153        if(nprm>1):
     154            # Case 3D #
     155            if(nbas>1 and nper>1):
     156                for ii in range(nprm):
     157                    polyparamsScaled[:,:,ii] = polyparamsScaled[:,:,ii]*(1/yts)**(ii+1)
     158                # Fit in 2D array #
     159                for ii in range(nprm):
     160                    polyparams2dScaled[:,ii*nper:(ii+1)*nper] = 1*polyparamsScaled[:,:,ii]
     161            # Case 2D and higher-order params at increasing row index #
     162            elif(nbas==1):
     163                for ii in range(nprm):
     164                    polyparamsScaled[ii,:] = polyparamsScaled[ii,:]*(1/yts)**(ii+1)
     165                # Fit in row array #
     166                for ii in range(nprm):
     167                    polyparams2dScaled[0,ii*nper:(ii+1)*nper] = 1*polyparamsScaled[ii,:]
     168            # Case 2D and higher-order params at incrasing column index #
     169            elif(nper==1):
     170                for ii in range(nprm):
     171                    polyparamsScaled[:,ii] = polyparamsScaled[:,ii]*(1/yts)**(ii+1)
     172                # 2D array is already in correct format #
     173                polyparams2dScaled = np.copy(polyparamsScaled)
     174        else:
     175            polyparamsScaled   = polyparamsScaled*(1/yts)
     176            # 2D array is already in correct format #
     177            polyparams2dScaled = np.copy(polyparamsScaled)
     178        if(nper==1):
     179            dbreaks = np.zeros((nbas,1))
     180        else:
     181            dbreaks = np.copy(md.basalforcings.datebreaks)
    132182
    133183        WriteData(fid, prefix, 'name', 'md.basalforcings.model', 'data', 9, 'format', 'Integer')
     
    135185        WriteData(fid, prefix, 'object', self, 'fieldname', 'geothermalflux', 'name', 'md.basalforcings.geothermalflux', 'format', 'DoubleMat', 'mattype', 1, 'timeserieslength', md.mesh.numberofvertices + 1, 'yts', yts)
    136186        WriteData(fid, prefix, 'object', self, 'fieldname', 'num_basins', 'format', 'Integer')
     187        WriteData(fid, prefix, 'object', self, 'fieldname', 'num_params', 'format', 'Integer')
     188        WriteData(fid, prefix, 'object', self, 'fieldname', 'num_breaks', 'format', 'Integer')
    137189        WriteData(fid, prefix, 'object', self, 'fieldname', 'ar_order', 'format', 'Integer')
    138190        WriteData(fid, prefix, 'object', self, 'fieldname', 'ma_order', 'format', 'Integer')
    139         WriteData(fid, prefix, 'object', self, 'fieldname', 'arma_initialtime', 'format', 'Double', 'scale', yts)
    140191        WriteData(fid, prefix, 'object', self, 'fieldname', 'arma_timestep', 'format', 'Double', 'scale', yts)
    141192        WriteData(fid, prefix, 'object', self, 'fieldname', 'basin_id', 'data', self.basin_id - 1, 'name', 'md.basalforcings.basin_id', 'format', 'IntMat', 'mattype', 2)  # 0-indexed
    142         WriteData(fid, prefix, 'object', self, 'fieldname', 'const', 'format', 'DoubleMat', 'name', 'md.basalforcings.const', 'scale', 1 / yts, 'yts', yts)
    143         WriteData(fid, prefix, 'object', self, 'fieldname', 'trend', 'format', 'DoubleMat', 'name', 'md.basalforcings.trend', 'scale', 1 / (yts ** 2), 'yts', yts)
     193        WriteData(fid, prefix, 'data', polyparams2dScaled, 'name', 'md.basalforcings.polynomialparams', 'format', 'DoubleMat')
    144194        WriteData(fid, prefix, 'object', self, 'fieldname', 'arlag_coefs', 'format', 'DoubleMat', 'name', 'md.basalforcings.arlag_coefs', 'yts', yts)
    145195        WriteData(fid, prefix, 'object', self, 'fieldname', 'malag_coefs', 'format', 'DoubleMat', 'name', 'md.basalforcings.malag_coefs', 'yts', yts)
     196        WriteData(fid, prefix, 'data', dbreaks, 'name', 'md.basalforcings.datebreaks', 'format', 'DoubleMat','scale',yts)
    146197        WriteData(fid, prefix, 'object', self, 'fieldname', 'deepwater_elevation', 'format', 'DoubleMat', 'name', 'md.basalforcings.deepwater_elevation')
    147198        WriteData(fid, prefix, 'object', self, 'fieldname', 'upperwater_melting_rate', 'format', 'DoubleMat', 'name', 'md.basalforcings.upperwater_melting_rate', 'scale', 1 / yts, 'yts', yts)
  • issm/trunk-jpl/test/NightlyRun/test257.m

    r27260 r27318  
    3333
    3434%SMB parameters
     35numparams                  = 2;
     36numbreaks                  = 1;
     37intercept                  = [0.5,1.0;1.0,0.6;,2.0,3.0]; %intercept values of SMB in basins [m ice eq./yr]
     38trendlin                   = [0.0,0.0;0.01,0.001;-0.01,0]; %trend values of SMB in basins [m ice eq./yr^2]
     39polynomialparams           = cat(3,intercept,trendlin);
     40datebreaks                 = [3;3;3];
     41
    3542md.timestepping.start_time = 0;
    3643md.timestepping.time_step  = 1;
    37 md.timestepping.final_time = 5;
     44md.timestepping.final_time = 7;
    3845md.smb                     = SMBarma();
    3946md.smb.num_basins          = 3; %number of basins
    4047md.smb.basin_id            = idbasin; %prescribe basin ID number to elements
    41 md.smb.const               = [0.5,1.2,1.5]; %intercept values of SMB in basins [m ice eq./yr]
    42 md.smb.trend               = [0.0,0.01,-0.01]; %trend values of SMB in basins [m ice eq./yr^2]
    43 md.smb.arma_initialtime    = md.timestepping.start_time;
     48md.smb.num_params          = numparams; %number of parameters in the polynomial
     49md.smb.num_breaks          = numbreaks; %number of breakpoints
     50md.smb.polynomialparams    = polynomialparams;
     51md.smb.datebreaks          = datebreaks;
    4452md.smb.ar_order            = 4;
    4553md.smb.ma_order            = 1;
     
    6371field_tolerances={1e-13,1e-13,1e-13,1e-13,1e-13,1e-13,...
    6472                                                1e-13,1e-13,1e-13,1e-13,1e-13,1e-13...
    65                                                 1e-13,1e-13,1e-13,1e-13,1e-13,1e-13};
     73                                                1e-12,1e-12,1e-12,1e-12,1e-12,1e-12};
    6674field_values={...
    6775        (md.results.TransientSolution(1).Vx),...
     
    7785        (md.results.TransientSolution(2).IceVolume),...
    7886        (md.results.TransientSolution(2).SmbMassBalance),...
    79         (md.results.TransientSolution(3).Vx),...
    80         (md.results.TransientSolution(3).Vy),...
    81         (md.results.TransientSolution(3).Vel),...
    82         (md.results.TransientSolution(3).Thickness),...
    83         (md.results.TransientSolution(3).IceVolume),...
    84         (md.results.TransientSolution(3).SmbMassBalance),...
     87        (md.results.TransientSolution(7).Vx),...
     88        (md.results.TransientSolution(7).Vy),...
     89        (md.results.TransientSolution(7).Vel),...
     90        (md.results.TransientSolution(7).Thickness),...
     91        (md.results.TransientSolution(7).IceVolume),...
     92        (md.results.TransientSolution(7).SmbMassBalance),...
    8593        };
  • issm/trunk-jpl/test/NightlyRun/test257.py

    r27260 r27318  
    3838
    3939# SMB parameters
     40numparams                  = 2
     41numbreaks                  = 1
     42intercept                  = np.array([[0.5,1.0],[1.0,0.6],[2.0,3.0]])
     43trendlin                   = np.array([[0.0,0.0],[0.01,0.001],[-0.01,0]])
     44polynomialparams           = np.transpose(np.stack((intercept,trendlin)),(1,2,0))
     45datebreaks                 = np.array([[3],[3],[3]]);
     46
    4047md.timestepping.start_time = 0
    4148md.timestepping.time_step = 1
    42 md.timestepping.final_time = 5
     49md.timestepping.final_time = 8
    4350md.smb = SMBarma()
    4451md.smb.num_basins = 3  # number of basins
    4552md.smb.basin_id = idbasin  # prescribe basin ID number to elements;
    46 md.smb.const = np.array([[0.5, 1.2, 1.5]])  # intercept values of SMB in basins [m ice eq./yr]
    47 md.smb.trend = np.array([[0.0, 0.01, -0.01]])  # trend values of SMB in basins [m ice eq./yr^2]
    48 md.smb.arma_initialtime = md.timestepping.start_time
     53md.smb.num_params        = numparams
     54md.smb.num_breaks        = numbreaks
     55md.smb.polynomialparams  = polynomialparams
     56md.smb.datebreaks        = datebreaks
    4957md.smb.ar_order = 4
    5058md.smb.ma_order = 1
     
    7381    1e-13, 1e-13, 1e-13, 1e-13, 1e-13, 1e-13,
    7482    1e-13, 1e-13, 1e-13, 1e-13, 1e-13, 1e-13,
    75     1e-13, 1e-13, 1e-13, 1e-13, 1e-13, 1e-13
     83    1e-12, 1e-12, 1e-12, 1e-12, 1e-12, 1e-12
    7684]
    7785field_values = [
     
    8896    md.results.TransientSolution[1].IceVolume,
    8997    md.results.TransientSolution[1].SmbMassBalance,
    90     md.results.TransientSolution[2].Vx,
    91     md.results.TransientSolution[2].Vy,
    92     md.results.TransientSolution[2].Vel,
    93     md.results.TransientSolution[2].Thickness,
    94     md.results.TransientSolution[2].IceVolume,
    95     md.results.TransientSolution[2].SmbMassBalance
     98    md.results.TransientSolution[6].Vx,
     99    md.results.TransientSolution[6].Vy,
     100    md.results.TransientSolution[6].Vel,
     101    md.results.TransientSolution[6].Thickness,
     102    md.results.TransientSolution[6].IceVolume,
     103    md.results.TransientSolution[6].SmbMassBalance
    96104]
  • issm/trunk-jpl/test/NightlyRun/test543.m

    r27261 r27318  
    4444md.levelset.spclevelset = NaN(md.mesh.numberofvertices,1);
    4545md.levelset.migration_max = 10.0; %avoid fast advance/retreat of the front
    46 %Frontal forcing parameters
     46%%% Frontal forcing parameters %%%
    4747md.frontalforcings=frontalforcingsrignotarma();
     48% Polynomial params %
     49numparams        = 3;
     50numbreaks        = 2;
     51intercept        = [2.5,2.0,0.1;0.5,0.5,1.5];
     52trendlin         = [-0.5,-0.2,0.1;0,0,0];
     53trendquad        = [0,0.0,0;0.1,0.1,0.1];
     54datebreaks       = [4,7;4,7];
     55polynomialparams = cat(numparams,intercept,trendlin,trendquad);
     56
    4857md.frontalforcings.num_basins           = nb_tf;
    4958md.frontalforcings.basin_id             = idb_tf;
     59md.frontalforcings.num_params           = numparams; %number of parameters in the polynomial
     60md.frontalforcings.num_breaks           = numbreaks; %number of breakpoints
    5061md.frontalforcings.subglacial_discharge = 0.01*ones(md.mesh.numberofvertices,1);
    51 md.frontalforcings.const                = [0.05,0.01]; %intercept values of TF in basins [C]
    52 md.frontalforcings.trend                = [0.0001,0.00001]; %trend values of TF in basins [C/yr]
    53 md.frontalforcings.arma_initialtime     = md.timestepping.start_time; %initial time in the AR model parameterization [yr]
     62md.frontalforcings.polynomialparams     = polynomialparams;
     63md.frontalforcings.datebreaks           = datebreaks;
    5464md.frontalforcings.ar_order             = 4;
    5565md.frontalforcings.ma_order             = 2;
  • issm/trunk-jpl/test/NightlyRun/test543.py

    r27261 r27318  
    4949md.levelset.spclevelset = np.full((md.mesh.numberofvertices,), np.nan)
    5050md.levelset.migration_max = 10.0
    51 #Frontal forcing parameters
     51### Frontal forcing parameters ###
    5252md.frontalforcings = frontalforcingsrignotarma()
     53# Polynomial params #
     54numparams        = 3;
     55numbreaks        = 2;
     56intercept        = np.array([[2.5,2.0,0.1],[0.5,0.5,1.5]])
     57trendlin         = np.array([[-0.5,-0.2,0.1],[0,0,0]])
     58trendquad        = np.array([[0,0.0,0],[0.1,0.1,0.1]])
     59datebreaks       = np.array([[4,7],[4,7]])
     60polynomialparams = np.transpose(np.stack((intercept,trendlin,trendquad)),(1,2,0))
     61
    5362md.frontalforcings.num_basins = nb_tf
    5463md.frontalforcings.basin_id = idb_tf
    5564md.frontalforcings.subglacial_discharge = 0.01 * np.ones((md.mesh.numberofvertices,))
    56 md.frontalforcings.const = np.array([[0.05, 0.01]])  # intercept values of TF in basins [C]
    57 md.frontalforcings.trend = np.array([[0.0001, 0.00001]])  # trend values of TF in basins [C/yr]
    58 md.frontalforcings.arma_initialtime = md.timestepping.start_time  # initial time in the AR model parameterization [yr]
     65md.frontalforcings.num_params = numparams #number of parameters in the polynomial
     66md.frontalforcings.num_breaks = numbreaks #number of breakpoints
     67md.frontalforcings.polynomialparams = polynomialparams
     68md.frontalforcings.datebreaks = datebreaks
    5969md.frontalforcings.ar_order = 4
    6070md.frontalforcings.ma_order = 2
  • issm/trunk-jpl/test/NightlyRun/test544.m

    r27260 r27318  
    2424
    2525%SMB
     26numparams               = 1;
     27numbreaks               = 0;
     28intercept               = [0.5;0.01];
     29polynomialparams        = intercept;
     30datebreaks              = NaN;
    2631md.smb                  = SMBarma();
    2732md.smb.num_basins       = nb_bas; %number of basins
    2833md.smb.basin_id         = idb; %prescribe basin ID number to elements
    29 md.smb.const            = [0.5,1.2]; %intercept values of SMB in basins [m ice eq./yr]
    30 md.smb.trend            = [0.0,0.01]; %trend values of SMB in basins [m ice eq./yr^2]
    31 md.smb.arma_initialtime = md.timestepping.start_time;
     34md.smb.num_params       = numparams; %number of parameters in the polynomial
     35md.smb.num_breaks       = numbreaks; %number of breakpoints
     36md.smb.polynomialparams = polynomialparams;
     37md.smb.datebreaks       = datebreaks;
    3238md.smb.ar_order         = 4;
    3339md.smb.ma_order         = 4;
     
    4450
    4551% Basal forcing implementation
    46 md.basalforcings = linearbasalforcingsarma();
     52numparams                         = 2;
     53numbreaks                         = 1;
     54intercept                         = [3.0,4.0;1.0,0.5];
     55trendlin                          = [0.0,0.1;0,0];
     56polynomialparams                  = cat(3,intercept,trendlin);
     57datebreaks                        = [6;7];
     58md.basalforcings                  = linearbasalforcingsarma();
    4759md.basalforcings.num_basins       = nb_bas; %number of basins
    4860md.basalforcings.basin_id         = idb; %prescribe basin ID number to elements
    49 md.basalforcings.const            = [1.0,2.50]; %intercept values of DeepwaterMelt in basins [m/yr]
    50 md.basalforcings.trend            = [0.2,0.01]; %trend values of DeepwaterMelt in basins [m/yr^2]
    51 md.basalforcings.arma_initialtime = md.timestepping.start_time;
     61md.basalforcings.polynomialparams = polynomialparams;
     62md.basalforcings.datebreaks       = datebreaks;
     63md.basalforcings.num_params       = numparams; %number of parameters in the polynomial
     64md.basalforcings.num_breaks       = numbreaks; %number of breakpoints
    5265md.basalforcings.ar_order         = 1;
    5366md.basalforcings.ma_order         = 1;
  • issm/trunk-jpl/test/NightlyRun/test544.py

    r27261 r27318  
    3434
    3535#SMB
     36numparams  = 1;
     37numbreaks  = 0;
     38intercept     = np.array([[0.5],[0.01]])
     39polynomialparams = np.copy(intercept)
     40datebreaks = np.nan
    3641md.smb = SMBarma()
    3742md.smb.num_basins = nb_bas  # number of basins
    3843md.smb.basin_id = idb  # prescribe basin ID number to elements;
    39 md.smb.const = np.array([[0.5, 1.2]])  # intercept values of SMB in basins [m ice eq./yr]
    40 md.smb.trend = np.array([[0.0, 0.01]])  # trend values of SMB in basins [m ice eq./yr^2]
    41 md.smb.arma_initialtime = md.timestepping.start_time
     44md.smb.num_params       = 1*numparams
     45md.smb.num_breaks       = 1*numbreaks
     46md.smb.polynomialparams = 1*polynomialparams
     47md.smb.datebreaks       = 1*datebreaks
    4248md.smb.ar_order = 4
    4349md.smb.ma_order = 4
     
    5460
    5561#Basal forcing implementation
     62numparams = 2
     63numbreaks = 1
     64intercept = np.array([[3.0,4.0],[1.0,0.5]])
     65trendlin  = np.array([[0.0,0.1],[0,0]])
     66polynomialparams = np.transpose(np.stack((intercept,trendlin)),(1,2,0))
     67datebreaks = np.array([[6],[7]])
     68
    5669md.basalforcings = linearbasalforcingsarma()
    5770md.basalforcings.num_basins = nb_bas
     
    6275md.basalforcings.ar_order  = 1
    6376md.basalforcings.ma_order  = 1
     77md.basalforcings.polynomialparams = 1*polynomialparams;
     78md.basalforcings.datebreaks       = 1*datebreaks;
     79md.basalforcings.num_params       = 1*numparams
     80md.basalforcings.num_breaks       = 1*numbreaks
    6481md.basalforcings.arma_timestep  = 1.0  # timestep of the ARMA model [yr]
    6582md.basalforcings.arlag_coefs  = np.array([[0.0], [0.1]])  # autoregressive parameters
Note: See TracChangeset for help on using the changeset viewer.