Changeset 27334


Ignore:
Timestamp:
10/26/22 06:26:59 (2 years ago)
Author:
vverjans
Message:

NEW: added seasonal capabilities in frontalforcingsrignotarma

Location:
issm/trunk-jpl
Files:
14 edited

Legend:

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

    r27318 r27334  
    248248                        parameters->AddObject(iomodel->CopyConstantObject("md.frontalforcings.num_params",FrontalForcingsNumberofParamsEnum));
    249249                        parameters->AddObject(iomodel->CopyConstantObject("md.frontalforcings.num_breaks",FrontalForcingsNumberofBreaksEnum));
     250                        parameters->AddObject(iomodel->CopyConstantObject("md.frontalforcings.monthlyvals_numbreaks",FrontalForcingsNumberofMonthBreaksEnum));
    250251         parameters->AddObject(iomodel->CopyConstantObject("md.frontalforcings.ar_order",FrontalForcingsARMAarOrderEnum));
    251252         parameters->AddObject(iomodel->CopyConstantObject("md.frontalforcings.ma_order",FrontalForcingsARMAmaOrderEnum));
     
    263264         parameters->AddObject(new DoubleMatParam(FrontalForcingsARMAmalagcoefsEnum,transparam,M,N));
    264265         xDelete<IssmDouble>(transparam);
    265                         iomodel->FetchData(&transparam,&M,&N,"md.frontalforcings.monthly_effects");
    266          parameters->AddObject(new DoubleMatParam(ThermalForcingMonthlyEffectsEnum,transparam,M,N));
     266                        iomodel->FetchData(&transparam,&M,&N,"md.frontalforcings.monthlyvals_datebreaks");
     267         parameters->AddObject(new DoubleMatParam(FrontalForcingsARMAmonthdatebreaksEnum,transparam,M,N));
     268         xDelete<IssmDouble>(transparam);
     269                        iomodel->FetchData(&transparam,&M,&N,"md.frontalforcings.monthlyvals_intercepts");
     270         parameters->AddObject(new DoubleMatParam(FrontalForcingsARMAmonthinterceptsEnum,transparam,M,N));
     271         xDelete<IssmDouble>(transparam);
     272                        iomodel->FetchData(&transparam,&M,&N,"md.frontalforcings.monthlyvals_trends");
     273         parameters->AddObject(new DoubleMatParam(FrontalForcingsARMAmonthtrendsEnum,transparam,M,N));
    267274         xDelete<IssmDouble>(transparam);
    268275                        /*Do not break here, generic FrontalForcingsRignot parameters still to be retrieved*/
  • issm/trunk-jpl/src/c/classes/Elements/Element.cpp

    r27318 r27334  
    27142714
    27152715}/*}}}*/
    2716 void       Element::MonthlyEffectBasin(IssmDouble* monthlyeff, int enum_type){/*{{{*/
     2716void       Element::MonthlyPiecewiseLinearEffectBasin(int nummonthbreaks,IssmDouble* monthlyintercepts,IssmDouble* monthlytrends,IssmDouble* monthlydatebreaks,int enum_type){/*{{{*/
    27172717       
    27182718        /*Variable declaration*/
    27192719   const int numvertices = this->GetNumberOfVertices();
    2720         int basinid,mindex,basinenum_type,varenum_type;
     2720        int basinid,mindex,basinenum_type,varenum_type,indperiod;
     2721        int numperiods = nummonthbreaks+1;
    27212722   IssmDouble time,fracyear,yts;
    27222723   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};
    2723         IssmDouble* monthlyeff_b = xNew<IssmDouble>(12);
    2724    IssmDouble* varlist      = xNew<IssmDouble>(numvertices);
     2724   IssmDouble* datebreaks_b  = xNew<IssmDouble>(nummonthbreaks);
     2725        IssmDouble* intercepts_b  = xNew<IssmDouble>(nummonthbreaks*12);
     2726        IssmDouble* trends_b      = xNew<IssmDouble>(nummonthbreaks*12);
     2727        IssmDouble* varlist       = xNew<IssmDouble>(numvertices);
    27252728
    27262729        /*Get field-specific enums*/
     
    27432746        /*Get basin-specific parameters of the element*/
    27442747   this->GetInputValue(&basinid,basinenum_type);
    2745         for(int ii=0;ii<12;ii++){
    2746                 monthlyeff_b[ii] = monthlyeff[basinid*12+ii];
    2747         }
     2748        if(nummonthbreaks>0){
     2749      for(int i=0;i<nummonthbreaks;i++) datebreaks_b[i] = monthlydatebreaks[basinid*nummonthbreaks+i];
     2750   }
     2751        for(int i=0;i<numperiods;i++){
     2752                intercepts_b[i]  = monthlyintercepts[basinid*12*numperiods+mindex+12*i];
     2753                trends_b[i]      = monthlytrends[basinid*12*numperiods+mindex+12*i];
     2754        }
     2755
     2756        /*Compute piecewise-linear function*/
     2757        IssmDouble telapsed_break,piecewiselin;
     2758        if(nummonthbreaks>0){
     2759                /*Find index of time compared to the breakpoints*/
     2760                indperiod = 0;
     2761                for(int i=0;i<nummonthbreaks;i++){
     2762                        if(time>datebreaks_b[i]) indperiod = i+1;
     2763                }
     2764                /*Compute intercept+trend terms with parameters of indperiod*/
     2765      if(indperiod==0) telapsed_break = time;
     2766      else             telapsed_break = time-datebreaks_b[indperiod];
     2767      piecewiselin = intercepts_b[indperiod]+trends_b[indperiod]*telapsed_break;
     2768        }
     2769   else piecewiselin = intercepts_b[indperiod]+trends_b[indperiod]*time;
    27482770
    27492771        /*Retrieve values non-adjusted for monthly effects*/
     
    27512773
    27522774        /*Adjust values using monthly effects*/
    2753         for(int v=0;v<numvertices;v++){
    2754                 varlist[v] = varlist[v]+monthlyeff_b[mindex];
    2755         }
     2775        for(int v=0;v<numvertices;v++) varlist[v] = varlist[v]+piecewiselin;
    27562776
    27572777        /*Add input to element*/
     
    27592779
    27602780        /*Clean-up*/
    2761    xDelete<IssmDouble>(monthlyeff_b);
     2781   xDelete<IssmDouble>(datebreaks_b);
     2782   xDelete<IssmDouble>(intercepts_b);
     2783   xDelete<IssmDouble>(trends_b);
    27622784        xDelete<IssmDouble>(varlist);
    2763 }/*}}}*/
     2785}
     2786/*}}}*/
    27642787void       Element::BeckmannGoosseFloatingiceMeltingRate(){/*{{{*/
    27652788
  • issm/trunk-jpl/src/c/classes/Elements/Element.h

    r27318 r27334  
    164164                void               MigrateGroundingLine(IssmDouble* sheet_ungrounding);
    165165                void               MismipFloatingiceMeltingRate();
    166                 void               MonthlyEffectBasin(IssmDouble* monthlyeff, int enum_type);
     166                void               MonthlyPiecewiseLinearEffectBasin(int nummonthbreaks,IssmDouble* monthlyintercepts,IssmDouble* monthlytrends,IssmDouble* monthlydatebreaks,int enum_type);
    167167                void               BeckmannGoosseFloatingiceMeltingRate();
    168168                void               MungsmtpParameterization(void);
  • issm/trunk-jpl/src/c/modules/FrontalForcingsx/FrontalForcingsx.cpp

    r27320 r27334  
    5050        bool isstochastic;
    5151   bool istfstochastic = false;
    52         int M,N,arorder,maorder,numbasins,numparams,numbreaks,my_rank;
     52        int M,N,arorder,maorder,numbasins,numparams,numbreaks,nummonthbreaks,my_rank;
    5353   femmodel->parameters->FindParam(&numbasins,FrontalForcingsNumberofBasinsEnum);
    5454   femmodel->parameters->FindParam(&numparams,FrontalForcingsNumberofParamsEnum);
    5555   femmodel->parameters->FindParam(&numbreaks,FrontalForcingsNumberofBreaksEnum);
     56   femmodel->parameters->FindParam(&nummonthbreaks,FrontalForcingsNumberofMonthBreaksEnum);
    5657   femmodel->parameters->FindParam(&arorder,FrontalForcingsARMAarOrderEnum);
    5758   femmodel->parameters->FindParam(&maorder,FrontalForcingsARMAmaOrderEnum);
    58    IssmDouble* datebreaks    = NULL;
    59    IssmDouble* arlagcoefs    = NULL;
    60    IssmDouble* malagcoefs    = NULL;
    61    IssmDouble* monthlyeff    = NULL;
    62         IssmDouble* polyparams    = NULL;
     59   IssmDouble* datebreaks        = NULL;
     60   IssmDouble* arlagcoefs        = NULL;
     61   IssmDouble* malagcoefs        = NULL;
     62   IssmDouble* monthlyeff        = NULL;
     63        IssmDouble* polyparams        = NULL;
     64        IssmDouble* monthdatebreaks   = NULL;
     65        IssmDouble* monthintercepts   = NULL;
     66        IssmDouble* monthtrends       = NULL;
    6367
    64    femmodel->parameters->FindParam(&datebreaks,&M,&N,FrontalForcingsARMAdatebreaksEnum); _assert_(M==numbasins); _assert_(N==max(numbreaks,1));       
    65    femmodel->parameters->FindParam(&polyparams,&M,&N,FrontalForcingsARMApolyparamsEnum); _assert_(M==numbasins); _assert_(N==(numbreaks+1)*numparams);       
    66    femmodel->parameters->FindParam(&arlagcoefs,&M,&N,FrontalForcingsARMAarlagcoefsEnum); _assert_(M==numbasins); _assert_(N==arorder);
    67    femmodel->parameters->FindParam(&malagcoefs,&M,&N,FrontalForcingsARMAmalagcoefsEnum); _assert_(M==numbasins); _assert_(N==maorder);
    68    femmodel->parameters->FindParam(&monthlyeff,&M,&N,ThermalForcingMonthlyEffectsEnum);  _assert_(M==numbasins); _assert_(N==12);
     68   femmodel->parameters->FindParam(&datebreaks,&M,&N,FrontalForcingsARMAdatebreaksEnum);            _assert_(M==numbasins); _assert_(N==max(numbreaks,1));       
     69   femmodel->parameters->FindParam(&polyparams,&M,&N,FrontalForcingsARMApolyparamsEnum);            _assert_(M==numbasins); _assert_(N==(numbreaks+1)*numparams);       
     70   femmodel->parameters->FindParam(&arlagcoefs,&M,&N,FrontalForcingsARMAarlagcoefsEnum);            _assert_(M==numbasins); _assert_(N==arorder);
     71   femmodel->parameters->FindParam(&malagcoefs,&M,&N,FrontalForcingsARMAmalagcoefsEnum);            _assert_(M==numbasins); _assert_(N==maorder);
     72   femmodel->parameters->FindParam(&monthdatebreaks,&M,&N,FrontalForcingsARMAmonthdatebreaksEnum);  _assert_(M==numbasins); _assert_(N==max(numbreaks,1));       
     73   femmodel->parameters->FindParam(&monthintercepts,&M,&N,FrontalForcingsARMAmonthinterceptsEnum);  _assert_(M==numbasins); _assert_(N==12*(nummonthbreaks+1));
     74   femmodel->parameters->FindParam(&monthtrends,&M,&N,FrontalForcingsARMAmonthtrendsEnum);          _assert_(M==numbasins); _assert_(N==12*(nummonthbreaks+1));
    6975
    7076        femmodel->parameters->FindParam(&isstochastic,StochasticForcingIsStochasticForcingEnum);
     
    8692      element->ArmaProcess(isstepforarma,arorder,maorder,numparams,numbreaks,tstep_arma,polyparams,arlagcoefs,malagcoefs,datebreaks,istfstochastic,FrontalForcingsRignotarmaEnum);
    8793                /*Compute monthly effects*/
    88                 element->MonthlyEffectBasin(monthlyeff,FrontalForcingsRignotarmaEnum);
     94                element->MonthlyPiecewiseLinearEffectBasin(nummonthbreaks,monthintercepts,monthtrends,monthdatebreaks,FrontalForcingsRignotarmaEnum);
    8995        }
    9096
  • issm/trunk-jpl/src/c/shared/Enum/Enum.vim

    r27318 r27334  
    174174syn keyword cConstant DebrisPackingFractionEnum
    175175syn keyword cConstant DebugProfilingEnum
    176 syn keyword cConstant DebrisThicknessEnum
    177176syn keyword cConstant DomainDimensionEnum
    178177syn keyword cConstant DomainTypeEnum
     
    218217syn keyword cConstant FrontalForcingsARMAmaOrderEnum
    219218syn keyword cConstant FrontalForcingsARMAdatebreaksEnum
     219syn keyword cConstant FrontalForcingsARMAmonthdatebreaksEnum
     220syn keyword cConstant FrontalForcingsARMAmonthinterceptsEnum
     221syn keyword cConstant FrontalForcingsARMAmonthtrendsEnum
    220222syn keyword cConstant FrontalForcingsARMApolyparamsEnum
    221223syn keyword cConstant FrontalForcingsNumberofBasinsEnum
    222224syn keyword cConstant FrontalForcingsNumberofBreaksEnum
     225syn keyword cConstant FrontalForcingsNumberofMonthBreaksEnum
    223226syn keyword cConstant FrontalForcingsNumberofParamsEnum
    224227syn keyword cConstant FrontalForcingsParamEnum
     
    724727syn keyword cConstant DamageDbarOldEnum
    725728syn keyword cConstant DamageFEnum
     729syn keyword cConstant DebrisThicknessEnum
    726730syn keyword cConstant DegreeOfChannelizationEnum
    727731syn keyword cConstant DepthBelowSurfaceEnum
  • issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h

    r27323 r27334  
    211211   FrontalForcingsARMAmaOrderEnum,
    212212   FrontalForcingsARMAdatebreaksEnum,
     213        FrontalForcingsARMAmonthdatebreaksEnum,
     214   FrontalForcingsARMAmonthinterceptsEnum,
     215   FrontalForcingsARMAmonthtrendsEnum,
    213216   FrontalForcingsARMApolyparamsEnum,
    214217        FrontalForcingsNumberofBasinsEnum,
    215218        FrontalForcingsNumberofBreaksEnum,
     219        FrontalForcingsNumberofMonthBreaksEnum,
    216220        FrontalForcingsNumberofParamsEnum,
    217221        FrontalForcingsParamEnum,
  • issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp

    r27323 r27334  
    219219                case FrontalForcingsARMAmaOrderEnum : return "FrontalForcingsARMAmaOrder";
    220220                case FrontalForcingsARMAdatebreaksEnum : return "FrontalForcingsARMAdatebreaks";
     221                case FrontalForcingsARMAmonthdatebreaksEnum : return "FrontalForcingsARMAmonthdatebreaks";
     222                case FrontalForcingsARMAmonthinterceptsEnum : return "FrontalForcingsARMAmonthintercepts";
     223                case FrontalForcingsARMAmonthtrendsEnum : return "FrontalForcingsARMAmonthtrends";
    221224                case FrontalForcingsARMApolyparamsEnum : return "FrontalForcingsARMApolyparams";
    222225                case FrontalForcingsNumberofBasinsEnum : return "FrontalForcingsNumberofBasins";
    223226                case FrontalForcingsNumberofBreaksEnum : return "FrontalForcingsNumberofBreaks";
     227                case FrontalForcingsNumberofMonthBreaksEnum : return "FrontalForcingsNumberofMonthBreaks";
    224228                case FrontalForcingsNumberofParamsEnum : return "FrontalForcingsNumberofParams";
    225229                case FrontalForcingsParamEnum : return "FrontalForcingsParam";
  • issm/trunk-jpl/src/c/shared/Enum/Enumjl.vim

    r27318 r27334  
    167167syn keyword juliaConstC DebrisPackingFractionEnum
    168168syn keyword juliaConstC DebugProfilingEnum
    169 syn keyword juliaConstC DebrisThicknessEnum
    170169syn keyword juliaConstC DomainDimensionEnum
    171170syn keyword juliaConstC DomainTypeEnum
     
    211210syn keyword juliaConstC FrontalForcingsARMAmaOrderEnum
    212211syn keyword juliaConstC FrontalForcingsARMAdatebreaksEnum
     212syn keyword juliaConstC FrontalForcingsARMAmonthdatebreaksEnum
     213syn keyword juliaConstC FrontalForcingsARMAmonthinterceptsEnum
     214syn keyword juliaConstC FrontalForcingsARMAmonthtrendsEnum
    213215syn keyword juliaConstC FrontalForcingsARMApolyparamsEnum
    214216syn keyword juliaConstC FrontalForcingsNumberofBasinsEnum
    215217syn keyword juliaConstC FrontalForcingsNumberofBreaksEnum
     218syn keyword juliaConstC FrontalForcingsNumberofMonthBreaksEnum
    216219syn keyword juliaConstC FrontalForcingsNumberofParamsEnum
    217220syn keyword juliaConstC FrontalForcingsParamEnum
     
    717720syn keyword juliaConstC DamageDbarOldEnum
    718721syn keyword juliaConstC DamageFEnum
     722syn keyword juliaConstC DebrisThicknessEnum
    719723syn keyword juliaConstC DegreeOfChannelizationEnum
    720724syn keyword juliaConstC DepthBelowSurfaceEnum
  • issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp

    r27323 r27334  
    222222              else if (strcmp(name,"FrontalForcingsARMAmaOrder")==0) return FrontalForcingsARMAmaOrderEnum;
    223223              else if (strcmp(name,"FrontalForcingsARMAdatebreaks")==0) return FrontalForcingsARMAdatebreaksEnum;
     224              else if (strcmp(name,"FrontalForcingsARMAmonthdatebreaks")==0) return FrontalForcingsARMAmonthdatebreaksEnum;
     225              else if (strcmp(name,"FrontalForcingsARMAmonthintercepts")==0) return FrontalForcingsARMAmonthinterceptsEnum;
     226              else if (strcmp(name,"FrontalForcingsARMAmonthtrends")==0) return FrontalForcingsARMAmonthtrendsEnum;
    224227              else if (strcmp(name,"FrontalForcingsARMApolyparams")==0) return FrontalForcingsARMApolyparamsEnum;
    225228              else if (strcmp(name,"FrontalForcingsNumberofBasins")==0) return FrontalForcingsNumberofBasinsEnum;
    226229              else if (strcmp(name,"FrontalForcingsNumberofBreaks")==0) return FrontalForcingsNumberofBreaksEnum;
     230              else if (strcmp(name,"FrontalForcingsNumberofMonthBreaks")==0) return FrontalForcingsNumberofMonthBreaksEnum;
    227231              else if (strcmp(name,"FrontalForcingsNumberofParams")==0) return FrontalForcingsNumberofParamsEnum;
    228232              else if (strcmp(name,"FrontalForcingsParam")==0) return FrontalForcingsParamEnum;
     
    256260              else if (strcmp(name,"HydrologydcEplMaxThickness")==0) return HydrologydcEplMaxThicknessEnum;
    257261              else if (strcmp(name,"HydrologydcEplPoreWaterMass")==0) return HydrologydcEplPoreWaterMassEnum;
    258               else if (strcmp(name,"HydrologydcEplThickComp")==0) return HydrologydcEplThickCompEnum;
     262         else stage=3;
     263   }
     264   if(stage==3){
     265              if (strcmp(name,"HydrologydcEplThickComp")==0) return HydrologydcEplThickCompEnum;
    259266              else if (strcmp(name,"HydrologydcEplflipLock")==0) return HydrologydcEplflipLockEnum;
    260267              else if (strcmp(name,"HydrologydcIsefficientlayer")==0) return HydrologydcIsefficientlayerEnum;
    261268              else if (strcmp(name,"HydrologydcLeakageFactor")==0) return HydrologydcLeakageFactorEnum;
    262          else stage=3;
    263    }
    264    if(stage==3){
    265               if (strcmp(name,"HydrologydcMaxIter")==0) return HydrologydcMaxIterEnum;
     269              else if (strcmp(name,"HydrologydcMaxIter")==0) return HydrologydcMaxIterEnum;
    266270              else if (strcmp(name,"HydrologydcPenaltyFactor")==0) return HydrologydcPenaltyFactorEnum;
    267271              else if (strcmp(name,"HydrologydcPenaltyLock")==0) return HydrologydcPenaltyLockEnum;
     
    379383              else if (strcmp(name,"OceanGridNx")==0) return OceanGridNxEnum;
    380384              else if (strcmp(name,"OceanGridNy")==0) return OceanGridNyEnum;
    381               else if (strcmp(name,"OceanGridX")==0) return OceanGridXEnum;
     385         else stage=4;
     386   }
     387   if(stage==4){
     388              if (strcmp(name,"OceanGridX")==0) return OceanGridXEnum;
    382389              else if (strcmp(name,"OceanGridY")==0) return OceanGridYEnum;
    383390              else if (strcmp(name,"OutputBufferPointer")==0) return OutputBufferPointerEnum;
    384391              else if (strcmp(name,"OutputBufferSizePointer")==0) return OutputBufferSizePointerEnum;
    385          else stage=4;
    386    }
    387    if(stage==4){
    388               if (strcmp(name,"OutputFileName")==0) return OutputFileNameEnum;
     392              else if (strcmp(name,"OutputFileName")==0) return OutputFileNameEnum;
    389393              else if (strcmp(name,"OutputFilePointer")==0) return OutputFilePointerEnum;
    390394              else if (strcmp(name,"Outputdefinition")==0) return OutputdefinitionEnum;
     
    502506              else if (strcmp(name,"SmbAIdx")==0) return SmbAIdxEnum;
    503507              else if (strcmp(name,"SmbASnow")==0) return SmbASnowEnum;
    504               else if (strcmp(name,"SmbAccualti")==0) return SmbAccualtiEnum;
     508         else stage=5;
     509   }
     510   if(stage==5){
     511              if (strcmp(name,"SmbAccualti")==0) return SmbAccualtiEnum;
    505512              else if (strcmp(name,"SmbAccugrad")==0) return SmbAccugradEnum;
    506513              else if (strcmp(name,"SmbAccuref")==0) return SmbAccurefEnum;
    507514              else if (strcmp(name,"SmbAdThresh")==0) return SmbAdThreshEnum;
    508          else stage=5;
    509    }
    510    if(stage==5){
    511               if (strcmp(name,"SmbARMATimestep")==0) return SmbARMATimestepEnum;
     515              else if (strcmp(name,"SmbARMATimestep")==0) return SmbARMATimestepEnum;
    512516              else if (strcmp(name,"SmbARMAarOrder")==0) return SmbARMAarOrderEnum;
    513517              else if (strcmp(name,"SmbARMAmaOrder")==0) return SmbARMAmaOrderEnum;
     
    625629              else if (strcmp(name,"TransientAmrFrequency")==0) return TransientAmrFrequencyEnum;
    626630              else if (strcmp(name,"TransientIsage")==0) return TransientIsageEnum;
    627               else if (strcmp(name,"TransientIsdamageevolution")==0) return TransientIsdamageevolutionEnum;
     631         else stage=6;
     632   }
     633   if(stage==6){
     634              if (strcmp(name,"TransientIsdamageevolution")==0) return TransientIsdamageevolutionEnum;
    628635              else if (strcmp(name,"TransientIsdebris")==0) return TransientIsdebrisEnum;
    629636              else if (strcmp(name,"TransientIsesa")==0) return TransientIsesaEnum;
    630637              else if (strcmp(name,"TransientIsgia")==0) return TransientIsgiaEnum;
    631          else stage=6;
    632    }
    633    if(stage==6){
    634               if (strcmp(name,"TransientIsgroundingline")==0) return TransientIsgroundinglineEnum;
     638              else if (strcmp(name,"TransientIsgroundingline")==0) return TransientIsgroundinglineEnum;
    635639              else if (strcmp(name,"TransientIshydrology")==0) return TransientIshydrologyEnum;
    636640              else if (strcmp(name,"TransientIsmasstransport")==0) return TransientIsmasstransportEnum;
     
    748752              else if (strcmp(name,"DeltaDsl")==0) return DeltaDslEnum;
    749753              else if (strcmp(name,"DslOld")==0) return DslOldEnum;
    750               else if (strcmp(name,"Dsl")==0) return DslEnum;
     754         else stage=7;
     755   }
     756   if(stage==7){
     757              if (strcmp(name,"Dsl")==0) return DslEnum;
    751758              else if (strcmp(name,"DeltaStr")==0) return DeltaStrEnum;
    752759              else if (strcmp(name,"StrOld")==0) return StrOldEnum;
    753760              else if (strcmp(name,"Str")==0) return StrEnum;
    754          else stage=7;
    755    }
    756    if(stage==7){
    757               if (strcmp(name,"DeviatoricStresseffective")==0) return DeviatoricStresseffectiveEnum;
     761              else if (strcmp(name,"DeviatoricStresseffective")==0) return DeviatoricStresseffectiveEnum;
    758762              else if (strcmp(name,"DeviatoricStressxx")==0) return DeviatoricStressxxEnum;
    759763              else if (strcmp(name,"DeviatoricStressxy")==0) return DeviatoricStressxyEnum;
     
    871875              else if (strcmp(name,"LevelsetObservation")==0) return LevelsetObservationEnum;
    872876              else if (strcmp(name,"LoadingforceX")==0) return LoadingforceXEnum;
    873               else if (strcmp(name,"LoadingforceY")==0) return LoadingforceYEnum;
     877         else stage=8;
     878   }
     879   if(stage==8){
     880              if (strcmp(name,"LoadingforceY")==0) return LoadingforceYEnum;
    874881              else if (strcmp(name,"LoadingforceZ")==0) return LoadingforceZEnum;
    875882              else if (strcmp(name,"MaskOceanLevelset")==0) return MaskOceanLevelsetEnum;
    876883              else if (strcmp(name,"MaskIceLevelset")==0) return MaskIceLevelsetEnum;
    877          else stage=8;
    878    }
    879    if(stage==8){
    880               if (strcmp(name,"MaskIceRefLevelset")==0) return MaskIceRefLevelsetEnum;
     884              else if (strcmp(name,"MaskIceRefLevelset")==0) return MaskIceRefLevelsetEnum;
    881885              else if (strcmp(name,"MasstransportSpcthickness")==0) return MasstransportSpcthicknessEnum;
    882886              else if (strcmp(name,"MaterialsRheologyB")==0) return MaterialsRheologyBEnum;
     
    994998              else if (strcmp(name,"SigmaNN")==0) return SigmaNNEnum;
    995999              else if (strcmp(name,"SigmaVM")==0) return SigmaVMEnum;
    996               else if (strcmp(name,"SmbAccumulatedEC")==0) return SmbAccumulatedECEnum;
     1000         else stage=9;
     1001   }
     1002   if(stage==9){
     1003              if (strcmp(name,"SmbAccumulatedEC")==0) return SmbAccumulatedECEnum;
    9971004              else if (strcmp(name,"SmbAccumulatedMassBalance")==0) return SmbAccumulatedMassBalanceEnum;
    9981005              else if (strcmp(name,"SmbAccumulatedMelt")==0) return SmbAccumulatedMeltEnum;
    9991006              else if (strcmp(name,"SmbAccumulatedPrecipitation")==0) return SmbAccumulatedPrecipitationEnum;
    1000          else stage=9;
    1001    }
    1002    if(stage==9){
    1003               if (strcmp(name,"SmbAccumulatedRain")==0) return SmbAccumulatedRainEnum;
     1007              else if (strcmp(name,"SmbAccumulatedRain")==0) return SmbAccumulatedRainEnum;
    10041008              else if (strcmp(name,"SmbAccumulatedRefreeze")==0) return SmbAccumulatedRefreezeEnum;
    10051009              else if (strcmp(name,"SmbAccumulatedRunoff")==0) return SmbAccumulatedRunoffEnum;
     
    11171121              else if (strcmp(name,"StrainRateeffective")==0) return StrainRateeffectiveEnum;
    11181122              else if (strcmp(name,"StrainRateparallel")==0) return StrainRateparallelEnum;
    1119               else if (strcmp(name,"StrainRateperpendicular")==0) return StrainRateperpendicularEnum;
     1123         else stage=10;
     1124   }
     1125   if(stage==10){
     1126              if (strcmp(name,"StrainRateperpendicular")==0) return StrainRateperpendicularEnum;
    11201127              else if (strcmp(name,"StrainRatexx")==0) return StrainRatexxEnum;
    11211128              else if (strcmp(name,"StrainRatexy")==0) return StrainRatexyEnum;
    11221129              else if (strcmp(name,"StrainRatexz")==0) return StrainRatexzEnum;
    1123          else stage=10;
    1124    }
    1125    if(stage==10){
    1126               if (strcmp(name,"StrainRateyy")==0) return StrainRateyyEnum;
     1130              else if (strcmp(name,"StrainRateyy")==0) return StrainRateyyEnum;
    11271131              else if (strcmp(name,"StrainRateyz")==0) return StrainRateyzEnum;
    11281132              else if (strcmp(name,"StrainRatezz")==0) return StrainRatezzEnum;
     
    12401244              else if (strcmp(name,"Outputdefinition45")==0) return Outputdefinition45Enum;
    12411245              else if (strcmp(name,"Outputdefinition46")==0) return Outputdefinition46Enum;
    1242               else if (strcmp(name,"Outputdefinition47")==0) return Outputdefinition47Enum;
     1246         else stage=11;
     1247   }
     1248   if(stage==11){
     1249              if (strcmp(name,"Outputdefinition47")==0) return Outputdefinition47Enum;
    12431250              else if (strcmp(name,"Outputdefinition48")==0) return Outputdefinition48Enum;
    12441251              else if (strcmp(name,"Outputdefinition49")==0) return Outputdefinition49Enum;
    12451252              else if (strcmp(name,"Outputdefinition4")==0) return Outputdefinition4Enum;
    1246          else stage=11;
    1247    }
    1248    if(stage==11){
    1249               if (strcmp(name,"Outputdefinition50")==0) return Outputdefinition50Enum;
     1253              else if (strcmp(name,"Outputdefinition50")==0) return Outputdefinition50Enum;
    12501254              else if (strcmp(name,"Outputdefinition51")==0) return Outputdefinition51Enum;
    12511255              else if (strcmp(name,"Outputdefinition52")==0) return Outputdefinition52Enum;
     
    13631367              else if (strcmp(name,"ControlInputValues")==0) return ControlInputValuesEnum;
    13641368              else if (strcmp(name,"CrouzeixRaviart")==0) return CrouzeixRaviartEnum;
    1365               else if (strcmp(name,"Cuffey")==0) return CuffeyEnum;
     1369         else stage=12;
     1370   }
     1371   if(stage==12){
     1372              if (strcmp(name,"Cuffey")==0) return CuffeyEnum;
    13661373              else if (strcmp(name,"CuffeyTemperate")==0) return CuffeyTemperateEnum;
    13671374              else if (strcmp(name,"DamageEvolutionAnalysis")==0) return DamageEvolutionAnalysisEnum;
    13681375              else if (strcmp(name,"DamageEvolutionSolution")==0) return DamageEvolutionSolutionEnum;
    1369          else stage=12;
    1370    }
    1371    if(stage==12){
    1372               if (strcmp(name,"DataSet")==0) return DataSetEnum;
     1376              else if (strcmp(name,"DataSet")==0) return DataSetEnum;
    13731377              else if (strcmp(name,"DataSetParam")==0) return DataSetParamEnum;
    13741378              else if (strcmp(name,"DatasetInput")==0) return DatasetInputEnum;
     
    14861490              else if (strcmp(name,"LevelsetAnalysis")==0) return LevelsetAnalysisEnum;
    14871491              else if (strcmp(name,"LevelsetfunctionPicard")==0) return LevelsetfunctionPicardEnum;
    1488               else if (strcmp(name,"LinearFloatingMeltRate")==0) return LinearFloatingMeltRateEnum;
     1492         else stage=13;
     1493   }
     1494   if(stage==13){
     1495              if (strcmp(name,"LinearFloatingMeltRate")==0) return LinearFloatingMeltRateEnum;
    14891496              else if (strcmp(name,"LinearFloatingMeltRatearma")==0) return LinearFloatingMeltRatearmaEnum;
    14901497              else if (strcmp(name,"LliboutryDuval")==0) return LliboutryDuvalEnum;
    14911498              else if (strcmp(name,"Loads")==0) return LoadsEnum;
    1492          else stage=13;
    1493    }
    1494    if(stage==13){
    1495               if (strcmp(name,"LoveAnalysis")==0) return LoveAnalysisEnum;
     1499              else if (strcmp(name,"LoveAnalysis")==0) return LoveAnalysisEnum;
    14961500              else if (strcmp(name,"LoveHf")==0) return LoveHfEnum;
    14971501              else if (strcmp(name,"LoveHt")==0) return LoveHtEnum;
     
    16091613              else if (strcmp(name,"SMBgradients")==0) return SMBgradientsEnum;
    16101614              else if (strcmp(name,"SMBgradientscomponents")==0) return SMBgradientscomponentsEnum;
    1611               else if (strcmp(name,"SMBgradientsela")==0) return SMBgradientselaEnum;
     1615         else stage=14;
     1616   }
     1617   if(stage==14){
     1618              if (strcmp(name,"SMBgradientsela")==0) return SMBgradientselaEnum;
    16121619              else if (strcmp(name,"SMBhenning")==0) return SMBhenningEnum;
    16131620              else if (strcmp(name,"SMBmeltcomponents")==0) return SMBmeltcomponentsEnum;
    16141621              else if (strcmp(name,"SMBpdd")==0) return SMBpddEnum;
    1615          else stage=14;
    1616    }
    1617    if(stage==14){
    1618               if (strcmp(name,"SMBpddSicopolis")==0) return SMBpddSicopolisEnum;
     1622              else if (strcmp(name,"SMBpddSicopolis")==0) return SMBpddSicopolisEnum;
    16191623              else if (strcmp(name,"SMBsemic")==0) return SMBsemicEnum;
    16201624              else if (strcmp(name,"SSAApproximation")==0) return SSAApproximationEnum;
  • issm/trunk-jpl/src/m/classes/frontalforcingsrignotarma.m

    r27318 r27334  
    66classdef frontalforcingsrignotarma
    77        properties (SetAccess=public)
    8                 num_basins           = 0;
    9                 num_params           = 0;
    10                 num_breaks           = 0;
    11                 polynomialparams     = NaN;
    12                 datebreaks           = NaN;
    13                 ar_order             = 0;
    14                 ma_order             = 0;
    15                 arma_timestep        = 0;
    16                 arlag_coefs          = NaN;
    17                 malag_coefs          = NaN;
    18                 monthly_effects      = NaN;
    19                 basin_id             = NaN;
    20                 subglacial_discharge = NaN;
     8                num_basins               = 0;
     9                num_params               = 0;
     10                num_breaks               = 0;
     11                polynomialparams         = NaN;
     12                datebreaks               = NaN;
     13                ar_order                 = 0;
     14                ma_order                 = 0;
     15                arma_timestep            = 0;
     16                arlag_coefs              = NaN;
     17                malag_coefs              = NaN;
     18                monthlyvals_intercepts   = NaN;
     19                monthlyvals_trends       = NaN;
     20                monthlyvals_numbreaks    = 0;
     21                monthlyvals_datebreaks   = NaN;
     22                basin_id                 = NaN;
     23                subglacial_discharge     = NaN;
    2124        end
    2225        methods
     
    5255                end % }}}
    5356                function md = checkconsistency(self,md,solution,analyses) % {{{
    54                         %Early return
    55                         if (~strcmp(solution,'TransientSolution') | md.transient.ismovingfront==0), return; end
    56 
    57                         nbas = md.frontalforcings.num_basins;
    58                         nprm = md.frontalforcings.num_params;
    59                         nbrk = md.frontalforcings.num_breaks;
    60                         md = checkfield(md,'fieldname','frontalforcings.num_basins','numel',1,'NaN',1,'Inf',1,'>',0);
    61                         md = checkfield(md,'fieldname','frontalforcings.num_params','numel',1,'NaN',1,'Inf',1,'>',0);
    62                         md = checkfield(md,'fieldname','frontalforcings.num_breaks','numel',1,'NaN',1,'Inf',1,'>=',0);
     57         %Early return
     58         if (~strcmp(solution,'TransientSolution') | md.transient.ismovingfront==0), return; end
     59
     60         nbas  = md.frontalforcings.num_basins;
     61         nprm  = md.frontalforcings.num_params;
     62         nbrk  = md.frontalforcings.num_breaks;
     63         nMbrk = md.frontalforcings.monthlyvals_numbreaks;
     64         md = checkfield(md,'fieldname','frontalforcings.num_basins','numel',1,'NaN',1,'Inf',1,'>',0);
     65         md = checkfield(md,'fieldname','frontalforcings.num_params','numel',1,'NaN',1,'Inf',1,'>',0);
     66         md = checkfield(md,'fieldname','frontalforcings.num_breaks','numel',1,'NaN',1,'Inf',1,'>=',0);
    6367         md = checkfield(md,'fieldname','frontalforcings.basin_id','Inf',1,'>=',0,'<=',md.frontalforcings.num_basins,'size',[md.mesh.numberofelements 1]);
    64                         md = checkfield(md,'fieldname','frontalforcings.subglacial_discharge','>=',0,'NaN',1,'Inf',1,'timeseries',1);
    65                         if(nbas>1 && nbrk>=1 && nprm>1)
    66                            md = checkfield(md,'fieldname','frontalforcings.polynomialparams','NaN',1,'Inf',1,'size',[nbas,nbrk+1,nprm],'numel',nbas*(nbrk+1)*nprm);
    67                         elseif(nbas==1)
    68                                 md = checkfield(md,'fieldname','frontalforcings.polynomialparams','NaN',1,'Inf',1,'size',[nprm,nbrk+1],'numel',nbas*(nbrk+1)*nprm);
    69                         elseif(nbrk==0)
    70                                 md = checkfield(md,'fieldname','frontalforcings.polynomialparams','NaN',1,'Inf',1,'size',[nbas,nprm],'numel',nbas*(nbrk+1)*nprm);
    71                         elseif(nprm==1)
    72                                 md = checkfield(md,'fieldname','frontalforcings.polynomialparams','NaN',1,'Inf',1,'size',[nbas,nbrk+1],'numel',nbas*(nbrk+1)*nprm);
    73                         end
    74                         md = checkfield(md,'fieldname','frontalforcings.ar_order','numel',1,'NaN',1,'Inf',1,'>=',0);
     68         md = checkfield(md,'fieldname','frontalforcings.subglacial_discharge','>=',0,'NaN',1,'Inf',1,'timeseries',1);
     69         if(nbas>1 && nbrk>=1 && nprm>1)
     70            md = checkfield(md,'fieldname','frontalforcings.polynomialparams','NaN',1,'Inf',1,'size',[nbas,nbrk+1,nprm],'numel',nbas*(nbrk+1)*nprm);
     71         elseif(nbas==1)
     72            md = checkfield(md,'fieldname','frontalforcings.polynomialparams','NaN',1,'Inf',1,'size',[nprm,nbrk+1],'numel',nbas*(nbrk+1)*nprm);
     73         elseif(nbrk==0)
     74            md = checkfield(md,'fieldname','frontalforcings.polynomialparams','NaN',1,'Inf',1,'size',[nbas,nprm],'numel',nbas*(nbrk+1)*nprm);
     75         elseif(nprm==1)
     76            md = checkfield(md,'fieldname','frontalforcings.polynomialparams','NaN',1,'Inf',1,'size',[nbas,nbrk+1],'numel',nbas*(nbrk+1)*nprm);
     77         end
     78         md = checkfield(md,'fieldname','frontalforcings.ar_order','numel',1,'NaN',1,'Inf',1,'>=',0);
    7579         md = checkfield(md,'fieldname','frontalforcings.ma_order','numel',1,'NaN',1,'Inf',1,'>=',0);
    7680         md = checkfield(md,'fieldname','frontalforcings.arma_timestep','numel',1,'NaN',1,'Inf',1,'>=',md.timestepping.time_step); %ARMA time step cannot be finer than ISSM timestep
    77                         md = checkfield(md,'fieldname','frontalforcings.arlag_coefs','NaN',1,'Inf',1,'size',[md.frontalforcings.num_basins,md.frontalforcings.ar_order]);
    78                         md = checkfield(md,'fieldname','frontalforcings.malag_coefs','NaN',1,'Inf',1,'size',[md.frontalforcings.num_basins,md.frontalforcings.ma_order]);
    79                         if(nbrk>0)
    80                                 md = checkfield(md,'fieldname','frontalforcings.datebreaks','NaN',1,'Inf',1,'size',[nbas,nbrk]);
    81                         elseif(numel(md.frontalforcings.datebreaks)==0 || all(isnan(md.frontalforcings.datebreaks)))
    82                                 ;
    83                         else
    84                                 error('md.frontalforcings.num_breaks is 0 but md.frontalforcings.datebreaks is not empty');
    85                         end
    86                         if(any(~isnan(md.frontalforcings.monthly_effects)))
    87                                 md = checkfield(md,'fieldname','frontalforcings.monthly_effects','NaN',1,'Inf',1,'size',[md.frontalforcings.num_basins,12]);
    88                                 if(md.timestepping.time_step>=1)
    89                                         error('md.frontalforcings.monthly_effects are provided but md.timestepping.time_step>=1');
    90                                 end
    91                         end
    92 
    93                 end % }}}
     81         md = checkfield(md,'fieldname','frontalforcings.arlag_coefs','NaN',1,'Inf',1,'size',[md.frontalforcings.num_basins,md.frontalforcings.ar_order]);
     82         md = checkfield(md,'fieldname','frontalforcings.malag_coefs','NaN',1,'Inf',1,'size',[md.frontalforcings.num_basins,md.frontalforcings.ma_order]);
     83         if(nbrk>0)
     84            md = checkfield(md,'fieldname','frontalforcings.datebreaks','NaN',1,'Inf',1,'size',[nbas,nbrk]);
     85         elseif(numel(md.frontalforcings.datebreaks)==0 || all(isnan(md.frontalforcings.datebreaks)))
     86            ;
     87         else
     88            error('md.frontalforcings.num_breaks is 0 but md.frontalforcings.datebreaks is not empty');
     89         end
     90
     91                        %%% Check if some monthly forcings are provided %%%
     92                        if((numel(md.frontalforcings.monthlyvals_intercepts)>1 || ~isnan(md.frontalforcings.monthlyvals_intercepts)) || (numel(md.frontalforcings.monthlyvals_trends)>1 || ~isnan(md.frontalforcings.monthlyvals_trends)) || (numel(md.frontalforcings.monthlyvals_datebreaks)>1 || ~isnan(md.frontalforcings.monthlyvals_datebreaks)))
     93                                isMonthly = true;
     94                        else
     95                                isMonthly = false;
     96                        end
     97                        if(numel(md.frontalforcings.monthlyvals_trends)>1 || ~isnan(md.frontalforcings.monthlyvals_trends))
     98                                isMonthlyTrend = true;
     99                        else
     100                                isMonthlyTrend = false;
     101                        end
     102                        if(isMonthly)
     103            md = checkfield(md,'fieldname','frontalforcings.monthlyvals_numbreaks','numel',1,'NaN',1,'Inf',1,'>=',0);
     104                           if(nbas>1 && nMbrk>=1)
     105               md = checkfield(md,'fieldname','frontalforcings.monthlyvals_intercepts','NaN',1,'Inf',1,'size',[nbas,12,nMbrk+1],'numel',nbas*(nMbrk+1)*12);
     106                                if(isMonthlyTrend)
     107                                        md = checkfield(md,'fieldname','frontalforcings.monthlyvals_trends','NaN',1,'Inf',1,'size',[nbas,12,nMbrk+1],'numel',nbas*(nMbrk+1)*12);
     108                                end
     109                           elseif(nbas==1)
     110               md = checkfield(md,'fieldname','frontalforcings.monthlyvals_intercepts','NaN',1,'Inf',1,'size',[nMbrk+1,12],'numel',nbas*(nMbrk+1)*12);
     111                                if(isMonthlyTrend)
     112                                        md = checkfield(md,'fieldname','frontalforcings.monthlyvals_trends','NaN',1,'Inf',1,'size',[nMbrk+1,12],'numel',nbas*(nMbrk+1)*12);
     113               end
     114                           elseif(nMbrk==0)
     115               md = checkfield(md,'fieldname','frontalforcings.monthlyvals_intercepts','NaN',1,'Inf',1,'size',[nbas,12],'numel',nbas*(nMbrk+1)*12);
     116                                if(isMonthlyTrend)
     117                                        md = checkfield(md,'fieldname','frontalforcings.monthlyvals_trends','NaN',1,'Inf',1,'size',[nbas,12],'numel',nbas*(nMbrk+1)*12);
     118               end
     119                           end
     120                           if(nMbrk>0)
     121               md = checkfield(md,'fieldname','frontalforcings.monthlyvals_datebreaks','NaN',1,'Inf',1,'size',[nbas,nMbrk]);
     122            elseif(numel(md.frontalforcings.monthlyvals_datebreaks)==0 || all(isnan(md.frontalforcings.monthlyvals_datebreaks)))
     123               ;
     124            else
     125               error('md.frontalforcings.monthlyvals_numbreaks is 0 but md.frontalforcings.monthlyvals_datebreaks is not empty');
     126            end
     127                   end
     128
     129      end % }}}
    94130                function disp(self) % {{{
    95131                        disp(sprintf('   Frontalforcings parameters:'));
     
    107143         fielddisplay(self,'arlag_coefs','basin-specific vectors of AR lag coefficients [unitless]');
    108144         fielddisplay(self,'malag_coefs','basin-specific vectors of MA lag coefficients [unitless]');
    109          fielddisplay(self,'monthly_effects','basin-specific monthly values of TF added at corresponding month (default: all 0) [°C]');
     145         fielddisplay(self,'monthlyvals_intercepts','intercept of basin-specific piecewise-linear monthly values of TF added at corresponding month (default: all 0) [°C]');
     146         fielddisplay(self,'monthlyvals_trends','trends in basin-specific piecewise-linear monthly values of TF added at corresponding month (default: all 0) [°C/yr]');
     147         fielddisplay(self,'monthlyvals_numbreaks','number of breakpoints in the piecewise-linear functions of monthly values');
     148         fielddisplay(self,'monthlyvals_datebreaks','dates at which the breakpoints in the piecewise-linear monthly values occur (1 row per basin)');
    110149                end % }}}
    111150                function marshall(self,prefix,md,fid) % {{{
    112151                        yts=md.constants.yts;
    113                         nbas = md.frontalforcings.num_basins;
    114                         nprm = md.frontalforcings.num_params;
    115                         nper = md.frontalforcings.num_breaks+1;
     152                        %%% Deal with polynomial %%%
     153                        nbas  = md.frontalforcings.num_basins;
     154                        nprm  = md.frontalforcings.num_params;
     155                        nper  = md.frontalforcings.num_breaks+1;
    116156                        % Scale the parameters %
    117157                        polyparamsScaled   = md.frontalforcings.polynomialparams;
     
    150190                                polyparams2dScaled = polyparamsScaled;
    151191                        end
    152                         if(any(isnan(md.frontalforcings.monthly_effects))) %monthly effects not provided, set to 0
    153                                 meffects = zeros(md.frontalforcings.num_basins,12);
    154                         else
    155                                 meffects = md.frontalforcings.monthly_effects;
    156                         end
    157192                        if(nper==1) %a single period (no break date)
    158193                                dbreaks = zeros(nbas,1); %dummy
    159194                        else
    160195                                dbreaks = md.frontalforcings.datebreaks;
     196                        end
     197
     198                        %%% Deal with monthly effects %%%
     199                        nMper = md.frontalforcings.monthlyvals_numbreaks+1;
     200                        if((numel(md.frontalforcings.monthlyvals_intercepts)<=1 && isnan(md.frontalforcings.monthlyvals_intercepts)))
     201                                interceptsM = zeros(nbas,12); %monthly intercepts not provided, set to 0
     202                                trendsM     = zeros(nbas,12); %set monthly trends also to 0
     203                        else
     204                                interceptsM3d = md.frontalforcings.monthlyvals_intercepts;
     205                                if((numel(md.frontalforcings.monthlyvals_trends)<=1 && isnan(md.frontalforcings.monthlyvals_trends)))
     206                                        trendsM3d = 0*interceptsM3d; %monthly trends not provided, set to 0
     207                                else
     208                                        trendsM3d = md.frontalforcings.monthlyvals_trends;
     209                                end
     210                        end
     211                        % Create 2D arrays from 3D arrays if needed %
     212                        if(nMper>1 && (numel(md.frontalforcings.monthlyvals_intercepts)>1 || ~isnan(md.frontalforcings.monthlyvals_intercepts)))
     213                                interceptsM = zeros(nbas,12*nMper);
     214                                trendsM     = zeros(nbas,12*nMper);
     215                                for(ii=[1:nMper])
     216                                        jj = 1+(ii-1)*12;
     217                                        interceptsM(:,jj:jj+12-1) = interceptsM3d(:,:,ii);
     218                                        trendsM(:,jj:jj+12-1)     = trendsM3d(:,:,ii);
     219                                end
     220                        elseif(nMper==1 && (numel(md.frontalforcings.monthlyvals_intercepts)>1 || ~isnan(md.frontalforcings.monthlyvals_intercepts)))
     221                                interceptsM = interceptsM3d;
     222                                trendsM     = trendsM3d;
     223                        end
     224                        if(nMper==1) %a single period (no break date)
     225                                dMbreaks = zeros(nbas,1); %dummy
     226                        else
     227                                dMbreaks = md.frontalforcings.monthlyvals_datebreaks;
    161228                        end
    162229
     
    174241         WriteData(fid,prefix,'object',self,'class','frontalforcings','fieldname','malag_coefs','format','DoubleMat','name','md.frontalforcings.malag_coefs','yts',yts);
    175242         WriteData(fid,prefix,'data',dbreaks,'name','md.frontalforcings.datebreaks','format','DoubleMat','scale',yts);
    176          WriteData(fid,prefix,'data',meffects,'name','md.frontalforcings.monthly_effects','format','DoubleMat');
     243                        WriteData(fid,prefix,'object',self,'class','frontalforcings','fieldname','monthlyvals_numbreaks','format','Integer');
     244         WriteData(fid,prefix,'data',dMbreaks,'name','md.frontalforcings.monthlyvals_datebreaks','format','DoubleMat','scale',yts);
     245         WriteData(fid,prefix,'data',interceptsM,'name','md.frontalforcings.monthlyvals_intercepts','format','DoubleMat');
     246         WriteData(fid,prefix,'data',trendsM,'name','md.frontalforcings.monthlyvals_trends','format','DoubleMat','scale',1/yts);
    177247                end % }}}
    178248        end
  • issm/trunk-jpl/src/m/classes/frontalforcingsrignotarma.py

    r27318 r27334  
    2525        self.arlag_coefs = np.nan
    2626        self.malag_coefs = np.nan
    27         self.monthly_effects = np.nan
     27        self.monthlyvals_intercepts = np.nan
     28        self.monthlyvals_trends = np.nan
     29        self.monthlyvals_numbreaks = 0
     30        self.monthlyvals_datebreaks = np.nan
    2831        self.basin_id = np.nan
    2932        self.subglacial_discharge = np.nan
     
    4851        s += '{}\n'.format(fielddisplay(self, 'arlag_coefs', 'basin-specific vectors of AR lag coefficients [unitless]'))
    4952        s += '{}\n'.format(fielddisplay(self, 'malag_coefs', 'basin-specific vectors of MA lag coefficients [unitless]'))
    50         s += '{}\n'.format(fielddisplay(self, 'monthly_effects', 'basin-specific monthly values of TF added at corresponding month (default: all 0) [°C]'))
    5153        return s
    5254    #}}}
     
    6668            return md
    6769
    68         nbas = md.frontalforcings.num_basins;
    69         nprm = md.frontalforcings.num_params;
    70         nbrk = md.frontalforcings.num_breaks;
     70        nbas  = md.frontalforcings.num_basins;
     71        nprm  = md.frontalforcings.num_params;
     72        nbrk  = md.frontalforcings.num_breaks;
     73        nMbrk = md.frontalforcings.monthlyvals_numbreaks;
    7174        md = checkfield(md, 'fieldname', 'frontalforcings.num_basins', 'numel', 1, 'NaN', 1, 'Inf', 1, '>', 0)
    7275        md = checkfield(md, 'fieldname', 'frontalforcings.num_params', 'numel', 1, 'NaN', 1, 'Inf', 1, '>', 0)
     
    9598        else:
    9699            raise RuntimeError('md.frontalforcings.num_breaks is 0 but md.frontalforcings.datebreaks is not empty')
    97         if(np.any(np.isnan(md.frontalforcings.monthly_effects)==False)):
    98             md = checkfield(md, 'fieldname', 'frontalforcings.monthly_effects', 'NaN', 1, 'Inf', 1, 'size', [md.frontalforcings.num_basins, 12])
    99             if(md.timestepping.time_step>=1):
    100                 raise RuntimeError('md.frontalforcings.monthly_effects are provided but md.timestepping.time_step>=1')
     100       
     101
     102        ### Check if some monthly forcings are provided ###
     103        if(np.all(np.isnan(md.frontalforcings.monthlyvals_intercepts))==False or np.all(np.isnan(md.frontalforcings.monthlyvals_trends))==False or np.all(np.isnan(md.frontalforcings.monthlyvals_datebreaks))==False):
     104            isMonthly = True
     105        else:
     106            isMonthly = False
     107        if(np.all(np.isnan(md.frontalforcings.monthlyvals_datebreaks))):
     108            isMonthlyTrend = True
     109        else:
     110            isMonthlyTrend = False
     111        if(isMonthly):
     112            md = checkfield(md, 'fieldname', 'frontalforcings.monthlyvals_numbreaks', 'numel', 1, 'NaN', 1, 'Inf', 1, '>=', 0)
     113            if(nbas>1 and nMbrk>=1):
     114                md = checkfield(md,'fieldname','frontalforcings.monthlyvals_intercepts','NaN',1,'Inf',1,'size',[nbas,12,nMbrk+1],'numel',nbas*(nMbrk+1)*12)
     115                if(isMonthlyTrend):
     116                    md = checkfield(md,'fieldname','frontalforcings.monthlyvals_trends','NaN',1,'Inf',1,'size',[nbas,12,nMbrk+1],'numel',nbas*(nMbrk+1)*12)
     117            elif(nbas==1):
     118               md = checkfield(md,'fieldname','frontalforcings.monthlyvals_intercepts','NaN',1,'Inf',1,'size',[nMbrk+1,12],'numel',nbas*(nMbrk+1)*12)
     119               if(isMonthlyTrend):
     120                  md = checkfield(md,'fieldname','frontalforcings.monthlyvals_trends','NaN',1,'Inf',1,'size',[nMbrk+1,12],'numel',nbas*(nMbrk+1)*12)
     121            elif(nMbrk==0):
     122               md = checkfield(md,'fieldname','frontalforcings.monthlyvals_intercepts','NaN',1,'Inf',1,'size',[nbas,12],'numel',nbas*(nMbrk+1)*12)
     123               if(isMonthlyTrend):
     124                  md = checkfield(md,'fieldname','frontalforcings.monthlyvals_trends','NaN',1,'Inf',1,'size',[nbas,12],'numel',nbas*(nMbrk+1)*12)
     125        if(nMbrk>0):
     126            md = checkfield(md, 'fieldname', 'frontalforcings.monthlyvals_datebreaks', 'NaN', 1, 'Inf', 1, 'size', [nbas,nMbrk])
     127        elif(np.size(md.frontalforcings.monthlyvals_datebreaks)==0 or np.all(np.isnan(md.frontalforcings.monthlyvals_datebreaks))):
     128            pass
     129        else:
     130            raise RuntimeError('md.frontalforcings.monthlyvals_numbreaks is 0 but md.frontalforcings.monthlyvals_datebreaks is not empty')
     131
    101132        return md
    102133    # }}}
     
    139170            # 2D array is already in correct format and no need for scaling #
    140171            polyparams2dScaled = np.copy(polyparamsScaled)
    141         if(np.any(np.isnan(md.frontalforcings.monthly_effects))): #monthly effects not provided, set to 0
    142             meffects = np.zeros((md.frontalforcings.num_basins,12))
    143         else:
    144             meffects = 1*md.frontalforcings.monthly_effects
    145172        if(nper==1):
    146173            dbreaks = np.zeros((nbas,1))
    147174        else:
    148175            dbreaks = np.copy(md.frontalforcings.datebreaks)
     176
     177        ### Deal with montly effects ###
     178        nMper = md.frontalforcings.monthlyvals_numbreaks+1
     179        if(np.any(np.isnan(md.frontalforcings.monthlyvals_intercepts))):
     180            interceptsM = np.zeros((nbas,12)) #monthly intercepts not provided, set to 0
     181            trendsM     = np.zeros((nbas,12)) #set monthly trends also to 0
     182        else:
     183            interceptsM3d = md.frontalforcings.monthlyvals_intercepts
     184            if(np.any(np.isnan(md.frontalforcings.monthlyvals_trends))):
     185                trendsM3d = 0*interceptsM3d #monthly trends not provided, set to 0
     186            else:
     187                trendsM3d = md.frontalforcings.monthlyvals_trends
     188        # Create 2D arrays from 3D arrays if needed #
     189        if(nMper>1 and np.all(np.isnan(md.frontalforcings.monthlyvals_intercepts))==False):
     190            interceptsM = np.zeros((nbas,12*nMper))
     191            trendsM     = np.zeros((nbas,12*nMper))
     192            for ii in range(nMper):
     193                interceptsM[:,ii*12:(ii+1)*12] = 1*interceptsM3d[:,:,ii]
     194                trendsM[:,ii*12:(ii+1)*12] = 1*trendsM3d[:,:,ii]
     195        elif(nMper==1 and np.all(np.isnan(md.frontalforcings.monthlyvals_intercepts))==False):
     196            interceptsM = 1*interceptsM3d
     197            trendsM     = 1*trendsM3d
     198        if(nMper==1):
     199            dMbreaks = np.zeros((nbas,1))
     200        else:
     201            dMbreaks = np.copy(md.frontalforcings.monthlyvals_datebreaks)
    149202
    150203        WriteData(fid, prefix, 'name', 'md.frontalforcings.parameterization', 'data', 3, 'format', 'Integer')
     
    161214        WriteData(fid, prefix, 'object', self, 'class', 'frontalforcings', 'fieldname', 'malag_coefs', 'format', 'DoubleMat', 'name', 'md.frontalforcings.malag_coefs', 'yts', yts)
    162215        WriteData(fid, prefix, 'data', dbreaks, 'name', 'md.frontalforcings.datebreaks', 'format', 'DoubleMat','scale',yts)
    163         WriteData(fid, prefix, 'data', meffects, 'name', 'md.frontalforcings.monthly_effects', 'format', 'DoubleMat')
     216        WriteData(fid,prefix,'object',self,'class','frontalforcings','fieldname','monthlyvals_numbreaks','format','Integer')
     217        WriteData(fid,prefix,'data',dMbreaks,'name','md.frontalforcings.monthlyvals_datebreaks','format','DoubleMat','scale',yts)
     218        WriteData(fid,prefix,'data',interceptsM,'name','md.frontalforcings.monthlyvals_intercepts','format','DoubleMat')
     219        WriteData(fid,prefix,'data',trendsM,'name','md.frontalforcings.monthlyvals_trends','format','DoubleMat','scale',1/yts)
    164220    # }}}
     221
     222
  • issm/trunk-jpl/test/NightlyRun/test543.m

    r27318 r27334  
    55md=setflowequation(md,'SSA','all');
    66md.timestepping.start_time = 0;
    7 md.timestepping.time_step  = 1;
    8 md.timestepping.final_time = 10;
     7md.timestepping.time_step  = 0.05;
     8md.timestepping.final_time = 2;
    99
    1010%Basin separation TF
     
    5252trendlin         = [-0.5,-0.2,0.1;0,0,0];
    5353trendquad        = [0,0.0,0;0.1,0.1,0.1];
    54 datebreaks       = [4,7;4,7];
     54datebreaks       = [0.5,1.5;0.5,1.5];
    5555polynomialparams = cat(numparams,intercept,trendlin,trendquad);
     56% Monthly effects params %
     57numbreaksM       = 1;
     58intcpsMp0        = [-0.5,-0.5,0,0,0,0,0.5,0.5,0,0,0,0;
     59                    -1.0,-1.0,0,0,0,0,1.0,1.0,0,0,0,0];
     60intcpsMp1        = [-0.25,-0.25,0,0,0,0,0.,0.,0,0,0,0;
     61                    -0.1,-0.1,0,0,0,0,0.1,0.1,0,0,0,0];
     62intcpsM          = cat(3,intcpsMp0,intcpsMp1);
     63trendsMp0        = [0,0,0,0,0,0,0.,0.0,0,0,0,0;
     64                    0.0,0.0,0,-0.0,0,0,0.0,0.0,0,0,0,0];
     65trendsMp1        = [0,-0.12,0,0,0,0,0.,0.0,0,0.0,0,0;
     66                    0.0,-0.1,0,-0.0,0,0,0.0,0.0,0,0,0,0];
     67trendsM          = cat(3,trendsMp0,trendsMp1);
     68datebreaksM      = [1;1];
    5669
    57 md.frontalforcings.num_basins           = nb_tf;
    58 md.frontalforcings.basin_id             = idb_tf;
    59 md.frontalforcings.num_params           = numparams; %number of parameters in the polynomial
    60 md.frontalforcings.num_breaks           = numbreaks; %number of breakpoints
    61 md.frontalforcings.subglacial_discharge = 0.01*ones(md.mesh.numberofvertices,1);
    62 md.frontalforcings.polynomialparams     = polynomialparams;
    63 md.frontalforcings.datebreaks           = datebreaks;
    64 md.frontalforcings.ar_order             = 4;
    65 md.frontalforcings.ma_order             = 2;
    66 md.frontalforcings.arma_timestep        = 2; %timestep of the ARMA model [yr]
    67 md.frontalforcings.arlag_coefs          = [[0.1,-0.1,0.01,-0.01];[0.2,-0.2,0.1,0.0]]; %autoregressive parameters
    68 md.frontalforcings.malag_coefs          = [[0.1,0.0];[0.0,0.1]]; %moving-average parameters
    69 
     70md.frontalforcings.num_basins              = nb_tf;
     71md.frontalforcings.basin_id                = idb_tf;
     72md.frontalforcings.num_params              = numparams; %number of parameters in the polynomial
     73md.frontalforcings.num_breaks              = numbreaks; %number of breakpoints
     74md.frontalforcings.subglacial_discharge    = 0.01*ones(md.mesh.numberofvertices,1);
     75md.frontalforcings.polynomialparams        = polynomialparams;
     76md.frontalforcings.datebreaks              = datebreaks;
     77md.frontalforcings.ar_order                = 4;
     78md.frontalforcings.ma_order                = 2;
     79md.frontalforcings.arma_timestep           = 2; %timestep of the ARMA model [yr]
     80md.frontalforcings.arlag_coefs             = [[0.1,-0.1,0.01,-0.01];[0.2,-0.2,0.1,0.0]]; %autoregressive parameters
     81md.frontalforcings.malag_coefs             = [[0.1,0.0];[0.0,0.1]]; %moving-average parameters
     82md.frontalforcings.monthlyvals_numbreaks   = numbreaksM;
     83md.frontalforcings.monthlyvals_intercepts  = intcpsM;
     84md.frontalforcings.monthlyvals_trends      = trendsM;
     85md.frontalforcings.monthlyvals_datebreaks  = datebreaksM;
    7086% Floating Ice Melt parameters
    7187md.basalforcings.floatingice_melting_rate = 0.1*ones(md.mesh.numberofvertices,1);
     
    102118   1e-11,2e-11,2e-11,1e-11,1e-9,1e-10,1e-10,1e-10,...
    103119   2e-11,1e-11,1e-11,9e-11,2e-9,1e-10,1e-10,1e-10,...
    104    2e-10,1e-10,1e-10,1e-10,5e-9,1e-10,1e-10,1e-10,...
     120   2e-6,1e-6,1e-6,1e-6,5e-6,1e-6,1e-6,1e-6,...
    105121   };
    106122field_values={...
     
    113129   (md.results.TransientSolution(1).CalvingMeltingrate),...
    114130   (md.results.TransientSolution(1).BasalforcingsFloatingiceMeltingRate),...
    115    (md.results.TransientSolution(5).Vx),...
    116    (md.results.TransientSolution(5).Vy),...
    117    (md.results.TransientSolution(5).Vel),...
    118    (md.results.TransientSolution(5).Thickness),...
    119    (md.results.TransientSolution(5).MaskIceLevelset),...
    120    (md.results.TransientSolution(5).CalvingCalvingrate),...
    121    (md.results.TransientSolution(5).CalvingMeltingrate),...
    122    (md.results.TransientSolution(5).BasalforcingsFloatingiceMeltingRate),...
    123         (md.results.TransientSolution(10).Vx),...
    124         (md.results.TransientSolution(10).Vy),...
    125         (md.results.TransientSolution(10).Vel),...
    126         (md.results.TransientSolution(10).Thickness),...
    127         (md.results.TransientSolution(10).MaskIceLevelset),...
    128         (md.results.TransientSolution(10).CalvingCalvingrate),...
    129         (md.results.TransientSolution(10).CalvingMeltingrate),...
    130         (md.results.TransientSolution(10).BasalforcingsFloatingiceMeltingRate),...
     131   (md.results.TransientSolution(20).Vx),...
     132   (md.results.TransientSolution(20).Vy),...
     133   (md.results.TransientSolution(20).Vel),...
     134   (md.results.TransientSolution(20).Thickness),...
     135   (md.results.TransientSolution(20).MaskIceLevelset),...
     136   (md.results.TransientSolution(20).CalvingCalvingrate),...
     137   (md.results.TransientSolution(20).CalvingMeltingrate),...
     138   (md.results.TransientSolution(20).BasalforcingsFloatingiceMeltingRate),...
     139        (md.results.TransientSolution(40).Vx),...
     140        (md.results.TransientSolution(40).Vy),...
     141        (md.results.TransientSolution(40).Vel),...
     142        (md.results.TransientSolution(40).Thickness),...
     143        (md.results.TransientSolution(40).MaskIceLevelset),...
     144        (md.results.TransientSolution(40).CalvingCalvingrate),...
     145        (md.results.TransientSolution(40).CalvingMeltingrate),...
     146        (md.results.TransientSolution(40).BasalforcingsFloatingiceMeltingRate),...
    131147        };
  • issm/trunk-jpl/test/NightlyRun/test543.py

    r27318 r27334  
    1616md = setflowequation(md, 'SSA', 'all')
    1717md.timestepping.start_time = 0
    18 md.timestepping.time_step = 1
    19 md.timestepping.final_time = 10
     18md.timestepping.time_step = 0.05
     19md.timestepping.final_time = 2
    2020
    2121# Basin separation TF
     
    5757trendlin         = np.array([[-0.5,-0.2,0.1],[0,0,0]])
    5858trendquad        = np.array([[0,0.0,0],[0.1,0.1,0.1]])
    59 datebreaks       = np.array([[4,7],[4,7]])
     59datebreaks       = np.array([[0.5,1.5],[0.5,1.5]])
    6060polynomialparams = np.transpose(np.stack((intercept,trendlin,trendquad)),(1,2,0))
     61# Monthly effects params #
     62numbreaksM       = 1;
     63intcpsMp0        = np.array([[-0.5,-0.5,0,0,0,0,0.5,0.5,0,0,0,0],
     64                    [-1.0,-1.0,0,0,0,0,1.0,1.0,0,0,0,0]])
     65intcpsMp1        = np.array([[-0.25,-0.25,0,0,0,0,0.,0.,0,0,0,0],
     66                    [-0.1,-0.1,0,0,0,0,0.1,0.1,0,0,0,0]])
     67intcpsM          = np.transpose(np.stack((intcpsMp0,intcpsMp1)),(1,2,0))
     68trendsMp0        = np.array([[0,0,0,0,0,0,0.,0.0,0,0,0,0],
     69                    [0.0,0.0,0,-0.0,0,0,0.0,0.0,0,0,0,0]])
     70trendsMp1        = np.array([[0,-0.12,0,0,0,0,0.,0.0,0,0.0,0,0],
     71                    [0.0,-0.1,0,-0.0,0,0,0.0,0.0,0,0,0,0]])
     72trendsM          = np.transpose(np.stack((trendsMp0,trendsMp1)),(1,2,0))
     73datebreaksM      = np.array([[1],[1]])
    6174
    6275md.frontalforcings.num_basins = nb_tf
     
    7285md.frontalforcings.arlag_coefs = np.array([[0.1, -0.1, 0.01, -0.01], [0.2, -0.2, 0.1, 0.0]])  # autoregressive parameters
    7386md.frontalforcings.malag_coefs = np.array([[0.1, 0.0], [0.0, 0.1]])  # moving-average parameters
     87md.frontalforcings.monthlyvals_numbreaks   = numbreaksM
     88md.frontalforcings.monthlyvals_intercepts  = intcpsM
     89md.frontalforcings.monthlyvals_trends      = trendsM
     90md.frontalforcings.monthlyvals_datebreaks  = datebreaksM
    7491#Floating Ice Melt parameters
    7592md.basalforcings.floatingice_melting_rate = 0.1 * np.ones((md.mesh.numberofvertices,))
     
    119136    1e-11, 2e-11, 2e-11, 1e-11, 1e-9, 1e-10, 1e-10, 1e-10,
    120137    2e-11, 1e-11, 1e-11, 9e-11, 2e-9, 1e-10, 1e-10, 1e-10,
    121     2e-10, 1e-10, 1e-10, 1e-10, 5e-9, 1e-10, 1e-10, 1e-10]
     138    2e-6, 1e-6, 1e-6, 1e-6, 5e-6, 1e-6, 1e-6, 1e-6]
    122139field_values = [
    123140    md.results.TransientSolution[0].Vx,
     
    129146    md.results.TransientSolution[0].CalvingMeltingrate,
    130147    md.results.TransientSolution[0].BasalforcingsFloatingiceMeltingRate,
    131     md.results.TransientSolution[4].Vx,
    132     md.results.TransientSolution[4].Vy,
    133     md.results.TransientSolution[4].Vel,
    134     md.results.TransientSolution[4].Thickness,
    135     md.results.TransientSolution[4].MaskIceLevelset,
    136     md.results.TransientSolution[4].CalvingCalvingrate,
    137     md.results.TransientSolution[4].CalvingMeltingrate,
    138     md.results.TransientSolution[4].BasalforcingsFloatingiceMeltingRate,
    139     md.results.TransientSolution[9].Vx,
    140     md.results.TransientSolution[9].Vy,
    141     md.results.TransientSolution[9].Vel,
    142     md.results.TransientSolution[9].Thickness,
    143     md.results.TransientSolution[9].MaskIceLevelset,
    144     md.results.TransientSolution[9].CalvingCalvingrate,
    145     md.results.TransientSolution[9].CalvingMeltingrate,
    146     md.results.TransientSolution[9].BasalforcingsFloatingiceMeltingRate]
     148    md.results.TransientSolution[19].Vx,
     149    md.results.TransientSolution[19].Vy,
     150    md.results.TransientSolution[19].Vel,
     151    md.results.TransientSolution[19].Thickness,
     152    md.results.TransientSolution[19].MaskIceLevelset,
     153    md.results.TransientSolution[19].CalvingCalvingrate,
     154    md.results.TransientSolution[19].CalvingMeltingrate,
     155    md.results.TransientSolution[19].BasalforcingsFloatingiceMeltingRate,
     156    md.results.TransientSolution[39].Vx,
     157    md.results.TransientSolution[39].Vy,
     158    md.results.TransientSolution[39].Vel,
     159    md.results.TransientSolution[39].Thickness,
     160    md.results.TransientSolution[39].MaskIceLevelset,
     161    md.results.TransientSolution[39].CalvingCalvingrate,
     162    md.results.TransientSolution[39].CalvingMeltingrate,
     163    md.results.TransientSolution[39].BasalforcingsFloatingiceMeltingRate]
Note: See TracChangeset for help on using the changeset viewer.