Changeset 27354


Ignore:
Timestamp:
11/04/22 04:51:01 (2 years ago)
Author:
vverjans
Message:

NEW added autoregression and stochastic capabilities for subglacial discharge

Location:
issm/trunk-jpl
Files:
19 edited

Legend:

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

    r27334 r27354  
    153153         /*Retrieve thermal forcing only in the case of non-arma FrontalForcingsRignot*/
    154154         iomodel->FetchDataToInput(inputs,elements,"md.frontalforcings.thermalforcing",ThermalForcingEnum);
    155          /* Do not break here, still retrieve basin_ID,subglacial_discharge, etc.*/
    156       case FrontalForcingsRignotarmaEnum:
    157155         iomodel->FetchDataToInput(inputs,elements,"md.frontalforcings.basin_id",FrontalForcingsBasinIdEnum);
    158156         iomodel->FetchDataToInput(inputs,elements,"md.frontalforcings.subglacial_discharge",FrontalForcingsSubglacialDischargeEnum);
    159          break;
     157                        break;
     158                case FrontalForcingsRignotarmaEnum:
     159                        bool isdischargearma;
     160                        iomodel->FindConstant(&isdischargearma,"md.frontalforcings.isdischargearma");
     161         iomodel->FetchDataToInput(inputs,elements,"md.frontalforcings.basin_id",FrontalForcingsBasinIdEnum);
     162         if(isdischargearma==false) iomodel->FetchDataToInput(inputs,elements,"md.frontalforcings.subglacial_discharge",FrontalForcingsSubglacialDischargeEnum);
     163                        break; 
    160164                default:
    161165                        _error_("Frontal forcings"<<EnumToStringx(melt_parameterization)<<" not supported yet");
     
    245249                        break;
    246250                case FrontalForcingsRignotarmaEnum:
    247                         /*Retrieve autoregressive parameters*/
     251                        parameters->AddObject(iomodel->CopyConstantObject("md.frontalforcings.num_basins",FrontalForcingsNumberofBasinsEnum));
     252                        /*Retrieve thermal forcing parameters*/
    248253                        parameters->AddObject(iomodel->CopyConstantObject("md.frontalforcings.num_params",FrontalForcingsNumberofParamsEnum));
    249254                        parameters->AddObject(iomodel->CopyConstantObject("md.frontalforcings.num_breaks",FrontalForcingsNumberofBreaksEnum));
     
    273278         parameters->AddObject(new DoubleMatParam(FrontalForcingsARMAmonthtrendsEnum,transparam,M,N));
    274279         xDelete<IssmDouble>(transparam);
    275                         /*Do not break here, generic FrontalForcingsRignot parameters still to be retrieved*/
     280                        parameters->AddObject(iomodel->CopyConstantObject("md.frontalforcings.isdischargearma",FrontalForcingsIsDischargeARMAEnum));
     281                        /*Retrieve subglacial discharge parameters */
     282                        bool isdischargearma;
     283                        parameters->FindParam(&isdischargearma,FrontalForcingsIsDischargeARMAEnum);
     284                        if(isdischargearma==true){
     285                                parameters->AddObject(iomodel->CopyConstantObject("md.frontalforcings.sd_num_params",FrontalForcingsSdNumberofParamsEnum));
     286                                parameters->AddObject(iomodel->CopyConstantObject("md.frontalforcings.sd_num_breaks",FrontalForcingsSdNumberofBreaksEnum));
     287           parameters->AddObject(iomodel->CopyConstantObject("md.frontalforcings.sd_ar_order",FrontalForcingsSdarOrderEnum));
     288           parameters->AddObject(iomodel->CopyConstantObject("md.frontalforcings.sd_ma_order",FrontalForcingsSdmaOrderEnum));
     289           parameters->AddObject(iomodel->CopyConstantObject("md.frontalforcings.sd_arma_timestep",FrontalForcingsSdARMATimestepEnum));
     290           iomodel->FetchData(&transparam,&M,&N,"md.frontalforcings.sd_polynomialparams");
     291           parameters->AddObject(new DoubleMatParam(FrontalForcingsSdpolyparamsEnum,transparam,M,N));
     292           xDelete<IssmDouble>(transparam);
     293           iomodel->FetchData(&transparam,&M,&N,"md.frontalforcings.sd_datebreaks");
     294           parameters->AddObject(new DoubleMatParam(FrontalForcingsSddatebreaksEnum,transparam,M,N));
     295           xDelete<IssmDouble>(transparam);
     296           iomodel->FetchData(&transparam,&M,&N,"md.frontalforcings.sd_arlag_coefs");
     297           parameters->AddObject(new DoubleMatParam(FrontalForcingsSdarlagcoefsEnum,transparam,M,N));
     298           xDelete<IssmDouble>(transparam);
     299           iomodel->FetchData(&transparam,&M,&N,"md.frontalforcings.sd_malag_coefs");
     300           parameters->AddObject(new DoubleMatParam(FrontalForcingsSdmalagcoefsEnum,transparam,M,N));
     301           xDelete<IssmDouble>(transparam);
     302                                iomodel->FetchData(&transparam,&M,&N,"md.frontalforcings.sd_monthlyfrac");
     303           parameters->AddObject(new DoubleMatParam(FrontalForcingsSdMonthlyFracEnum,transparam,M,N));
     304           xDelete<IssmDouble>(transparam);
     305                        }
     306                        break;
    276307                case FrontalForcingsRignotEnum:
    277308                        parameters->AddObject(iomodel->CopyConstantObject("md.frontalforcings.num_basins",FrontalForcingsNumberofBasinsEnum));
  • issm/trunk-jpl/src/c/classes/Elements/Element.cpp

    r27353 r27354  
    9999         outenum_type   = BasalforcingsSpatialDeepwaterMeltingRateEnum;
    100100         break;
    101    }
     101                case(FrontalForcingsSubglacialDischargearmaEnum):
     102         arenum_type    = SubglacialdischargeValuesAutoregressionEnum;
     103         maenum_type    = SubglacialdischargeValuesMovingaverageEnum;
     104         basinenum_type = FrontalForcingsBasinIdEnum;
     105         noiseenum_type = SubglacialdischargeARMANoiseEnum;
     106         outenum_type   = FrontalForcingsSubglacialDischargeEnum;
     107         break;
     108        }
    102109
    103110        /*Get time parameters*/
     
    126133                        indperiod = 0;
    127134                        for(int i=0;i<numbreaks;i++){
    128                                 if(tatstep>datebreaks_basin[i]) indperiod = i+1;
     135                                if(tatstep>=datebreaks_basin[i]) indperiod = i+1;
    129136                        }
    130137                        /*Compute polynomial with parameters of indperiod*/
     
    135142                else for(int j=0;j<numparams;j++) sumpoly[s] = sumpoly[s]+polyparams_basin[j*numperiods]*pow(tatstep,j);
    136143        }
     144
    137145        /*Initialze autoregressive and moving-average values at first time step*/
    138146        if(time<=starttime+dt){
     
    174182                        /*Stochastic variable value*/
    175183         varlist[v] = sumpoly[0]+autoregressionterm+movingaverageterm+noiseterm;
    176       }
     184     
     185                        /*Impose zero-bound*/
     186                        if(outenum_type == ThermalForcingEnum || outenum_type == FrontalForcingsSubglacialDischargeEnum) varlist[v] = max(varlist[v],0.0);
     187
     188                }
     189
    177190      /*Update autoregression and moving-average values*/
    178191      IssmDouble* temparrayar = xNew<IssmDouble>(numvertices*arorder);
     
    27162729        this->AddInput(BasalforcingsFloatingiceMeltingRateEnum,values,P1Enum);
    27172730
     2731}/*}}}*/
     2732void       Element::MonthlyFractionBasin(IssmDouble* monthlyfrac,int enum_type){/*{{{*/
     2733       
     2734        /*Variable declaration*/
     2735   const int numvertices = this->GetNumberOfVertices();
     2736        int basinid,mindex,mindexnext,basinenum_type,varenum_type,indperiod;
     2737   IssmDouble time,dt,fracyear,fracyearnext,fracmonth,fracmonthnext,yts;
     2738   IssmDouble monthsteps[12]  = {0.,1./12,2./12,3./12,4./12,5./12,6./12,7./12,8./12,9./12,10./12,11./12};
     2739   IssmDouble* monthlyfrac_b  = xNew<IssmDouble>(12);
     2740   IssmDouble* monthlyrate_b  = xNew<IssmDouble>(12);
     2741        IssmDouble* fracdtinmonth  = xNew<IssmDouble>(12);
     2742        IssmDouble* rateinmonth    = xNew<IssmDouble>(numvertices*12);
     2743        IssmDouble* varlistinput   = xNew<IssmDouble>(numvertices);
     2744        IssmDouble* varlist        = xNewZeroInit<IssmDouble>(numvertices);
     2745
     2746        /*Get field-specific enums*/
     2747   switch(enum_type){
     2748      case(FrontalForcingsSubglacialDischargearmaEnum):
     2749         basinenum_type = FrontalForcingsBasinIdEnum;
     2750         varenum_type   = FrontalForcingsSubglacialDischargeEnum;
     2751         break;
     2752        }
     2753       
     2754        /*Evaluate the month index now and at (now-timestepjump)*/
     2755        this->parameters->FindParam(&yts,ConstantsYtsEnum);
     2756        this->parameters->FindParam(&time,TimeEnum);
     2757   this->parameters->FindParam(&dt,TimesteppingTimeStepEnum); _assert_(dt<yts);
     2758        fracyear     = time/yts-floor(time/yts);
     2759        fracyearnext = (time+dt)/yts-floor((time+dt)/yts);
     2760        for(int i=1;i<12;i++){
     2761                if(fracyear>=monthsteps[i-1])     mindex     = i-1;
     2762                if(fracyearnext>=monthsteps[i-1]) mindexnext = i-1;
     2763        }
     2764        if(fracyear>=monthsteps[11])         mindex     = 11;
     2765        if(fracyearnext>=monthsteps[11])     mindexnext = 11;
     2766
     2767        /*Calculate fraction of the time step spent in each month*/
     2768        for(int i=0;i<12;i++){
     2769                if(mindex<i && mindexnext>i)                            fracdtinmonth[i] = 1.0/dt*yts/12.0;
     2770                else if(mindex<i && mindexnext<i && mindexnext<mindex)  fracdtinmonth[i] = 1.0/dt*yts/12.0;
     2771                else if(mindex>i && mindexnext<mindex && mindexnext>i)  fracdtinmonth[i] = 1.0/dt*yts/12.0;
     2772                else if(mindex>i && mindexnext<mindex && mindexnext==i) fracdtinmonth[i] = 1.0/dt*yts*(fracyearnext-monthsteps[i]);
     2773                else if(mindex==i && mindexnext==i)                     fracdtinmonth[i] = 1.0/dt*yts*(fracyearnext-fracyear);
     2774                else if(mindex==i && mindexnext!=mindex)                fracdtinmonth[i] = 1.0/dt*yts*(1.0/12-(fracyear-monthsteps[i]));
     2775                else if(mindexnext==i && mindex!=mindexnext)            fracdtinmonth[i] = 1.0/dt*yts*(fracyearnext-monthsteps[i]);
     2776                else                                                      fracdtinmonth[i] = 0.0;
     2777        }
     2778
     2779        /*Get basin-specific parameters of the element*/
     2780   this->GetInputValue(&basinid,basinenum_type);
     2781        for(int i=0;i<12;i++) monthlyfrac_b[i]   = monthlyfrac[basinid*12+i];
     2782
     2783        /*Retrieve input*/
     2784        this->GetInputListOnVertices(varlistinput,varenum_type);
     2785
     2786        /*Calculate monthly rate for each month and weight-average it for application over dt*/
     2787        for(int v=0;v<numvertices;v++){
     2788                for(int i=0;i<12;i++){
     2789                        rateinmonth[v*12+i] = varlistinput[v]*monthlyfrac_b[i]*12;
     2790                        varlist[v]          = varlist[v]+fracdtinmonth[i]*rateinmonth[v*12+i];
     2791                }
     2792        }
     2793        /*Update input*/
     2794   this->AddInput(varenum_type,varlist,P1Enum);
     2795
     2796        /*Clean-up*/
     2797        xDelete<IssmDouble>(fracdtinmonth);
     2798        xDelete<IssmDouble>(rateinmonth);
     2799        xDelete<IssmDouble>(monthlyfrac_b);
     2800        xDelete<IssmDouble>(monthlyrate_b);
     2801        xDelete<IssmDouble>(varlist);
     2802        xDelete<IssmDouble>(varlistinput);
    27182803}/*}}}*/
    27192804void       Element::MonthlyPiecewiseLinearEffectBasin(int nummonthbreaks,IssmDouble* monthlyintercepts,IssmDouble* monthlytrends,IssmDouble* monthlydatebreaks,int enum_type){/*{{{*/
     
    38443929      bed_input->GetInputValue(&bed,&gauss);
    38453930      qsg_input->GetInputValue(&qsg,&gauss);
    3846       TF_input->GetInputValue(&TF,&gauss);
     3931                TF_input->GetInputValue(&TF,&gauss);
    38473932
    38483933      if(basin_icefront_area[basinid]==0.) meltrates[iv]=0.;
  • issm/trunk-jpl/src/c/classes/Elements/Element.h

    r27334 r27354  
    164164                void               MigrateGroundingLine(IssmDouble* sheet_ungrounding);
    165165                void               MismipFloatingiceMeltingRate();
     166                void               MonthlyFractionBasin(IssmDouble* monthlyfrac,int enum_type);
    166167                void               MonthlyPiecewiseLinearEffectBasin(int nummonthbreaks,IssmDouble* monthlyintercepts,IssmDouble* monthlytrends,IssmDouble* monthlydatebreaks,int enum_type);
    167168                void               BeckmannGoosseFloatingiceMeltingRate();
  • issm/trunk-jpl/src/c/modules/FrontalForcingsx/FrontalForcingsx.cpp

    r27342 r27354  
    2020                case FrontalForcingsRignotarmaEnum:
    2121                        Thermalforcingarmax(femmodel);
     22                        bool isdischargearma;
     23                        femmodel->parameters->FindParam(&isdischargearma,FrontalForcingsIsDischargeARMAEnum);
     24                        if(isdischargearma==true) Subglacialdischargearmax(femmodel);
    2225                        /*Do not break here, call IcefrontAreax(),RignotMeltParameterizationx()*/
    2326                case FrontalForcingsRignotEnum:
     
    105108   xDelete<IssmDouble>(monthtrends);
    106109}/*}}}*/
     110void Subglacialdischargearmax(FemModel* femmodel){/*{{{*/
     111
     112        /*Get time parameters*/
     113   IssmDouble time,dt,starttime,tstep_arma;
     114   femmodel->parameters->FindParam(&time,TimeEnum);
     115   femmodel->parameters->FindParam(&dt,TimesteppingTimeStepEnum);
     116   femmodel->parameters->FindParam(&starttime,TimesteppingStartTimeEnum);
     117   femmodel->parameters->FindParam(&tstep_arma,FrontalForcingsSdARMATimestepEnum);
     118
     119   /*Determine if this is a time step for the ARMA model*/
     120   bool isstepforarma = false;
     121
     122   #ifndef _HAVE_AD_
     123   if((fmod(time,tstep_arma)<fmod((time-dt),tstep_arma)) || (time<=starttime+dt) || tstep_arma==dt) isstepforarma = true;
     124   #else
     125   _error_("not implemented yet");
     126   #endif
     127
     128   /*Load parameters*/
     129        bool isstochastic;
     130   bool isdischargestochastic = false;
     131        int M,N,arorder,maorder,numbasins,numparams,numbreaks,my_rank;
     132   femmodel->parameters->FindParam(&numbasins,FrontalForcingsNumberofBasinsEnum);
     133   femmodel->parameters->FindParam(&numparams,FrontalForcingsSdNumberofParamsEnum);
     134   femmodel->parameters->FindParam(&numbreaks,FrontalForcingsSdNumberofBreaksEnum);
     135   femmodel->parameters->FindParam(&arorder,FrontalForcingsSdarOrderEnum);
     136   femmodel->parameters->FindParam(&maorder,FrontalForcingsSdmaOrderEnum);
     137   IssmDouble* datebreaks        = NULL;
     138   IssmDouble* arlagcoefs        = NULL;
     139   IssmDouble* malagcoefs        = NULL;
     140   IssmDouble* monthlyfrac       = NULL;
     141        IssmDouble* polyparams        = NULL;
     142
     143   femmodel->parameters->FindParam(&datebreaks,&M,&N,FrontalForcingsSddatebreaksEnum);            _assert_(M==numbasins); _assert_(N==max(numbreaks,1));       
     144   femmodel->parameters->FindParam(&polyparams,&M,&N,FrontalForcingsSdpolyparamsEnum);            _assert_(M==numbasins); _assert_(N==(numbreaks+1)*numparams);       
     145   femmodel->parameters->FindParam(&arlagcoefs,&M,&N,FrontalForcingsSdarlagcoefsEnum);            _assert_(M==numbasins); _assert_(N==arorder);
     146   femmodel->parameters->FindParam(&malagcoefs,&M,&N,FrontalForcingsSdmalagcoefsEnum);            _assert_(M==numbasins); _assert_(N==maorder);
     147   femmodel->parameters->FindParam(&monthlyfrac,&M,&N,FrontalForcingsSdMonthlyFracEnum);          _assert_(M==numbasins); _assert_(N==12);
     148
     149        femmodel->parameters->FindParam(&isstochastic,StochasticForcingIsStochasticForcingEnum);
     150        if(isstochastic){
     151                int  numstochasticfields;
     152                int* stochasticfields;
     153                femmodel->parameters->FindParam(&numstochasticfields,StochasticForcingNumFieldsEnum);
     154                femmodel->parameters->FindParam(&stochasticfields,&N,StochasticForcingFieldsEnum); _assert_(N==numstochasticfields);
     155                for(int i=0;i<numstochasticfields;i++){
     156                        if(stochasticfields[i]==FrontalForcingsSubglacialDischargearmaEnum) isdischargestochastic = true;
     157                }
     158                xDelete<int>(stochasticfields);
     159        }
     160
     161   /*Loop over each element to compute Subglacial Discharge at vertices*/
     162   for(Object* &object:femmodel->elements->objects){
     163      Element* element = xDynamicCast<Element*>(object);
     164                /*Compute ARMA*/
     165      element->ArmaProcess(isstepforarma,arorder,maorder,numparams,numbreaks,tstep_arma,polyparams,arlagcoefs,malagcoefs,datebreaks,isdischargestochastic,FrontalForcingsSubglacialDischargearmaEnum);
     166                /*Scale with monthly fractions*/
     167                element->MonthlyFractionBasin(monthlyfrac,FrontalForcingsSubglacialDischargeEnum);
     168        }
     169
     170   /*Cleanup*/
     171   xDelete<IssmDouble>(arlagcoefs);
     172   xDelete<IssmDouble>(malagcoefs);
     173   xDelete<IssmDouble>(monthlyfrac);
     174   xDelete<IssmDouble>(polyparams);
     175   xDelete<IssmDouble>(datebreaks);
     176}/*}}}*/
     177
  • issm/trunk-jpl/src/c/modules/FrontalForcingsx/FrontalForcingsx.h

    r27250 r27354  
    77/* local prototypes: */
    88void FrontalForcingsx(FemModel* femmodel);
     9void Subglacialdischargearmax(FemModel* femmodel);
    910void Thermalforcingarmax(FemModel* femmodel);
    1011
  • issm/trunk-jpl/src/c/modules/StochasticForcingx/StochasticForcingx.cpp

    r27250 r27354  
    7676
    7777                /*Deal with the ARMA models*/
    78                 if(fields[j]==SMBarmaEnum || fields[j]==FrontalForcingsRignotarmaEnum || fields[j]==BasalforcingsDeepwaterMeltingRatearmaEnum){
     78                if(fields[j]==SMBarmaEnum || fields[j]==FrontalForcingsRignotarmaEnum || fields[j]==BasalforcingsDeepwaterMeltingRatearmaEnum || fields[j]==FrontalForcingsSubglacialDischargearmaEnum){
    7979                        switch(fields[j]){
    8080                                case SMBarmaEnum:
     
    9090                                        noiseenum_type = BasalforcingsDeepwaterMeltingRateNoiseEnum;
    9191                                        break;
     92                                case FrontalForcingsSubglacialDischargearmaEnum:
     93                                        dimenum_type   = FrontalForcingsBasinIdEnum;
     94                                        noiseenum_type = SubglacialdischargeARMANoiseEnum;
     95                                        break; 
    9296                        }
    9397                        for(Object* &object:femmodel->elements->objects){
     
    106110                                case FrontalForcingsRignotarmaEnum:
    107111                                case BasalforcingsDeepwaterMeltingRatearmaEnum:
     112                                case FrontalForcingsSubglacialDischargearmaEnum:
    108113                                        /*Already done above*/
    109114                                        break;
  • issm/trunk-jpl/src/c/shared/Enum/Enum.vim

    r27334 r27354  
    221221syn keyword cConstant FrontalForcingsARMAmonthtrendsEnum
    222222syn keyword cConstant FrontalForcingsARMApolyparamsEnum
     223syn keyword cConstant FrontalForcingsIsDischargeARMAEnum
    223224syn keyword cConstant FrontalForcingsNumberofBasinsEnum
    224225syn keyword cConstant FrontalForcingsNumberofBreaksEnum
     
    228229syn keyword cConstant FrontalForcingsARMAarlagcoefsEnum
    229230syn keyword cConstant FrontalForcingsARMAmalagcoefsEnum
     231syn keyword cConstant FrontalForcingsSdarlagcoefsEnum
     232syn keyword cConstant FrontalForcingsSdARMATimestepEnum
     233syn keyword cConstant FrontalForcingsSdarOrderEnum
     234syn keyword cConstant FrontalForcingsSddatebreaksEnum
     235syn keyword cConstant FrontalForcingsSdmalagcoefsEnum
     236syn keyword cConstant FrontalForcingsSdmaOrderEnum
     237syn keyword cConstant FrontalForcingsSdMonthlyFracEnum
     238syn keyword cConstant FrontalForcingsSdNumberofBreaksEnum
     239syn keyword cConstant FrontalForcingsSdNumberofParamsEnum
     240syn keyword cConstant FrontalForcingsSdpolyparamsEnum
    230241syn keyword cConstant GrdModelEnum
    231242syn keyword cConstant GroundinglineFrictionInterpolationEnum
     
    797808syn keyword cConstant FrictionfEnum
    798809syn keyword cConstant FrontalForcingsBasinIdEnum
     810syn keyword cConstant FrontalForcingsSubglacialDischargearmaEnum
    799811syn keyword cConstant FrontalForcingsSubglacialDischargeEnum
    800812syn keyword cConstant GeometryHydrostaticRatioEnum
     
    11091121syn keyword cConstant StressTensoryzEnum
    11101122syn keyword cConstant StressTensorzzEnum
     1123syn keyword cConstant SubglacialdischargeARMANoiseEnum
     1124syn keyword cConstant SubglacialdischargeValuesAutoregressionEnum
     1125syn keyword cConstant SubglacialdischargeValuesMovingaverageEnum
    11111126syn keyword cConstant SurfaceAbsMisfitEnum
    11121127syn keyword cConstant SurfaceAbsVelMisfitEnum
  • issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h

    r27334 r27354  
    215215   FrontalForcingsARMAmonthtrendsEnum,
    216216   FrontalForcingsARMApolyparamsEnum,
     217        FrontalForcingsIsDischargeARMAEnum,
    217218        FrontalForcingsNumberofBasinsEnum,
    218219        FrontalForcingsNumberofBreaksEnum,
     
    222223   FrontalForcingsARMAarlagcoefsEnum,
    223224   FrontalForcingsARMAmalagcoefsEnum,
     225   FrontalForcingsSdarlagcoefsEnum,
     226        FrontalForcingsSdARMATimestepEnum,
     227   FrontalForcingsSdarOrderEnum,
     228   FrontalForcingsSddatebreaksEnum,
     229   FrontalForcingsSdmalagcoefsEnum,
     230   FrontalForcingsSdmaOrderEnum,
     231   FrontalForcingsSdMonthlyFracEnum,
     232        FrontalForcingsSdNumberofBreaksEnum,
     233        FrontalForcingsSdNumberofParamsEnum,
     234   FrontalForcingsSdpolyparamsEnum,
    224235        GrdModelEnum,
    225236        GroundinglineFrictionInterpolationEnum,
     
    793804        FrictionfEnum,
    794805        FrontalForcingsBasinIdEnum,
     806        FrontalForcingsSubglacialDischargearmaEnum,
    795807        FrontalForcingsSubglacialDischargeEnum,
    796808        GeometryHydrostaticRatioEnum,
     
    11061118        StressTensoryzEnum,
    11071119        StressTensorzzEnum,
     1120        SubglacialdischargeARMANoiseEnum,
     1121        SubglacialdischargeValuesAutoregressionEnum,
     1122        SubglacialdischargeValuesMovingaverageEnum,
    11081123        SurfaceAbsMisfitEnum,
    11091124        SurfaceAbsVelMisfitEnum,
  • issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp

    r27334 r27354  
    223223                case FrontalForcingsARMAmonthtrendsEnum : return "FrontalForcingsARMAmonthtrends";
    224224                case FrontalForcingsARMApolyparamsEnum : return "FrontalForcingsARMApolyparams";
     225                case FrontalForcingsIsDischargeARMAEnum : return "FrontalForcingsIsDischargeARMA";
    225226                case FrontalForcingsNumberofBasinsEnum : return "FrontalForcingsNumberofBasins";
    226227                case FrontalForcingsNumberofBreaksEnum : return "FrontalForcingsNumberofBreaks";
     
    230231                case FrontalForcingsARMAarlagcoefsEnum : return "FrontalForcingsARMAarlagcoefs";
    231232                case FrontalForcingsARMAmalagcoefsEnum : return "FrontalForcingsARMAmalagcoefs";
     233                case FrontalForcingsSdarlagcoefsEnum : return "FrontalForcingsSdarlagcoefs";
     234                case FrontalForcingsSdARMATimestepEnum : return "FrontalForcingsSdARMATimestep";
     235                case FrontalForcingsSdarOrderEnum : return "FrontalForcingsSdarOrder";
     236                case FrontalForcingsSddatebreaksEnum : return "FrontalForcingsSddatebreaks";
     237                case FrontalForcingsSdmalagcoefsEnum : return "FrontalForcingsSdmalagcoefs";
     238                case FrontalForcingsSdmaOrderEnum : return "FrontalForcingsSdmaOrder";
     239                case FrontalForcingsSdMonthlyFracEnum : return "FrontalForcingsSdMonthlyFrac";
     240                case FrontalForcingsSdNumberofBreaksEnum : return "FrontalForcingsSdNumberofBreaks";
     241                case FrontalForcingsSdNumberofParamsEnum : return "FrontalForcingsSdNumberofParams";
     242                case FrontalForcingsSdpolyparamsEnum : return "FrontalForcingsSdpolyparams";
    232243                case GrdModelEnum : return "GrdModel";
    233244                case GroundinglineFrictionInterpolationEnum : return "GroundinglineFrictionInterpolation";
     
    799810                case FrictionfEnum : return "Frictionf";
    800811                case FrontalForcingsBasinIdEnum : return "FrontalForcingsBasinId";
     812                case FrontalForcingsSubglacialDischargearmaEnum : return "FrontalForcingsSubglacialDischargearma";
    801813                case FrontalForcingsSubglacialDischargeEnum : return "FrontalForcingsSubglacialDischarge";
    802814                case GeometryHydrostaticRatioEnum : return "GeometryHydrostaticRatio";
     
    11111123                case StressTensoryzEnum : return "StressTensoryz";
    11121124                case StressTensorzzEnum : return "StressTensorzz";
     1125                case SubglacialdischargeARMANoiseEnum : return "SubglacialdischargeARMANoise";
     1126                case SubglacialdischargeValuesAutoregressionEnum : return "SubglacialdischargeValuesAutoregression";
     1127                case SubglacialdischargeValuesMovingaverageEnum : return "SubglacialdischargeValuesMovingaverage";
    11131128                case SurfaceAbsMisfitEnum : return "SurfaceAbsMisfit";
    11141129                case SurfaceAbsVelMisfitEnum : return "SurfaceAbsVelMisfit";
  • issm/trunk-jpl/src/c/shared/Enum/Enumjl.vim

    r27334 r27354  
    214214syn keyword juliaConstC FrontalForcingsARMAmonthtrendsEnum
    215215syn keyword juliaConstC FrontalForcingsARMApolyparamsEnum
     216syn keyword juliaConstC FrontalForcingsIsDischargeARMAEnum
    216217syn keyword juliaConstC FrontalForcingsNumberofBasinsEnum
    217218syn keyword juliaConstC FrontalForcingsNumberofBreaksEnum
     
    221222syn keyword juliaConstC FrontalForcingsARMAarlagcoefsEnum
    222223syn keyword juliaConstC FrontalForcingsARMAmalagcoefsEnum
     224syn keyword juliaConstC FrontalForcingsSdarlagcoefsEnum
     225syn keyword juliaConstC FrontalForcingsSdARMATimestepEnum
     226syn keyword juliaConstC FrontalForcingsSdarOrderEnum
     227syn keyword juliaConstC FrontalForcingsSddatebreaksEnum
     228syn keyword juliaConstC FrontalForcingsSdmalagcoefsEnum
     229syn keyword juliaConstC FrontalForcingsSdmaOrderEnum
     230syn keyword juliaConstC FrontalForcingsSdMonthlyFracEnum
     231syn keyword juliaConstC FrontalForcingsSdNumberofBreaksEnum
     232syn keyword juliaConstC FrontalForcingsSdNumberofParamsEnum
     233syn keyword juliaConstC FrontalForcingsSdpolyparamsEnum
    223234syn keyword juliaConstC GrdModelEnum
    224235syn keyword juliaConstC GroundinglineFrictionInterpolationEnum
     
    790801syn keyword juliaConstC FrictionfEnum
    791802syn keyword juliaConstC FrontalForcingsBasinIdEnum
     803syn keyword juliaConstC FrontalForcingsSubglacialDischargearmaEnum
    792804syn keyword juliaConstC FrontalForcingsSubglacialDischargeEnum
    793805syn keyword juliaConstC GeometryHydrostaticRatioEnum
     
    11021114syn keyword juliaConstC StressTensoryzEnum
    11031115syn keyword juliaConstC StressTensorzzEnum
     1116syn keyword juliaConstC SubglacialdischargeARMANoiseEnum
     1117syn keyword juliaConstC SubglacialdischargeValuesAutoregressionEnum
     1118syn keyword juliaConstC SubglacialdischargeValuesMovingaverageEnum
    11041119syn keyword juliaConstC SurfaceAbsMisfitEnum
    11051120syn keyword juliaConstC SurfaceAbsVelMisfitEnum
  • issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp

    r27334 r27354  
    226226              else if (strcmp(name,"FrontalForcingsARMAmonthtrends")==0) return FrontalForcingsARMAmonthtrendsEnum;
    227227              else if (strcmp(name,"FrontalForcingsARMApolyparams")==0) return FrontalForcingsARMApolyparamsEnum;
     228              else if (strcmp(name,"FrontalForcingsIsDischargeARMA")==0) return FrontalForcingsIsDischargeARMAEnum;
    228229              else if (strcmp(name,"FrontalForcingsNumberofBasins")==0) return FrontalForcingsNumberofBasinsEnum;
    229230              else if (strcmp(name,"FrontalForcingsNumberofBreaks")==0) return FrontalForcingsNumberofBreaksEnum;
     
    233234              else if (strcmp(name,"FrontalForcingsARMAarlagcoefs")==0) return FrontalForcingsARMAarlagcoefsEnum;
    234235              else if (strcmp(name,"FrontalForcingsARMAmalagcoefs")==0) return FrontalForcingsARMAmalagcoefsEnum;
     236              else if (strcmp(name,"FrontalForcingsSdarlagcoefs")==0) return FrontalForcingsSdarlagcoefsEnum;
     237              else if (strcmp(name,"FrontalForcingsSdARMATimestep")==0) return FrontalForcingsSdARMATimestepEnum;
     238              else if (strcmp(name,"FrontalForcingsSdarOrder")==0) return FrontalForcingsSdarOrderEnum;
     239              else if (strcmp(name,"FrontalForcingsSddatebreaks")==0) return FrontalForcingsSddatebreaksEnum;
     240              else if (strcmp(name,"FrontalForcingsSdmalagcoefs")==0) return FrontalForcingsSdmalagcoefsEnum;
     241              else if (strcmp(name,"FrontalForcingsSdmaOrder")==0) return FrontalForcingsSdmaOrderEnum;
     242              else if (strcmp(name,"FrontalForcingsSdMonthlyFrac")==0) return FrontalForcingsSdMonthlyFracEnum;
     243              else if (strcmp(name,"FrontalForcingsSdNumberofBreaks")==0) return FrontalForcingsSdNumberofBreaksEnum;
     244              else if (strcmp(name,"FrontalForcingsSdNumberofParams")==0) return FrontalForcingsSdNumberofParamsEnum;
     245              else if (strcmp(name,"FrontalForcingsSdpolyparams")==0) return FrontalForcingsSdpolyparamsEnum;
    235246              else if (strcmp(name,"GrdModel")==0) return GrdModelEnum;
    236247              else if (strcmp(name,"GroundinglineFrictionInterpolation")==0) return GroundinglineFrictionInterpolationEnum;
     
    249260              else if (strcmp(name,"HydrologyNumRequestedOutputs")==0) return HydrologyNumRequestedOutputsEnum;
    250261              else if (strcmp(name,"HydrologyPressureMeltCoefficient")==0) return HydrologyPressureMeltCoefficientEnum;
    251               else if (strcmp(name,"HydrologyRelaxation")==0) return HydrologyRelaxationEnum;
     262         else stage=3;
     263   }
     264   if(stage==3){
     265              if (strcmp(name,"HydrologyRelaxation")==0) return HydrologyRelaxationEnum;
    252266              else if (strcmp(name,"HydrologyRequestedOutputs")==0) return HydrologyRequestedOutputsEnum;
    253267              else if (strcmp(name,"HydrologySedimentKmax")==0) return HydrologySedimentKmaxEnum;
     
    260274              else if (strcmp(name,"HydrologydcEplMaxThickness")==0) return HydrologydcEplMaxThicknessEnum;
    261275              else if (strcmp(name,"HydrologydcEplPoreWaterMass")==0) return HydrologydcEplPoreWaterMassEnum;
    262          else stage=3;
    263    }
    264    if(stage==3){
    265               if (strcmp(name,"HydrologydcEplThickComp")==0) return HydrologydcEplThickCompEnum;
     276              else if (strcmp(name,"HydrologydcEplThickComp")==0) return HydrologydcEplThickCompEnum;
    266277              else if (strcmp(name,"HydrologydcEplflipLock")==0) return HydrologydcEplflipLockEnum;
    267278              else if (strcmp(name,"HydrologydcIsefficientlayer")==0) return HydrologydcIsefficientlayerEnum;
     
    372383              else if (strcmp(name,"MeltingOffset")==0) return MeltingOffsetEnum;
    373384              else if (strcmp(name,"MeshAverageVertexConnectivity")==0) return MeshAverageVertexConnectivityEnum;
    374               else if (strcmp(name,"MeshElementtype")==0) return MeshElementtypeEnum;
     385         else stage=4;
     386   }
     387   if(stage==4){
     388              if (strcmp(name,"MeshElementtype")==0) return MeshElementtypeEnum;
    375389              else if (strcmp(name,"MeshNumberoflayers")==0) return MeshNumberoflayersEnum;
    376390              else if (strcmp(name,"MeshNumberofvertices")==0) return MeshNumberofverticesEnum;
     
    383397              else if (strcmp(name,"OceanGridNx")==0) return OceanGridNxEnum;
    384398              else if (strcmp(name,"OceanGridNy")==0) return OceanGridNyEnum;
    385          else stage=4;
    386    }
    387    if(stage==4){
    388               if (strcmp(name,"OceanGridX")==0) return OceanGridXEnum;
     399              else if (strcmp(name,"OceanGridX")==0) return OceanGridXEnum;
    389400              else if (strcmp(name,"OceanGridY")==0) return OceanGridYEnum;
    390401              else if (strcmp(name,"OutputBufferPointer")==0) return OutputBufferPointerEnum;
     
    495506              else if (strcmp(name,"SolidearthSettingsRotation")==0) return SolidearthSettingsRotationEnum;
    496507              else if (strcmp(name,"SolidearthSettingsMaxSHCoeff")==0) return SolidearthSettingsMaxSHCoeffEnum;
    497               else if (strcmp(name,"SettingsIoGather")==0) return SettingsIoGatherEnum;
     508         else stage=5;
     509   }
     510   if(stage==5){
     511              if (strcmp(name,"SettingsIoGather")==0) return SettingsIoGatherEnum;
    498512              else if (strcmp(name,"SettingsNumResultsOnNodes")==0) return SettingsNumResultsOnNodesEnum;
    499513              else if (strcmp(name,"SettingsOutputFrequency")==0) return SettingsOutputFrequencyEnum;
     
    506520              else if (strcmp(name,"SmbAIdx")==0) return SmbAIdxEnum;
    507521              else if (strcmp(name,"SmbASnow")==0) return SmbASnowEnum;
    508          else stage=5;
    509    }
    510    if(stage==5){
    511               if (strcmp(name,"SmbAccualti")==0) return SmbAccualtiEnum;
     522              else if (strcmp(name,"SmbAccualti")==0) return SmbAccualtiEnum;
    512523              else if (strcmp(name,"SmbAccugrad")==0) return SmbAccugradEnum;
    513524              else if (strcmp(name,"SmbAccuref")==0) return SmbAccurefEnum;
     
    618629              else if (strcmp(name,"TimesteppingCycleForcing")==0) return TimesteppingCycleForcingEnum;
    619630              else if (strcmp(name,"TimesteppingStartTime")==0) return TimesteppingStartTimeEnum;
    620               else if (strcmp(name,"TimesteppingTimeStep")==0) return TimesteppingTimeStepEnum;
     631         else stage=6;
     632   }
     633   if(stage==6){
     634              if (strcmp(name,"TimesteppingTimeStep")==0) return TimesteppingTimeStepEnum;
    621635              else if (strcmp(name,"TimesteppingTimeStepMax")==0) return TimesteppingTimeStepMaxEnum;
    622636              else if (strcmp(name,"TimesteppingTimeStepMin")==0) return TimesteppingTimeStepMinEnum;
     
    629643              else if (strcmp(name,"TransientAmrFrequency")==0) return TransientAmrFrequencyEnum;
    630644              else if (strcmp(name,"TransientIsage")==0) return TransientIsageEnum;
    631          else stage=6;
    632    }
    633    if(stage==6){
    634               if (strcmp(name,"TransientIsdamageevolution")==0) return TransientIsdamageevolutionEnum;
     645              else if (strcmp(name,"TransientIsdamageevolution")==0) return TransientIsdamageevolutionEnum;
    635646              else if (strcmp(name,"TransientIsdebris")==0) return TransientIsdebrisEnum;
    636647              else if (strcmp(name,"TransientIsesa")==0) return TransientIsesaEnum;
     
    741752              else if (strcmp(name,"DamageD")==0) return DamageDEnum;
    742753              else if (strcmp(name,"DamageDOld")==0) return DamageDOldEnum;
    743               else if (strcmp(name,"DamageDbar")==0) return DamageDbarEnum;
     754         else stage=7;
     755   }
     756   if(stage==7){
     757              if (strcmp(name,"DamageDbar")==0) return DamageDbarEnum;
    744758              else if (strcmp(name,"DamageDbarOld")==0) return DamageDbarOldEnum;
    745759              else if (strcmp(name,"DamageF")==0) return DamageFEnum;
     
    752766              else if (strcmp(name,"DeltaDsl")==0) return DeltaDslEnum;
    753767              else if (strcmp(name,"DslOld")==0) return DslOldEnum;
    754          else stage=7;
    755    }
    756    if(stage==7){
    757               if (strcmp(name,"Dsl")==0) return DslEnum;
     768              else if (strcmp(name,"Dsl")==0) return DslEnum;
    758769              else if (strcmp(name,"DeltaStr")==0) return DeltaStrEnum;
    759770              else if (strcmp(name,"StrOld")==0) return StrOldEnum;
     
    817828              else if (strcmp(name,"Frictionf")==0) return FrictionfEnum;
    818829              else if (strcmp(name,"FrontalForcingsBasinId")==0) return FrontalForcingsBasinIdEnum;
     830              else if (strcmp(name,"FrontalForcingsSubglacialDischargearma")==0) return FrontalForcingsSubglacialDischargearmaEnum;
    819831              else if (strcmp(name,"FrontalForcingsSubglacialDischarge")==0) return FrontalForcingsSubglacialDischargeEnum;
    820832              else if (strcmp(name,"GeometryHydrostaticRatio")==0) return GeometryHydrostaticRatioEnum;
     
    863875              else if (strcmp(name,"HydrologyMaskNodeActivation")==0) return HydrologyMaskNodeActivationEnum;
    864876              else if (strcmp(name,"Ice")==0) return IceEnum;
    865               else if (strcmp(name,"IceMaskNodeActivation")==0) return IceMaskNodeActivationEnum;
     877         else stage=8;
     878   }
     879   if(stage==8){
     880              if (strcmp(name,"IceMaskNodeActivation")==0) return IceMaskNodeActivationEnum;
    866881              else if (strcmp(name,"Input")==0) return InputEnum;
    867882              else if (strcmp(name,"InversionCostFunctionsCoefficients")==0) return InversionCostFunctionsCoefficientsEnum;
     
    875890              else if (strcmp(name,"LevelsetObservation")==0) return LevelsetObservationEnum;
    876891              else if (strcmp(name,"LoadingforceX")==0) return LoadingforceXEnum;
    877          else stage=8;
    878    }
    879    if(stage==8){
    880               if (strcmp(name,"LoadingforceY")==0) return LoadingforceYEnum;
     892              else if (strcmp(name,"LoadingforceY")==0) return LoadingforceYEnum;
    881893              else if (strcmp(name,"LoadingforceZ")==0) return LoadingforceZEnum;
    882894              else if (strcmp(name,"MaskOceanLevelset")==0) return MaskOceanLevelsetEnum;
     
    986998              else if (strcmp(name,"SealevelchangeViscousRSL")==0) return SealevelchangeViscousRSLEnum;
    987999              else if (strcmp(name,"SealevelchangeViscousSG")==0) return SealevelchangeViscousSGEnum;
    988               else if (strcmp(name,"SealevelchangeViscousU")==0) return SealevelchangeViscousUEnum;
     1000         else stage=9;
     1001   }
     1002   if(stage==9){
     1003              if (strcmp(name,"SealevelchangeViscousU")==0) return SealevelchangeViscousUEnum;
    9891004              else if (strcmp(name,"SealevelchangeViscousN")==0) return SealevelchangeViscousNEnum;
    9901005              else if (strcmp(name,"SealevelchangeViscousE")==0) return SealevelchangeViscousEEnum;
     
    9981013              else if (strcmp(name,"SigmaNN")==0) return SigmaNNEnum;
    9991014              else if (strcmp(name,"SigmaVM")==0) return SigmaVMEnum;
    1000          else stage=9;
    1001    }
    1002    if(stage==9){
    1003               if (strcmp(name,"SmbAccumulatedEC")==0) return SmbAccumulatedECEnum;
     1015              else if (strcmp(name,"SmbAccumulatedEC")==0) return SmbAccumulatedECEnum;
    10041016              else if (strcmp(name,"SmbAccumulatedMassBalance")==0) return SmbAccumulatedMassBalanceEnum;
    10051017              else if (strcmp(name,"SmbAccumulatedMelt")==0) return SmbAccumulatedMeltEnum;
     
    11091121              else if (strcmp(name,"SmbW")==0) return SmbWEnum;
    11101122              else if (strcmp(name,"SmbWAdd")==0) return SmbWAddEnum;
    1111               else if (strcmp(name,"SmbWini")==0) return SmbWiniEnum;
     1123         else stage=10;
     1124   }
     1125   if(stage==10){
     1126              if (strcmp(name,"SmbWini")==0) return SmbWiniEnum;
    11121127              else if (strcmp(name,"SmbZMax")==0) return SmbZMaxEnum;
    11131128              else if (strcmp(name,"SmbZMin")==0) return SmbZMinEnum;
     
    11211136              else if (strcmp(name,"StrainRateeffective")==0) return StrainRateeffectiveEnum;
    11221137              else if (strcmp(name,"StrainRateparallel")==0) return StrainRateparallelEnum;
    1123          else stage=10;
    1124    }
    1125    if(stage==10){
    1126               if (strcmp(name,"StrainRateperpendicular")==0) return StrainRateperpendicularEnum;
     1138              else if (strcmp(name,"StrainRateperpendicular")==0) return StrainRateperpendicularEnum;
    11271139              else if (strcmp(name,"StrainRatexx")==0) return StrainRatexxEnum;
    11281140              else if (strcmp(name,"StrainRatexy")==0) return StrainRatexyEnum;
     
    11381150              else if (strcmp(name,"StressTensoryz")==0) return StressTensoryzEnum;
    11391151              else if (strcmp(name,"StressTensorzz")==0) return StressTensorzzEnum;
     1152              else if (strcmp(name,"SubglacialdischargeARMANoise")==0) return SubglacialdischargeARMANoiseEnum;
     1153              else if (strcmp(name,"SubglacialdischargeValuesAutoregression")==0) return SubglacialdischargeValuesAutoregressionEnum;
     1154              else if (strcmp(name,"SubglacialdischargeValuesMovingaverage")==0) return SubglacialdischargeValuesMovingaverageEnum;
    11401155              else if (strcmp(name,"SurfaceAbsMisfit")==0) return SurfaceAbsMisfitEnum;
    11411156              else if (strcmp(name,"SurfaceAbsVelMisfit")==0) return SurfaceAbsVelMisfitEnum;
     
    12291244              else if (strcmp(name,"Outputdefinition31")==0) return Outputdefinition31Enum;
    12301245              else if (strcmp(name,"Outputdefinition32")==0) return Outputdefinition32Enum;
    1231               else if (strcmp(name,"Outputdefinition33")==0) return Outputdefinition33Enum;
     1246         else stage=11;
     1247   }
     1248   if(stage==11){
     1249              if (strcmp(name,"Outputdefinition33")==0) return Outputdefinition33Enum;
    12321250              else if (strcmp(name,"Outputdefinition34")==0) return Outputdefinition34Enum;
    12331251              else if (strcmp(name,"Outputdefinition35")==0) return Outputdefinition35Enum;
     
    12441262              else if (strcmp(name,"Outputdefinition45")==0) return Outputdefinition45Enum;
    12451263              else if (strcmp(name,"Outputdefinition46")==0) return Outputdefinition46Enum;
    1246          else stage=11;
    1247    }
    1248    if(stage==11){
    1249               if (strcmp(name,"Outputdefinition47")==0) return Outputdefinition47Enum;
     1264              else if (strcmp(name,"Outputdefinition47")==0) return Outputdefinition47Enum;
    12501265              else if (strcmp(name,"Outputdefinition48")==0) return Outputdefinition48Enum;
    12511266              else if (strcmp(name,"Outputdefinition49")==0) return Outputdefinition49Enum;
     
    13521367              else if (strcmp(name,"Cflevelsetmisfit")==0) return CflevelsetmisfitEnum;
    13531368              else if (strcmp(name,"Channel")==0) return ChannelEnum;
    1354               else if (strcmp(name,"ChannelArea")==0) return ChannelAreaEnum;
     1369         else stage=12;
     1370   }
     1371   if(stage==12){
     1372              if (strcmp(name,"ChannelArea")==0) return ChannelAreaEnum;
    13551373              else if (strcmp(name,"ChannelAreaOld")==0) return ChannelAreaOldEnum;
    13561374              else if (strcmp(name,"ChannelDischarge")==0) return ChannelDischargeEnum;
     
    13671385              else if (strcmp(name,"ControlInputValues")==0) return ControlInputValuesEnum;
    13681386              else if (strcmp(name,"CrouzeixRaviart")==0) return CrouzeixRaviartEnum;
    1369          else stage=12;
    1370    }
    1371    if(stage==12){
    1372               if (strcmp(name,"Cuffey")==0) return CuffeyEnum;
     1387              else if (strcmp(name,"Cuffey")==0) return CuffeyEnum;
    13731388              else if (strcmp(name,"CuffeyTemperate")==0) return CuffeyTemperateEnum;
    13741389              else if (strcmp(name,"DamageEvolutionAnalysis")==0) return DamageEvolutionAnalysisEnum;
     
    14751490              else if (strcmp(name,"IntMatParam")==0) return IntMatParamEnum;
    14761491              else if (strcmp(name,"IntParam")==0) return IntParamEnum;
    1477               else if (strcmp(name,"IntVecParam")==0) return IntVecParamEnum;
     1492         else stage=13;
     1493   }
     1494   if(stage==13){
     1495              if (strcmp(name,"IntVecParam")==0) return IntVecParamEnum;
    14781496              else if (strcmp(name,"Inputs")==0) return InputsEnum;
    14791497              else if (strcmp(name,"Internal")==0) return InternalEnum;
     
    14901508              else if (strcmp(name,"LevelsetAnalysis")==0) return LevelsetAnalysisEnum;
    14911509              else if (strcmp(name,"LevelsetfunctionPicard")==0) return LevelsetfunctionPicardEnum;
    1492          else stage=13;
    1493    }
    1494    if(stage==13){
    1495               if (strcmp(name,"LinearFloatingMeltRate")==0) return LinearFloatingMeltRateEnum;
     1510              else if (strcmp(name,"LinearFloatingMeltRate")==0) return LinearFloatingMeltRateEnum;
    14961511              else if (strcmp(name,"LinearFloatingMeltRatearma")==0) return LinearFloatingMeltRatearmaEnum;
    14971512              else if (strcmp(name,"LliboutryDuval")==0) return LliboutryDuvalEnum;
     
    15981613              else if (strcmp(name,"ProfilingSolutionTime")==0) return ProfilingSolutionTimeEnum;
    15991614              else if (strcmp(name,"Regionaloutput")==0) return RegionaloutputEnum;
    1600               else if (strcmp(name,"Regular")==0) return RegularEnum;
     1615         else stage=14;
     1616   }
     1617   if(stage==14){
     1618              if (strcmp(name,"Regular")==0) return RegularEnum;
    16011619              else if (strcmp(name,"RecoveryAnalysis")==0) return RecoveryAnalysisEnum;
    16021620              else if (strcmp(name,"Riftfront")==0) return RiftfrontEnum;
     
    16131631              else if (strcmp(name,"SMBgradients")==0) return SMBgradientsEnum;
    16141632              else if (strcmp(name,"SMBgradientscomponents")==0) return SMBgradientscomponentsEnum;
    1615          else stage=14;
    1616    }
    1617    if(stage==14){
    1618               if (strcmp(name,"SMBgradientsela")==0) return SMBgradientselaEnum;
     1633              else if (strcmp(name,"SMBgradientsela")==0) return SMBgradientselaEnum;
    16191634              else if (strcmp(name,"SMBhenning")==0) return SMBhenningEnum;
    16201635              else if (strcmp(name,"SMBmeltcomponents")==0) return SMBmeltcomponentsEnum;
  • issm/trunk-jpl/src/m/classes/frontalforcingsrignotarma.m

    r27334 r27354  
    2222                basin_id                 = NaN;
    2323                subglacial_discharge     = NaN;
     24                isdischargearma          = 0;
     25                sd_ar_order              = 0;
     26                sd_ma_order              = 0;
     27                sd_arma_timestep         = 0;
     28                sd_arlag_coefs           = NaN;
     29                sd_malag_coefs           = NaN;
     30                sd_monthlyfrac           = NaN;
     31                sd_num_breaks            = 0;
     32                sd_num_params            = 0;
     33                sd_polynomialparams      = NaN;
     34                sd_datebreaks            = NaN;
    2435        end
    2536        methods
     
    6677         md = checkfield(md,'fieldname','frontalforcings.num_breaks','numel',1,'NaN',1,'Inf',1,'>=',0);
    6778         md = checkfield(md,'fieldname','frontalforcings.basin_id','Inf',1,'>=',0,'<=',md.frontalforcings.num_basins,'size',[md.mesh.numberofelements 1]);
    68          md = checkfield(md,'fieldname','frontalforcings.subglacial_discharge','>=',0,'NaN',1,'Inf',1,'timeseries',1);
    6979         if(nbas>1 && nbrk>=1 && nprm>1)
    7080            md = checkfield(md,'fieldname','frontalforcings.polynomialparams','NaN',1,'Inf',1,'size',[nbas,nbrk+1,nprm],'numel',nbas*(nbrk+1)*nprm);
     
    127137                   end
    128138
     139                        %%% Checking subglacial discharge %%%
     140                        md = checkfield(md,'fieldname','frontalforcings.isdischargearma','values',[0 1]);
     141                        if(~self.isdischargearma)
     142                                md = checkfield(md,'fieldname','frontalforcings.subglacial_discharge','>=',0,'NaN',1,'Inf',1,'timeseries',1);
     143                        else
     144                                sdnbrk  = md.frontalforcings.sd_num_breaks;
     145                                sdnprm  = md.frontalforcings.sd_num_params;
     146                                md = checkfield(md,'fieldname','frontalforcings.sd_ar_order','numel',1,'NaN',1,'Inf',1,'>=',0);
     147                                md = checkfield(md,'fieldname','frontalforcings.sd_ma_order','numel',1,'NaN',1,'Inf',1,'>=',0);
     148                md = checkfield(md,'fieldname','frontalforcings.sd_arma_timestep','numel',1,'NaN',1,'Inf',1,'>=',max(1,md.timestepping.time_step)); %ARMA time step cannot be finer than ISSM timestep and annual timestep
     149                md = checkfield(md,'fieldname','frontalforcings.sd_arlag_coefs','NaN',1,'Inf',1,'size',[md.frontalforcings.num_basins,md.frontalforcings.sd_ar_order]);
     150                md = checkfield(md,'fieldname','frontalforcings.sd_malag_coefs','NaN',1,'Inf',1,'size',[md.frontalforcings.num_basins,md.frontalforcings.sd_ma_order]);
     151                md = checkfield(md,'fieldname','frontalforcings.sd_monthlyfrac','NaN',1,'Inf',1,'size',[md.frontalforcings.num_basins,12]);
     152                                if(any(abs(sum(self.sd_monthlyfrac,2)-1)>1e-3))
     153                                        error('the 12 entries for each basin of md.frontalforcings.sd_monthlyfrac should add up to 1');
     154                                end
     155                 md = checkfield(md,'fieldname','frontalforcings.sd_num_params','numel',1,'NaN',1,'Inf',1,'>',0);
     156                      md = checkfield(md,'fieldname','frontalforcings.sd_num_breaks','numel',1,'NaN',1,'Inf',1,'>=',0);
     157                 if(nbas>1 && sdnbrk>=1 && sdnprm>1)
     158                    md = checkfield(md,'fieldname','frontalforcings.sd_polynomialparams','NaN',1,'Inf',1,'size',[nbas,sdnbrk+1,sdnprm],'numel',nbas*(sdnbrk+1)*sdnprm);
     159                 elseif(nbas==1)
     160                    md = checkfield(md,'fieldname','frontalforcings.sd_polynomialparams','NaN',1,'Inf',1,'size',[sdnprm,sdnbrk+1],'numel',nbas*(sdnbrk+1)*sdnprm);
     161                 elseif(sdnbrk==0)
     162                    md = checkfield(md,'fieldname','frontalforcings.sd_polynomialparams','NaN',1,'Inf',1,'size',[nbas,sdnprm],'numel',nbas*(sdnbrk+1)*sdnprm);
     163                 elseif(sdnprm==1)
     164                    md = checkfield(md,'fieldname','frontalforcings.sd_polynomialparams','NaN',1,'Inf',1,'size',[nbas,sdnbrk+1],'numel',nbas*(sdnbrk+1)*sdnprm);
     165                 end
     166                 if(sdnbrk>0)
     167                    md = checkfield(md,'fieldname','frontalforcings.sd_datebreaks','NaN',1,'Inf',1,'size',[nbas,sdnbrk]);
     168                 elseif(numel(md.frontalforcings.sd_datebreaks)==0 || all(isnan(md.frontalforcings.sd_datebreaks)))
     169                    ;
     170                 else
     171                    error('md.frontalforcings.sd_num_breaks is 0 but md.frontalforcings.sd_datebreaks is not empty');
     172                 end
     173
     174                        end
     175
    129176      end % }}}
    130177                function disp(self) % {{{
     
    132179                        fielddisplay(self,'num_basins','number of different basins');
    133180         fielddisplay(self,'basin_id','basin number assigned to each element [unitless]');
    134          fielddisplay(self,'subglacial_discharge','sum of subglacial discharge for each basin [m/d]');
    135181                        fielddisplay(self,'num_breaks','number of different breakpoints in the piecewise-polynomial (separating num_breaks+1 periods)');
    136182                        fielddisplay(self,'num_params','number of different parameters in the piecewise-polynomial (1:intercept only, 2:with linear trend, 3:with quadratic trend, etc.)');
     
    147193         fielddisplay(self,'monthlyvals_numbreaks','number of breakpoints in the piecewise-linear functions of monthly values');
    148194         fielddisplay(self,'monthlyvals_datebreaks','dates at which the breakpoints in the piecewise-linear monthly values occur (1 row per basin)');
    149                 end % }}}
     195         fielddisplay(self,'isdischargearma','whether an ARMA model is also used for the subglacial discharge (if 0: subglacial_discharge is used, if 1: sd_ parameters are used)');
     196         fielddisplay(self,'subglacial_discharge','sum of subglacial discharge for each basin [m^3/d]');
     197                        disp(sprintf('%51s  if isdischargearma is 1, sd_variables are used (sd arma model variable: sum of subglacial discharge for each basin [m^3/d])',' '));
     198         fielddisplay(self,'sd_ar_order','order of the subglacial discharge autoregressive model [unitless]');
     199         fielddisplay(self,'sd_ma_order','order of the subglacial discharge moving-average model [unitless]');
     200         fielddisplay(self,'sd_arma_timestep','time resolution of the subglacial discharge autoregressive model [yr]');
     201         fielddisplay(self,'sd_arlag_coefs','basin-specific vectors of AR lag coefficients for subglacial discharge [unitless]');
     202         fielddisplay(self,'sd_malag_coefs','basin-specific vectors of MA lag coefficients for subglacial discharge [unitless]');
     203         fielddisplay(self,'sd_monthlyfrac','basin-specific vectors of 12 values with fraction of the annual discharge occuring every month [unitless]');
     204                        fielddisplay(self,'sd_num_params','number of different parameters in the subglacial discharge piecewise-polynomial (1:intercept only, 2:with linear trend, 3:with quadratic trend, etc.)');
     205                        fielddisplay(self,'sd_num_breaks','number of different breakpoints in the subglacial discharge piecewise-polynomial (separating sd_num_breaks+1 periods)');
     206         fielddisplay(self,'sd_datebreaks','dates at which the breakpoints in the piecewise polynomial occur (1 row per basin) [yr]');
     207         fielddisplay(self,'sd_polynomialparams','coefficients for the sd_polynomial (const,trend,quadratic,etc.),dim1 for basins,dim2 for periods,dim3 for orders');
     208                end % }}}
    150209                function marshall(self,prefix,md,fid) % {{{
    151210                        yts=md.constants.yts;
     
    228287                        end
    229288
     289                        %%% Deal with the subglacial discharge polynomial %%%
     290                        if(self.isdischargearma)
     291                                sdnprm  = md.frontalforcings.sd_num_params;
     292                                sdnper  = md.frontalforcings.sd_num_breaks+1;
     293                                sdpolyparamsScaled   = md.frontalforcings.sd_polynomialparams;
     294                 sdpolyparams2dScaled = zeros(nbas,sdnper*sdnprm);
     295                 if(sdnprm>1)
     296                    % Case 3D %
     297                    if(nbas>1 && sdnper>1)
     298                       for(ii=[1:sdnprm])
     299                          sdpolyparamsScaled(:,:,ii) = sdpolyparamsScaled(:,:,ii)*((1/yts)^(ii-1));
     300                       end
     301                       % Fit in 2D array %
     302                       for(ii=[1:sdnprm])
     303                          jj = 1+(ii-1)*sdnper;
     304                          sdpolyparams2dScaled(:,jj:jj+sdnper-1) = sdpolyparamsScaled(:,:,ii);
     305                       end
     306                    % Case 2D and higher-order params at increasing row index %
     307                    elseif(nbas==1)
     308                       for(ii=[1:sdnprm])
     309                          sdpolyparamsScaled(ii,:) = sdpolyparamsScaled(ii,:)*((1/yts)^(ii-1));
     310                       end
     311                       % Fit in row array %
     312                       for(ii=[1:sdnprm])
     313                          jj = 1+(ii-1)*sdnper;
     314                          sdpolyparams2dScaled(1,jj:jj+sdnper-1) = sdpolyparamsScaled(ii,:);
     315                       end
     316                    % Case 2D and higher-order params at incrasing column index %
     317                    elseif(sdnper==1)
     318                       for(ii=[1:sdnprm])
     319                          sdpolyparamsScaled(:,ii) = sdpolyparamsScaled(:,ii)*((1/yts)^(ii-1));
     320                       end
     321                       % 2D array is already in correct format %
     322                                                sdpolyparams2dScaled = sdpolyparamsScaled;
     323                    end
     324                 else
     325                                        % 2D array is already in correct format and no need for scaling %
     326               sdpolyparams2dScaled = sdpolyparamsScaled;
     327                 end
     328                 if(sdnper==1) %a single period (no break date)
     329                    sd_dbreaks = zeros(nbas,1); %dummy
     330                 else
     331                    sd_dbreaks = md.frontalforcings.sd_datebreaks;
     332                 end
     333                        end
     334
    230335                        WriteData(fid,prefix,'name','md.frontalforcings.parameterization','data',3,'format','Integer');
    231336                        WriteData(fid,prefix,'object',self,'class','frontalforcings','fieldname','num_basins','format','Integer');
    232337                        WriteData(fid,prefix,'object',self,'class','frontalforcings','fieldname','num_breaks','format','Integer');
    233338                        WriteData(fid,prefix,'object',self,'class','frontalforcings','fieldname','num_params','format','Integer');
    234                         WriteData(fid,prefix,'object',self,'class','frontalforcings','fieldname','subglacial_discharge','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1,'yts',yts);
    235339         WriteData(fid,prefix,'object',self,'class','frontalforcings','fieldname','ar_order','format','Integer');
    236340         WriteData(fid,prefix,'object',self,'class','frontalforcings','fieldname','ma_order','format','Integer');
     
    245349         WriteData(fid,prefix,'data',interceptsM,'name','md.frontalforcings.monthlyvals_intercepts','format','DoubleMat');
    246350         WriteData(fid,prefix,'data',trendsM,'name','md.frontalforcings.monthlyvals_trends','format','DoubleMat','scale',1/yts);
     351                        WriteData(fid,prefix,'object',self,'fieldname','isdischargearma','format','Boolean');
     352                        if(self.isdischargearma==0)
     353                                WriteData(fid,prefix,'object',self,'class','frontalforcings','fieldname','subglacial_discharge','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1,'yts',yts);
     354                        else
     355                                WriteData(fid,prefix,'object',self,'class','frontalforcings','fieldname','sd_num_breaks','format','Integer');
     356                                WriteData(fid,prefix,'object',self,'class','frontalforcings','fieldname','sd_num_params','format','Integer');
     357                 WriteData(fid,prefix,'object',self,'class','frontalforcings','fieldname','sd_ar_order','format','Integer');
     358                 WriteData(fid,prefix,'object',self,'class','frontalforcings','fieldname','sd_ma_order','format','Integer');
     359                 WriteData(fid,prefix,'object',self,'class','frontalforcings','fieldname','sd_arma_timestep','format','Double','scale',yts);
     360                                WriteData(fid,prefix,'data',sdpolyparams2dScaled,'name','md.frontalforcings.sd_polynomialparams','format','DoubleMat');
     361                 WriteData(fid,prefix,'object',self,'class','frontalforcings','fieldname','sd_arlag_coefs','format','DoubleMat','name','md.frontalforcings.sd_arlag_coefs','yts',yts);
     362                 WriteData(fid,prefix,'object',self,'class','frontalforcings','fieldname','sd_malag_coefs','format','DoubleMat','name','md.frontalforcings.sd_malag_coefs','yts',yts);
     363                 WriteData(fid,prefix,'data',sd_dbreaks,'name','md.frontalforcings.sd_datebreaks','format','DoubleMat','scale',yts);
     364                 WriteData(fid,prefix,'object',self,'class','frontalforcings','fieldname','sd_monthlyfrac','format','DoubleMat','name','md.frontalforcings.sd_monthlyfrac','yts',yts);
     365                        end
    247366                end % }}}
    248367        end
  • issm/trunk-jpl/src/m/classes/frontalforcingsrignotarma.py

    r27334 r27354  
    3131        self.basin_id = np.nan
    3232        self.subglacial_discharge = np.nan
     33        self.isdischargearma = 0
     34        self.sd_ar_order = 0
     35        self.sd_ma_order = 0
     36        self.sd_arma_timestep = 0
     37        self.sd_arlag_coefs = np.nan
     38        self.sd_malag_coefs = np.nan
     39        self.sd_monthlyfrac = np.nan
     40        self.sd_num_breaks  = 0
     41        self.sd_num_params  = 0
     42        self.sd_polynomialparams = np.nan
     43        self.sd_datebreaks = np.nan
    3344
    3445        if len(args) == 0:
     
    4152        s += '{}\n'.format(fielddisplay(self, 'num_basins', 'number of different basins [unitless]'))
    4253        s += '{}\n'.format(fielddisplay(self, 'basin_id', 'basin number assigned to each element [unitless]'))
    43         s += '{}\n'.format(fielddisplay(self, 'subglacial_discharge', 'sum of subglacial discharge for each basin [m/d]'))
    4454        s += '{}\n'.format(fielddisplay(self, 'num_breaks', 'number of different breakpoints in the piecewise-polynomial (separating num_breaks+1 periods)'))
    4555        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.)'))
     
    5161        s += '{}\n'.format(fielddisplay(self, 'arlag_coefs', 'basin-specific vectors of AR lag coefficients [unitless]'))
    5262        s += '{}\n'.format(fielddisplay(self, 'malag_coefs', 'basin-specific vectors of MA lag coefficients [unitless]'))
     63        s += '{}\n'.format(fielddisplay(self, 'isdischargearma','whether an ARMA model is also used for the subglacial discharge (if 0: subglacial_discharge is used, if 1: sd_ parameters are used)'))
     64        s += '{}\n'.format(fielddisplay(self, 'subglacial_discharge', 'sum of subglacial discharge for each basin [m/d]'))
     65        s += '{}\n'.format(fielddisplay(self, 'sd_ar_order','order of the subglacial discharge autoregressive model [unitless]'))
     66        s += '{}\n'.format(fielddisplay(self, 'sd_ma_order','order of the subglacial discharge moving-average model [unitless]'))
     67        s += '{}\n'.format(fielddisplay(self, 'sd_arma_timestep','time resolution of the subglacial discharge autoregressive model [yr]'))
     68        s += '{}\n'.format(fielddisplay(self, 'sd_arlag_coefs','basin-specific vectors of AR lag coefficients for subglacial discharge [unitless]'))
     69        s += '{}\n'.format(fielddisplay(self, 'sd_malag_coefs','basin-specific vectors of MA lag coefficients for subglacial discharge [unitless]'))
     70        s += '{}\n'.format(fielddisplay(self, 'sd_monthlyfrac','basin-specific vectors of 12 values with fraction of the annual discharge occuring every month [unitless]'))
     71        s += '{}\n'.format(fielddisplay(self, 'sd_num_params','number of different parameters in the subglacial discharge piecewise-polynomial (1:intercept only, 2:with linear trend, 3:with quadratic trend, etc.)'))
     72        s += '{}\n'.format(fielddisplay(self, 'sd_num_breaks','number of different breakpoints in the subglacial discharge piecewise-polynomial (separating sd_num_breaks+1 periods)'))
     73        s += '{}\n'.format(fielddisplay(self, 'sd_datebreaks','dates at which the breakpoints in the piecewise polynomial occur (1 row per basin) [yr]'))
     74        s += '{}\n'.format(fielddisplay(self, 'sd_polynomialparams','coefficients for the sd_polynomial (const,trend,quadratic,etc.),dim1 for basins,dim2 for periods,dim3 for orders'))
    5375        return s
    5476    #}}}
     
    130152            raise RuntimeError('md.frontalforcings.monthlyvals_numbreaks is 0 but md.frontalforcings.monthlyvals_datebreaks is not empty')
    131153
     154        ### Chacking subglacial discharge ###
     155        md = checkfield(md, 'fieldname', 'frontalforcings.isdischargearma', 'values', [0, 1])
     156        if(self.isdischargearma==0):
     157            md = checkfield(md,'fieldname','frontalforcings.subglacial_discharge','>=',0,'NaN',1,'Inf',1,'timeseries',1)
     158        else:
     159            sdnbrk  = md.frontalforcings.sd_num_breaks
     160            sdnprm  = md.frontalforcings.sd_num_params
     161            md = checkfield(md,'fieldname','frontalforcings.sd_ar_order','numel',1,'NaN',1,'Inf',1,'>=',0)
     162            md = checkfield(md,'fieldname','frontalforcings.sd_ma_order','numel',1,'NaN',1,'Inf',1,'>=',0)
     163            md = checkfield(md,'fieldname','frontalforcings.sd_arma_timestep','numel',1,'NaN',1,'Inf',1,'>=',max(1,md.timestepping.time_step)) #ARMA time step cannot be finer than ISSM timestep and annual timestep
     164            md = checkfield(md,'fieldname','frontalforcings.sd_arlag_coefs','NaN',1,'Inf',1,'size',[md.frontalforcings.num_basins,md.frontalforcings.sd_ar_order])
     165            md = checkfield(md,'fieldname','frontalforcings.sd_malag_coefs','NaN',1,'Inf',1,'size',[md.frontalforcings.num_basins,md.frontalforcings.sd_ma_order])
     166            md = checkfield(md,'fieldname','frontalforcings.sd_monthlyfrac','NaN',1,'Inf',1,'size',[md.frontalforcings.num_basins,12])
     167            if(np.any(abs(np.sum(self.sd_monthlyfrac,axis=1)-1)>1e-3)):
     168                raise RuntimeError('the 12 entries for each basin of md.frontalforcings.sd_monthlyfrac should add up to 1')
     169            md = checkfield(md,'fieldname','frontalforcings.sd_num_params','numel',1,'NaN',1,'Inf',1,'>',0)
     170            md = checkfield(md,'fieldname','frontalforcings.sd_num_breaks','numel',1,'NaN',1,'Inf',1,'>=',0)
     171            if len(np.shape(self.sd_polynomialparams)) == 1:
     172                self.sd_polynomialparams = np.array([[self.sd_polynomialparams]])
     173            if(nbas>1 and sdnbrk>=1 and sdnprm>1):
     174                md = checkfield(md,'fieldname','frontalforcings.sd_polynomialparams','NaN',1,'Inf',1,'size',[nbas,sdnbrk+1,sdnprm],'numel',nbas*(sdnbrk+1)*sdnprm)
     175            elif(nbas==1):
     176                md = checkfield(md,'fieldname','frontalforcings.sd_polynomialparams','NaN',1,'Inf',1,'size',[nprm,nbrk+1],'numel',nbas*(sdnbrk+1)*sdnprm)
     177            elif(sdnbrk==0):
     178                md = checkfield(md,'fieldname','frontalforcings.sd_polynomialparams','NaN',1,'Inf',1,'size',[nbas,sdnprm],'numel',nbas*(sdnbrk+1)*sdnprm)
     179            elif(sdnprm==1):
     180                md = checkfield(md,'fieldname','frontalforcings.sd_polynomialparams','NaN',1,'Inf',1,'size',[nbas,sdnbrk],'numel',nbas*(sdnbrk+1)*sdnprm)
     181            if(sdnbrk>0):
     182                md = checkfield(md, 'fieldname', 'frontalforcings.sd_datebreaks', 'NaN', 1, 'Inf', 1, 'size', [nbas,sdnbrk])
     183            elif(np.size(md.frontalforcings.sd_datebreaks)==0 or np.all(np.isnan(md.frontalforcings.sd_datebreaks))):
     184                pass
     185            else:
     186                raise RuntimeError('md.frontalforcings.sd_num_breaks is 0 but md.frontalforcings.sd_datebreaks is not empty')
     187
    132188        return md
    133189    # }}}
     
    201257            dMbreaks = np.copy(md.frontalforcings.monthlyvals_datebreaks)
    202258
     259        ### Deal with the subglacial discharge polynomial ###
     260        if(self.isdischargearma):
     261            sdnprm  = md.frontalforcings.sd_num_params
     262            sdnper  = md.frontalforcings.sd_num_breaks+1
     263            sdpolyparamsScaled   = np.copy(md.frontalforcings.sd_polynomialparams)
     264            sdpolyparams2dScaled = np.zeros((nbas,sdnper*sdnprm))
     265            if(sdnprm>1):
     266                # Case 3D #
     267                if(nbas>1 and sdnper>1):
     268                    for ii in range(sdnprm):
     269                        sdpolyparamsScaled[:,:,ii] = sdpolyparamsScaled[:,:,ii]*(1/yts)**ii
     270                    # Fit in 2D array #
     271                    for ii in range(sdnprm):
     272                        sdpolyparams2dScaled[:,ii*sdnper:(ii+1)*sdnper] = 1*sdpolyparamsScaled[:,:,ii]
     273                # Case 2D and higher-order params at increasing row index #
     274                elif(nbas==1):
     275                    for ii in range(sdnprm):
     276                        sdpolyparamsScaled[ii,:] = sdpolyparamsScaled[ii,:]*(1/yts)**ii
     277                    # Fit in row array #
     278                    for ii in range(nprm):
     279                        sdpolyparams2dScaled[0,ii*sdnper:(ii+1)*sdnper] = 1*sdpolyparamsScaled[ii,:]
     280                # Case 2D and higher-order params at incrasing column index #
     281                elif(sdnper==1):
     282                    for ii in range(sdnprm):
     283                        sdpolyparamsScaled[:,ii] = sdpolyparamsScaled[:,ii]*(1/yts)**ii
     284                    # 2D array is already in correct format #
     285                    sdpolyparams2dScaled = np.copy(sdpolyparamsScaled)
     286            else:
     287                # 2D array is already in correct format and no need for scaling #
     288                sdpolyparams2dScaled = np.copy(sdpolyparamsScaled)
     289            if(sdnper==1):
     290                sd_dbreaks = np.zeros((nbas,1))
     291            else:
     292                sd_dbreaks = np.copy(md.frontalforcings.sd_datebreaks)
     293
     294
     295
     296
    203297        WriteData(fid, prefix, 'name', 'md.frontalforcings.parameterization', 'data', 3, 'format', 'Integer')
    204298        WriteData(fid, prefix, 'object', self, 'class', 'frontalforcings', 'fieldname', 'num_basins', 'format', 'Integer')
    205299        WriteData(fid, prefix, 'object', self, 'class', 'frontalforcings', 'fieldname', 'num_breaks', 'format', 'Integer')
    206300        WriteData(fid, prefix, 'object', self, 'class', 'frontalforcings', 'fieldname', 'num_params', 'format', 'Integer')
    207         WriteData(fid, prefix, 'object', self, 'class', 'frontalforcings', 'fieldname', 'subglacial_discharge', 'format', 'DoubleMat', 'mattype', 1, 'timeserieslength', md.mesh.numberofvertices + 1, 'yts', yts)
    208301        WriteData(fid, prefix, 'object', self, 'class', 'frontalforcings', 'fieldname', 'ar_order', 'format', 'Integer')
    209302        WriteData(fid, prefix, 'object', self, 'class', 'frontalforcings', 'fieldname', 'ma_order', 'format', 'Integer')
     
    218311        WriteData(fid,prefix,'data',interceptsM,'name','md.frontalforcings.monthlyvals_intercepts','format','DoubleMat')
    219312        WriteData(fid,prefix,'data',trendsM,'name','md.frontalforcings.monthlyvals_trends','format','DoubleMat','scale',1/yts)
     313        WriteData(fid,prefix,'object',self,'fieldname','isdischargearma','format','Boolean')
     314        if(self.isdischargearma==0):
     315            WriteData(fid, prefix, 'object', self, 'class', 'frontalforcings', 'fieldname', 'subglacial_discharge', 'format', 'DoubleMat', 'mattype', 1, 'timeserieslength', md.mesh.numberofvertices + 1, 'yts', yts)
     316        else:
     317            WriteData(fid,prefix,'object',self,'class','frontalforcings','fieldname','sd_num_breaks','format','Integer')
     318            WriteData(fid,prefix,'object',self,'class','frontalforcings','fieldname','sd_num_params','format','Integer')
     319            WriteData(fid,prefix,'object',self,'class','frontalforcings','fieldname','sd_ar_order','format','Integer')
     320            WriteData(fid,prefix,'object',self,'class','frontalforcings','fieldname','sd_ma_order','format','Integer')
     321            WriteData(fid,prefix,'object',self,'class','frontalforcings','fieldname','sd_arma_timestep','format','Double','scale',yts)
     322            WriteData(fid,prefix,'data',sdpolyparams2dScaled,'name','md.frontalforcings.sd_polynomialparams','format','DoubleMat')
     323            WriteData(fid,prefix,'object',self,'class','frontalforcings','fieldname','sd_arlag_coefs','format','DoubleMat','name','md.frontalforcings.sd_arlag_coefs','yts',yts)
     324            WriteData(fid,prefix,'object',self,'class','frontalforcings','fieldname','sd_malag_coefs','format','DoubleMat','name','md.frontalforcings.sd_malag_coefs','yts',yts)
     325            WriteData(fid,prefix,'data',sd_dbreaks,'name','md.frontalforcings.sd_datebreaks','format','DoubleMat','scale',yts)
     326            WriteData(fid,prefix,'object',self,'class','frontalforcings','fieldname','sd_monthlyfrac','format','DoubleMat','name','md.frontalforcings.sd_monthlyfrac','yts',yts)
    220327    # }}}
    221328
  • issm/trunk-jpl/src/m/classes/stochasticforcing.m

    r27251 r27354  
    120120                        indSMBarma = -1; %about to check for index of SMBarma
    121121                        indTFarma  = -1; %about to check for index of FrontalForcingsRignotarma
     122                        indSdarma  = -1; %about to check for index of SubglacialDischargearma
    122123                        indBDWarma  = -1; %about to check for index of BasalforcingsDeepwaterMeltingRatearma
    123124                        if any(contains(self.fields,'SMBarma'))
     
    135136                                end
    136137                        end
     138                        if any(contains(self.fields,'FrontalForcingsSubglacialDischargearma'))
     139                                indSdarma       = find(contains(self.fields,'FrontalForcingsSubglacialDischargearma')); %index of Sdarma, now check for consistency with other arma timesteps
     140                                dimensions(indSdarma) = md.frontalforcings.num_basins;
     141                                if(md.frontalforcings.sd_arma_timestep<self.stochastictimestep)
     142                                        error('FrontalForcingsSubglacialDischargearma cannot have a timestep shorter than stochastictimestep');
     143                                end
     144                        end
    137145                        if any(contains(self.fields,'BasalforcingsDeepwaterMeltingRatearma'))
    138146                                indBDWarma      = find(contains(self.fields,'BasalforcingsDeepwaterMeltingRatearma')); %index of BDWarma, now check for consistency with other arma timesteps
     
    165173                                        if any(crossentries~=0)
    166174                                                error('FrontalForcingsRignotarma and BasalforcingsDeepwaterMeltingRatearma have different arma_timestep and non-zero covariance');
     175                                        end
     176                                end
     177                        end
     178                        if(indSMBarma~=-1 && indSdarma~=-1) %both ARMA models are used: check ARMA time step consistency
     179                                if(md.smb.arma_timestep~=md.frontalforcings.sd_arma_timestep)
     180                                        crossentries = reshape(self.covariance(1+sum(dimensions(1:indSMBarma-1)):sum(dimensions(1:indSMBarma)),1+sum(dimensions(1:indSdarma-1)):sum(dimensions(1:indSdarma))),1,[]);
     181                                        if any(crossentries~=0)
     182                                                error('SMBarma and FrontalForcingsSubglacialDischargearma have different arma_timestep and non-zero covariance');
     183                                        end
     184                                end
     185                        end
     186                        if(indSdarma~=-1 && indBDWarma~=-1) %both ARMA models are used: check ARMA time step consistency
     187                                if(md.frontalforcings.sd_arma_timestep~=md.basalforcings.arma_timestep)
     188                                        crossentries = reshape(self.covariance(1+sum(dimensions(1:indSdarma-1)):sum(dimensions(1:indSdarma)),1+sum(dimensions(1:indBDWarma-1)):sum(dimensions(1:indBDWarma))),1,[]);
     189                                        if any(crossentries~=0)
     190                                                error('FrontalForcingsSubglacialDischargearma and BasalforcingsDeepwaterMeltingRatearma have different arma_timestep and non-zero covariance');
     191                                        end
     192                                end
     193                        end
     194                        if(indSdarma~=-1 && indTFarma~=-1) %both ARMA models are used: check ARMA time step consistency
     195                                if(md.frontalforcings.sd_arma_timestep~=md.frontalforcings.arma_timestep)
     196                                        crossentries = reshape(self.covariance(1+sum(dimensions(1:indSdarma-1)):sum(dimensions(1:indSdarma)),1+sum(dimensions(1:indTFarma-1)):sum(dimensions(1:indTFarma))),1,[]);
     197                                        if any(crossentries~=0)
     198                                                error('FrontalForcingsRignotarma and FrontalForcingsSubglacialDischargearma have different arma_timestep and non-zero covariance');
    167199                                        end
    168200                                end
     
    216248                                        end
    217249                                        if(strcmp(field,'FrontalForcingsRignotarma'))
     250                                                dimensions(ind) = md.frontalforcings.num_basins;
     251                                        end
     252                                        if(strcmp(field,'FrontalForcingsSubglacialDischargearma'))
    218253                                                dimensions(ind) = md.frontalforcings.num_basins;
    219254                                        end
     
    274309                'FrictionSchoofWaterPressure',...
    275310                'FrontalForcingsRignotarma',...
     311                'FrontalForcingsSubglacialDischargearma',...
    276312                'SMBarma',...
    277313                'SMBforcing'
     
    286322                'frictionschoof',...
    287323                'frontalforcingsrignotarma',...
     324                'frontalforcingsrignotarma',...
    288325                'SMBarma',...
    289326                'SMBforcing'
  • issm/trunk-jpl/src/m/classes/stochasticforcing.py

    r27251 r27354  
    3636        s += '{}\n'.format(fielddisplay(self, 'randomflag', 'whether to apply real randomness (true) or pseudo-randomness with fixed seed (false)'))
    3737        s += 'Available fields:\n'
     38        s += '   BasalforcingsDeepwaterMeltingRatearma\n'
    3839        s += '   BasalforcingsSpatialDeepwaterMeltingRate\n'
    3940        s += '   DefaultCalving\n'
    4041        s += '   FloatingMeltRate\n'
    4142        s += '   FrictionWaterPressure\n'
     43        s += '   FrictionCoulombWaterPressure\n'
     44        s += '   FrictionSchoofWaterPressure\n'
    4245        s += '   FrontalForcingsRignotarma (thermal forcing)\n'
     46        s += '   FrontalForcingsSubglacialDischargearma\n'
    4347        s += '   SMBarma\n'
    4448        s += '   SMBforcing\n'
     
    122126        indSMBarma   = -1  # About to check for index of SMBarma
    123127        indTFarma    = -1  # About to check for index of FrontalForcingsRignotarma
     128        indSdarma    = -1  # About to check for index of FrontalForcingsSubglacialDischargearma
    124129        indBDWarma   = -1  # About to check for index of BasalforcingsDeepwaterMeltingRatearma
    125130        if ('SMBarma' in self.fields):
     
    133138            if(md.frontalforcings.arma_timestep<self.stochastictimestep):
    134139                raise TypeError('FrontalForcingsRignotarma cannot have a timestep shorter than stochastictimestep')
     140        if ('FrontalForcingsSubglacialDischargearma' in self.fields):
     141            indSdarma = self.fields.index('FrontalForcingsSubglacialDischargearma')  # Index of Sdarma, now check for consistency with other timesteps
     142            dimensions[indSdarma] = md.frontalforcings.num_basins
     143            if(md.frontalforcings.sd_arma_timestep<self.stochastictimestep):
     144                raise TypeError('FrontalForcingsSubglacialDischargearma cannot have a timestep shorter than stochastictimestep')
    135145        if ('BasalforcingsDeepwaterMeltingRatearma' in self.fields):
    136146            indBDWarma = self.fields.index('BasalforcingsDeepwaterMeltingRatearma')  # Index of BDWarma, now check for consistency with other timesteps
     
    152162            if((md.frontalforcings.arma_timestep != md.basalforcings.arma_timestep) and np.any(covsum != 0)):
    153163                raise IOError('FrontalForcingsRignotarma and BasalforcingsDeepwaterMeltingRatearma have different arma_timestep and non-zero covariance')
     164        if (indSMBarma != -1 and indSdarma != -1):  # Both ARMA models are used: check ARMA time step consistency
     165            covsum = self.covariance[np.sum(dimensions[0:indSMBarma]).astype(int):np.sum(dimensions[0:indSMBarma + 1]).astype(int), np.sum(dimensions[0:indSdarma]).astype(int):np.sum(dimensions[0:indSdarma + 1]).astype(int)]
     166            if((md.smb.arma_timestep != md.frontalforcings.sd_arma_timestep) and np.any(covsum != 0)):
     167                raise IOError('SMBarma and FrontalForcingsSubglacialDischargearma have different arma_timestep and non-zero covariance')
     168        if (indSdarma != -1 and indBDWarma != -1):  # Both ARMA models are used: check ARMA time step consistency
     169            covsum = self.covariance[np.sum(dimensions[0:indSdarma]).astype(int):np.sum(dimensions[0:indSdarma + 1]).astype(int), np.sum(dimensions[0:indBDWarma]).astype(int):np.sum(dimensions[0:indBDWarma + 1]).astype(int)]
     170            if((md.frontalforcings.sd_arma_timestep != md.basalforcings.arma_timestep) and np.any(covsum != 0)):
     171                raise IOError('FrontalForcingsSubglacialDischargearma and BasalforcingsDeepwaterMeltingRatearma have different arma_timestep and non-zero covariance')
     172        if (indSdarma != -1 and indTFarma != -1):  # Both ARMA models are used: check ARMA time step consistency
     173            covsum = self.covariance[np.sum(dimensions[0:indSdarma]).astype(int):np.sum(dimensions[0:indSdarma + 1]).astype(int), np.sum(dimensions[0:indTFarma]).astype(int):np.sum(dimensions[0:indTFarma + 1]).astype(int)]
     174            if((md.frontalforcings.sd_arma_timestep != md.frontalforcings.arma_timestep) and np.any(covsum != 0)):
     175                raise IOError('FrontalForcingsSubglacialDischargearma and FrontalForcingsRignotarma have different arma_timestep and non-zero covariance')
     176
    154177
    155178        md = checkfield(md, 'fieldname', 'stochasticforcing.isstochasticforcing', 'values', [0, 1])
     
    187210                    dimensions[ind] = md.smb.num_basins
    188211                if (field == 'FrontalForcingsRignotarma'):
     212                    dimensions[ind] = md.frontalforcings.num_basins
     213                if (field == 'FrontalForcingsSubglacialDischargearma'):
    189214                    dimensions[ind] = md.frontalforcings.num_basins
    190215                if (field == 'BasalforcingsDeepwaterMeltingRatearma'):
     
    237262                     'FrictionSchoofWaterPressure': 'frictionschoof',
    238263                     'FrontalForcingsRignotarma': 'frontalforcingsrignotarma',
     264                     'FrontalForcingsSubglacialDischargearma': 'frontalforcingsrignotarma',
    239265                     'SMBarma': 'SMBarma',
    240266                     'SMBforcing': 'SMBforcing'}
  • issm/trunk-jpl/test/NightlyRun/test543.m

    r27334 r27354  
    6767trendsM          = cat(3,trendsMp0,trendsMp1);
    6868datebreaksM      = [1;1];
     69% Subglacial discharge parameters %
     70isdischargearma            = 1;
     71sd_ar_order                = 1;
     72sd_ma_order                = 1;
     73sd_num_breaks              = 1;
     74sd_num_params              = 2;
     75sd_arma_timestep           = 1;
     76sd_arlag_coefs             = [0.95;0.95];
     77sd_malag_coefs             = [0;0];
     78sd_datebreaks              = [1;1];
     79sd_monthlyfrac             = [0,0,0,0,0,0,0.5,0.5,0,0,0,0;
     80                              0,0,0,0,0,0,0.5,0.5,0,0,0,0];
     81sd_const                   = [50000,70000.0;8000,10000.0];
     82sd_trend                   = [0,10000;0,0];
     83sd_polyparam               = cat(3,sd_const,sd_trend);
    6984
    7085md.frontalforcings.num_basins              = nb_tf;
     
    8499md.frontalforcings.monthlyvals_trends      = trendsM;
    85100md.frontalforcings.monthlyvals_datebreaks  = datebreaksM;
     101md.frontalforcings.isdischargearma         = isdischargearma;
     102if(isdischargearma==0)
     103        md.frontalforcings.subglacial_discharge    = 0.01*ones(md.mesh.numberofvertices,1);
     104else
     105    md.frontalforcings.sd_num_breaks         = sd_num_breaks;
     106    md.frontalforcings.sd_num_params         = sd_num_params;
     107    md.frontalforcings.sd_ar_order           = sd_ar_order;
     108    md.frontalforcings.sd_ma_order           = sd_ma_order;
     109    md.frontalforcings.sd_arma_timestep      = sd_arma_timestep;
     110    md.frontalforcings.sd_arlag_coefs        = sd_arlag_coefs;
     111    md.frontalforcings.sd_malag_coefs        = sd_malag_coefs;
     112    md.frontalforcings.sd_datebreaks         = sd_datebreaks;
     113    md.frontalforcings.sd_monthlyfrac        = sd_monthlyfrac;
     114    md.frontalforcings.sd_polynomialparams   = sd_polyparam;
     115end
    86116% Floating Ice Melt parameters
    87117md.basalforcings.floatingice_melting_rate = 0.1*ones(md.mesh.numberofvertices,1);
     118
    88119
    89120% Covariance matrix
     
    92123covclv(1,1) = 1/10*covclv(1,1);
    93124covflmlt    = 0.05*eye(nb_flmlt);
    94 covglob     = blkdiag(covtf,covclv,covflmlt);
     125covsd       = 1e3*eye(nb_tf);
     126covglob     = blkdiag(covtf,covclv,covflmlt,covsd);
    95127
    96128%Stochastic forcing
    97129md.stochasticforcing.isstochasticforcing = 1;
    98 md.stochasticforcing.fields              = [{'FrontalForcingsRignotarma'},{'DefaultCalving'},{'FloatingMeltRate'}];
     130md.stochasticforcing.fields              = [{'FrontalForcingsRignotarma'},{'DefaultCalving'},{'FloatingMeltRate'},{'FrontalForcingsSubglacialDischargearma'}];
    99131md.stochasticforcing.defaultdimension    = 2;
    100132md.stochasticforcing.default_id          = idb_df;
  • issm/trunk-jpl/test/NightlyRun/test543.py

    r27334 r27354  
    7272trendsM          = np.transpose(np.stack((trendsMp0,trendsMp1)),(1,2,0))
    7373datebreaksM      = np.array([[1],[1]])
     74# Subglacial discharge params #
     75isdischargearma            = 1
     76sd_ar_order                = 1
     77sd_ma_order                = 1
     78sd_num_breaks              = 1
     79sd_num_params              = 2
     80sd_arma_timestep           = 1
     81sd_arlag_coefs             = np.array([[0.95],[0.95]])
     82sd_malag_coefs             = np.array([[0.0],[0.0]])
     83sd_datebreaks              = np.array([[1.0],[1.0]])
     84sd_monthlyfrac             = np.array([[0,0,0,0,0,0,0.5,0.5,0,0,0,0],[0,0,0,0,0,0,0.5,0.5,0,0,0,0]])
     85sd_const                   = np.array([[50000,70000],[8000,10000.0]])
     86sd_trend                   = np.array([[0.0,10000],[0,0]])
     87sd_polyparam               = np.transpose(np.stack((sd_const,sd_trend)),(1,2,0))
     88
    7489
    7590md.frontalforcings.num_basins = nb_tf
     
    89104md.frontalforcings.monthlyvals_trends      = trendsM
    90105md.frontalforcings.monthlyvals_datebreaks  = datebreaksM
     106md.frontalforcings.isdischargearma         = isdischargearma
     107if(isdischargearma==0):
     108   md.frontalforcings.subglacial_discharge    = 0.01*ones(md.mesh.numberofvertices,1)
     109else:
     110    md.frontalforcings.sd_num_breaks         = sd_num_breaks
     111    md.frontalforcings.sd_num_params         = sd_num_params
     112    md.frontalforcings.sd_ar_order           = sd_ar_order
     113    md.frontalforcings.sd_ma_order           = sd_ma_order
     114    md.frontalforcings.sd_arma_timestep      = sd_arma_timestep
     115    md.frontalforcings.sd_arlag_coefs        = sd_arlag_coefs
     116    md.frontalforcings.sd_malag_coefs        = sd_malag_coefs
     117    md.frontalforcings.sd_datebreaks         = sd_datebreaks
     118    md.frontalforcings.sd_monthlyfrac        = sd_monthlyfrac
     119    md.frontalforcings.sd_polynomialparams   = sd_polyparam
    91120#Floating Ice Melt parameters
    92121md.basalforcings.floatingice_melting_rate = 0.1 * np.ones((md.mesh.numberofvertices,))
     
    103132
    104133#Hard-coding covariance matrix because python is complaining
    105 covglob = np.array([[1e-4, 0., 0., 0., 0., 0.],
    106                     [0., 1e-4, 0., 0., 0., 0.],
    107                     [0., 0., 1e-2, 0., 0., 0.],
    108                     [0., 0., 0., 1e-1, 0., 0.],
    109                     [0., 0., 0., 0., 0.05, 0.],
    110                     [0., 0., 0., 0., 0., 0.05]])
     134covglob = np.array([[1e-4, 0., 0., 0., 0., 0.,0.,0.],
     135                    [0., 1e-4, 0., 0., 0., 0.,0.,0.],
     136                    [0., 0., 1e-2, 0., 0., 0.,0.,0.],
     137                    [0., 0., 0., 1e-1, 0., 0.,0.,0.],
     138                    [0., 0., 0., 0., 0.05, 0.,0.,0.],
     139                    [0., 0., 0., 0., 0., 0.05,0.,0.],
     140                    [0., 0., 0., 0., 0., 0., 1e3,0.],
     141                    [0., 0., 0., 0., 0., 0.,0., 1e3]])
    111142#testchol = np.linalg.cholesky(covglob)
    112143#print(testchol)
     
    114145# Stochastic forcing
    115146md.stochasticforcing.isstochasticforcing = 1
    116 md.stochasticforcing.fields = ['FrontalForcingsRignotarma', 'DefaultCalving', 'FloatingMeltRate']
     147md.stochasticforcing.fields = ['FrontalForcingsRignotarma', 'DefaultCalving', 'FloatingMeltRate','FrontalForcingsSubglacialDischargearma']
    117148md.stochasticforcing.defaultdimension = 2
    118149md.stochasticforcing.default_id = idb_df
Note: See TracChangeset for help on using the changeset viewer.