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

NEW added autoregression and stochastic capabilities for subglacial discharge

File:
1 edited

Legend:

Unmodified
Added
Removed
  • 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
Note: See TracChangeset for help on using the changeset viewer.