Changeset 26495


Ignore:
Timestamp:
10/22/21 05:36:58 (3 years ago)
Author:
vverjans
Message:

CHG: added class frontalforcingsrignotautoregression (autoregressive calculation of thermal_forcing), autoregression routine in Element.cpp is now generic, corrected nightly runs 257 and 542, added nightly run 543

Location:
issm/trunk-jpl
Files:
3 added
15 edited

Legend:

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

    r26487 r26495  
    9393                        break;
    9494                case FrontalForcingsRignotEnum:
    95                         iomodel->FetchDataToInput(inputs,elements,"md.frontalforcings.basin_id",FrontalForcingsBasinIdEnum);
    96                         iomodel->FetchDataToInput(inputs,elements,"md.frontalforcings.subglacial_discharge",FrontalForcingsSubglacialDischargeEnum);
    97                         iomodel->FetchDataToInput(inputs,elements,"md.frontalforcings.thermalforcing",FrontalForcingsThermalForcingEnum);
    98                         break;
     95         /*Retrieve thermal forcing only in the case of non-autoregressive FrontalForcingsRignot*/
     96         iomodel->FetchDataToInput(inputs,elements,"md.frontalforcings.thermalforcing",FrontalForcingsThermalForcingEnum);
     97         /* Do not break here, still retrieve basin_ID,subglacial_discharge, etc.*/
     98      case FrontalForcingsRignotAutoregressionEnum:
     99         iomodel->FetchDataToInput(inputs,elements,"md.frontalforcings.basin_id",FrontalForcingsBasinIdEnum);
     100         iomodel->FetchDataToInput(inputs,elements,"md.frontalforcings.subglacial_discharge",FrontalForcingsSubglacialDischargeEnum);
     101         break;
    99102                default:
    100103                        _error_("Frontal forcings"<<EnumToStringx(melt_parameterization)<<" not supported yet");
     
    137140        int melt_parameterization;
    138141        iomodel->FindConstant(&melt_parameterization,"md.frontalforcings.parameterization");
     142        int M,N;
     143        IssmDouble* transparam = NULL;
    139144        switch(melt_parameterization){
    140145                case FrontalForcingsDefaultEnum:
    141146                        break;
     147                case FrontalForcingsRignotAutoregressionEnum:
     148                        /*Retrieve autoregressive parameters*/
     149                        parameters->AddObject(iomodel->CopyConstantObject("md.frontalforcings.randomflag",FrontalForcingsRandomflagEnum));
     150         parameters->AddObject(iomodel->CopyConstantObject("md.frontalforcings.ar_order",FrontalForcingsAutoregressiveOrderEnum));
     151         parameters->AddObject(iomodel->CopyConstantObject("md.frontalforcings.ar_initialtime",FrontalForcingsAutoregressionInitialTimeEnum));
     152         parameters->AddObject(iomodel->CopyConstantObject("md.frontalforcings.ar_timestep",FrontalForcingsAutoregressionTimestepEnum));
     153                        iomodel->FetchData(&transparam,&M,&N,"md.frontalforcings.beta0");
     154         parameters->AddObject(new DoubleVecParam(FrontalForcingsBeta0Enum,transparam,N));
     155         xDelete<IssmDouble>(transparam);
     156         iomodel->FetchData(&transparam,&M,&N,"md.frontalforcings.beta1");
     157         parameters->AddObject(new DoubleVecParam(FrontalForcingsBeta1Enum,transparam,N));
     158         xDelete<IssmDouble>(transparam);
     159         iomodel->FetchData(&transparam,&M,&N,"md.frontalforcings.phi");
     160         parameters->AddObject(new DoubleMatParam(FrontalForcingsPhiEnum,transparam,M,N));
     161         xDelete<IssmDouble>(transparam);
     162         iomodel->FetchData(&transparam,&M,&N,"md.frontalforcings.covmat");
     163         parameters->AddObject(new DoubleMatParam(FrontalForcingsCovmatEnum,transparam,M,N));
     164         xDelete<IssmDouble>(transparam);
     165                        /*Do not break here, generic FrontalForcingsRignot parameters still to be retrieved*/
    142166                case FrontalForcingsRignotEnum:
    143167                        parameters->AddObject(iomodel->CopyConstantObject("md.frontalforcings.num_basins",FrontalForcingsNumberofBasinsEnum));
  • issm/trunk-jpl/src/c/classes/Elements/Element.cpp

    r26487 r26495  
    5959        }
    6060        return false;
     61}/*}}}*/
     62void       Element::AutoregressionInit(int numbasins,int arorder,int nspin,IssmDouble starttime,IssmDouble tstep_ar,IssmDouble tinit_ar,IssmDouble* beta0,IssmDouble* beta1,IssmDouble* phi,IssmDouble* noisespin,int enum_type){/*{{{*/
     63
     64        const int numvertices = this->GetNumberOfVertices();
     65   int         basinid;
     66   IssmDouble  tspin,beta0_basin,beta1_basin,noisespin_basin; 
     67   IssmDouble* phi_basin   = xNew<IssmDouble>(arorder);
     68   IssmDouble* varspin     = xNewZeroInit<IssmDouble>(numvertices*arorder);
     69
     70   /*Get Basin ID and Basin coefficients*/
     71        if(enum_type==SMBautoregressionEnum)                   this->GetInputValue(&basinid,SmbBasinsIdEnum);
     72   if(enum_type==FrontalForcingsRignotAutoregressionEnum) this->GetInputValue(&basinid,FrontalForcingsBasinIdEnum);
     73   for(int i=0;i<arorder;i++) phi_basin[i] = phi[basinid*arorder+i];
     74   beta0_basin   = beta0[basinid];
     75   beta1_basin   = beta1[basinid];
     76
     77   /*Loop over number of spin-up steps for all vertices*/   
     78   for(int j=0;j<nspin;j++){ 
     79      tspin = starttime-((nspin-j)*tstep_ar);
     80      noisespin_basin = noisespin[j*numbasins+basinid];
     81      IssmDouble* oldvarspin = xNew<IssmDouble>(numvertices*arorder);
     82      for(int i=0;i<numvertices*arorder;i++) oldvarspin[i]=varspin[i];
     83
     84      for(int v=0;v<numvertices;v++){
     85         IssmDouble autoregressionterm = 0.;
     86         for(int i=0;i<arorder;i++) autoregressionterm += phi_basin[i]*varspin[v+i*numvertices];
     87         varspin[v] = beta0_basin+beta1_basin*(tspin-tinit_ar)+autoregressionterm+noisespin_basin;
     88      }
     89
     90      /*Adjustt older values in varspin*/
     91      for(int i=0;i<(arorder-1)*numvertices;i++) varspin[i+numvertices]=oldvarspin[i];
     92
     93      xDelete<IssmDouble>(oldvarspin);
     94   }
     95        if(enum_type==SMBautoregressionEnum)                   this->inputs->SetArrayInput(SmbValuesAutoregressionEnum,this->lid,varspin,numvertices*arorder);
     96   if(enum_type==FrontalForcingsRignotAutoregressionEnum) this->inputs->SetArrayInput(ThermalforcingValuesAutoregressionEnum,this->lid,varspin,numvertices*arorder);
     97
     98 
     99   /*Cleanup and return*/
     100   xDelete<IssmDouble>(varspin);
     101   xDelete<IssmDouble>(phi_basin);
     102}/*}}}*/
     103void       Element::Autoregression(bool isstepforar,int arorder,IssmDouble telapsed_ar,IssmDouble* beta0,IssmDouble* beta1,IssmDouble* phi,IssmDouble* noiseterms,int enum_type){/*{{{*/
     104   
     105   const int numvertices = this->GetNumberOfVertices();
     106   int         basinid,M,N;
     107   IssmDouble  beta0_basin,beta1_basin,noise_basin; 
     108   IssmDouble* phi_basin  = xNew<IssmDouble>(arorder);
     109   IssmDouble* varlist     = xNew<IssmDouble>(numvertices);
     110   IssmDouble* valuesautoregression = NULL;
     111
     112   /*Get Basin ID and Basin coefficients*/
     113   if(enum_type==SMBautoregressionEnum)                   this->GetInputValue(&basinid,SmbBasinsIdEnum);
     114   if(enum_type==FrontalForcingsRignotAutoregressionEnum) this->GetInputValue(&basinid,FrontalForcingsBasinIdEnum);
     115   for(int ii=0;ii<arorder;ii++) phi_basin[ii] = phi[basinid*arorder+ii];
     116   beta0_basin   = beta0[basinid];
     117   beta1_basin   = beta1[basinid];
     118   noise_basin   = noiseterms[basinid];
     119   if(enum_type==SMBautoregressionEnum)                   this->inputs->GetArray(SmbValuesAutoregressionEnum,this->lid,&valuesautoregression,&M);
     120   if(enum_type==FrontalForcingsRignotAutoregressionEnum) this->inputs->GetArray(ThermalforcingValuesAutoregressionEnum,this->lid,&valuesautoregression,&M);
     121
     122   /*If not AR model timestep: take the old values of variable*/
     123   if(isstepforar==false){
     124      for(int i=0;i<numvertices;i++) varlist[i]=valuesautoregression[i];
     125   }
     126   /*If AR model timestep: compute variable values on vertices from AR*/
     127   else{
     128      for(int v=0;v<numvertices;v++){
     129
     130         /*Compute autoregressive term*/
     131         IssmDouble autoregressionterm=0.;
     132         for(int ii=0;ii<arorder;ii++) autoregressionterm += phi_basin[ii]*valuesautoregression[v+ii*numvertices];
     133
     134         /*Stochastic variable value*/
     135         varlist[v] = beta0_basin+beta1_basin*telapsed_ar+autoregressionterm+noise_basin;
     136      }
     137      /*Update autoregression TF values*/
     138      IssmDouble* temparray = xNew<IssmDouble>(numvertices*arorder);
     139      /*Assign newest values and shift older values*/
     140      for(int i=0;i<numvertices;i++) temparray[i] = varlist[i];
     141      for(int i=0;i<(arorder-1)*numvertices;i++) temparray[i+numvertices] = valuesautoregression[i];
     142      if(enum_type==SMBautoregressionEnum)                   this->inputs->SetArrayInput(SmbValuesAutoregressionEnum,this->lid,temparray,numvertices*arorder);
     143      if(enum_type==FrontalForcingsRignotAutoregressionEnum) this->inputs->SetArrayInput(ThermalforcingValuesAutoregressionEnum,this->lid,temparray,numvertices*arorder);
     144      xDelete<IssmDouble>(temparray);
     145   }
     146   
     147        //if(this->lid==55){_printf_("varlist: "<<varlist[0]<<"  "<<varlist[1]<<"  "<<varlist[2]<<"  "<<"noise_basin: "<<noise_basin<<"  "<<'\n');}
     148
     149        /*Add input to element*/
     150   if(enum_type==SMBautoregressionEnum)                   this->AddInput(SmbMassBalanceEnum,varlist,P1Enum);
     151   if(enum_type==FrontalForcingsRignotAutoregressionEnum) this->AddInput(FrontalForcingsThermalForcingEnum,varlist,P1Enum);
     152
     153   /*Cleanup*/
     154   xDelete<IssmDouble>(phi_basin);
     155   xDelete<IssmDouble>(varlist);
     156   xDelete<IssmDouble>(valuesautoregression);
    61157}/*}}}*/
    62158void       Element::ComputeLambdaS(){/*{{{*/
     
    36583754}
    36593755/*}}}*/
    3660 void       Element::SmbautoregressionInit(int numbasins,int arorder,int nspin,IssmDouble starttime,IssmDouble tstep_ar,IssmDouble tinit_ar,IssmDouble* beta0,IssmDouble* beta1,IssmDouble* phi,IssmDouble* noisespin){/*{{{*/
    3661 
    3662         const int numvertices = this->GetNumberOfVertices();
    3663         int         basinid;
    3664         IssmDouble  tspin,beta0_basin,beta1_basin,noisespin_basin; 
    3665         IssmDouble* phi_basin   = xNew<IssmDouble>(arorder);
    3666    IssmDouble* smbspin     = xNewZeroInit<IssmDouble>(numvertices*arorder);
    3667 
    3668         /*Get Basin ID and Basin coefficients*/
    3669         this->GetInputValue(&basinid,SmbBasinsIdEnum);
    3670         for(int i=0;i<arorder;i++) phi_basin[i] = phi[basinid*arorder+i];
    3671         beta0_basin   = beta0[basinid];
    3672         beta1_basin   = beta1[basinid];
    3673 
    3674         /*Loop over number of spin-up steps for all vertices*/ 
    3675         for(int j=0;j<nspin;j++){       
    3676                 tspin = starttime-((nspin-j)*tstep_ar);
    3677       noisespin_basin = noisespin[j*numbasins+basinid];
    3678       IssmDouble* oldsmbspin = xNew<IssmDouble>(numvertices*arorder);
    3679       for(int i=0;i<numvertices*arorder;i++) oldsmbspin[i]=smbspin[i];
    3680 
    3681       for(int v=0;v<numvertices;v++){
    3682          IssmDouble autoregressionterm = 0.;
    3683          for(int i=0;i<arorder;i++) autoregressionterm += phi_basin[i]*smbspin[v+i*numvertices];
    3684          smbspin[v] = beta0_basin+beta1_basin*(tspin-tinit_ar)+autoregressionterm+noisespin_basin; //compute newest values in smbspin
    3685       }
    3686 
    3687                 /*Correct older values in smbspin*/
    3688       for(int i=0;i<(arorder-1)*numvertices;i++) smbspin[i+numvertices]=oldsmbspin[i];
    3689 
    3690       xDelete<IssmDouble>(oldsmbspin);
    3691         }
    3692         this->inputs->SetArrayInput(SmbValuesAutoregressionEnum,this->lid,smbspin,numvertices*arorder);
    3693 
    3694         /*Cleanup and return*/
    3695    xDelete<IssmDouble>(smbspin);
    3696    xDelete<IssmDouble>(phi_basin);
    3697 }/*}}}*/
    3698 void       Element::Smbautoregression(bool isstepforar,int arorder,IssmDouble telapsed_ar,IssmDouble* beta0,IssmDouble* beta1,IssmDouble* phi,IssmDouble* noiseterms){/*{{{*/
    3699        
    3700         const int numvertices = this->GetNumberOfVertices();
    3701         int         basinid,M,N;
    3702         IssmDouble  beta0_basin,beta1_basin,noise_basin; 
    3703         IssmDouble* phi_basin  = xNew<IssmDouble>(arorder);
    3704    IssmDouble* smblist    = xNew<IssmDouble>(numvertices);
    3705         IssmDouble* smbvaluesautoregression = NULL;
    3706 
    3707         /*Get Basin ID and Basin coefficients*/
    3708         this->GetInputValue(&basinid,SmbBasinsIdEnum);
    3709         for(int ii=0;ii<arorder;ii++) phi_basin[ii] = phi[basinid*arorder+ii];
    3710         beta0_basin   = beta0[basinid];
    3711         beta1_basin   = beta1[basinid];
    3712         noise_basin   = noiseterms[basinid];
    3713         this->inputs->GetArray(SmbValuesAutoregressionEnum,this->lid,&smbvaluesautoregression,&M);
    3714 
    3715         /*If not AR model timestep: take the old SMB values*/
    3716         if(isstepforar==false){
    3717                 /*VV do something with the lapse rate here if needed (12Oct2021)*/
    3718       for(int i=0;i<numvertices;i++) smblist[i]=smbvaluesautoregression[i];
    3719         }
    3720         /*If AR model timestep: compute SMB values on vertices from AR*/
    3721         else{
    3722                 for(int v=0;v<numvertices;v++){
    3723 
    3724                         /*Compute autoregressive term*/
    3725                         IssmDouble autoregressionterm=0.;
    3726                         for(int ii=0;ii<arorder;ii++) autoregressionterm += phi_basin[ii]*smbvaluesautoregression[v+ii*numvertices];
    3727 
    3728                         /*Stochastic SMB value*/
    3729                         smblist[v] = beta0_basin+beta1_basin*telapsed_ar+autoregressionterm+noise_basin;
    3730                 }
    3731                 /*Update autoregression smb values*/
    3732                 IssmDouble* temparray = xNew<IssmDouble>(numvertices*arorder);
    3733                 /*Assign newest values and shift older values*/
    3734                 for(int i=0;i<numvertices;i++) temparray[i] = smblist[i];
    3735                 for(int i=0;i<(arorder-1)*numvertices;i++) temparray[i+numvertices] = smbvaluesautoregression[i];
    3736                 this->inputs->SetArrayInput(SmbValuesAutoregressionEnum,this->lid,temparray,numvertices*arorder);
    3737                 xDelete<IssmDouble>(temparray);
    3738         }
    3739         /*Add input to element*/
    3740         this->AddInput(SmbMassBalanceEnum,smblist,P1Enum);
    3741 
    3742         /*Cleanup*/
    3743         xDelete<IssmDouble>(phi_basin);
    3744         xDelete<IssmDouble>(smblist);
    3745         xDelete<IssmDouble>(smbvaluesautoregression);
    3746 }/*}}}*/
    37473756void       Element::SmbGemb(IssmDouble timeinputs, int count){/*{{{*/
    37483757
  • issm/trunk-jpl/src/c/classes/Elements/Element.h

    r26487 r26495  
    6868                /*bool               AnyActive(void);*/
    6969                bool               AnyFSet(void);
     70                void                                     AutoregressionInit(int numbasins,int arorder,int nspin,IssmDouble starttime,IssmDouble tstep_ar,IssmDouble tinit_ar,IssmDouble* beta0,IssmDouble* beta1,IssmDouble* phi,IssmDouble* noisespin,int enum_type);
     71      void               Autoregression(bool isstepforar,int arorder,IssmDouble telapsed_ar,IssmDouble* beta0,IssmDouble* beta1,IssmDouble* phi,IssmDouble* noiseterms,int enum_type);
    7072                void               ComputeLambdaS(void);
    7173                void               ComputeNewDamage();
     
    178180                void               SmbSemic();
    179181                int                Sid();
    180                 void               SmbautoregressionInit(int numbasins,int arorder,int nspin,IssmDouble starttime,IssmDouble tstep_ar,IssmDouble tinit_ar,IssmDouble* beta0,IssmDouble* beta1,IssmDouble* phi,IssmDouble* noisespin);
    181                 void               Smbautoregression(bool isstepforar,int arorder,IssmDouble telapsed_ar,IssmDouble* beta0,IssmDouble* beta1,IssmDouble* phi,IssmDouble* noiseterms);
    182182                void               SmbGemb(IssmDouble timeinputs, int count);
    183183                void               StrainRateESA(IssmDouble* epsilon,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input);
  • issm/trunk-jpl/src/c/modules/FrontalForcingsx/FrontalForcingsx.cpp

    r26468 r26495  
    66#include "../../shared/shared.h"
    77#include "../../toolkits/toolkits.h"
     8#include "../../shared/Random/random.h"
    89
    9 void FrontalForcingsx(FemModel* femmodel){
     10void FrontalForcingsx(FemModel* femmodel){/*{{{*/
    1011
    1112        /*Recover melt_parameterization*/
     
    1718                case FrontalForcingsDefaultEnum:
    1819                        break;
     20                case FrontalForcingsRignotAutoregressionEnum:
     21                        Thermalforcingautoregressionx(femmodel);
     22                        /*Do not break here, call IcefrontAreax(),RignotMeltParameterizationx()*/
    1923                case FrontalForcingsRignotEnum:
    2024                        femmodel->IcefrontAreax();
     
    2428                        _error_("Frontal forcings "<<EnumToStringx(melt_parameterization)<<" not supported yet");
    2529        }
    26 }
     30}/*}}}*/
     31void ThermalforcingautoregressionInitx(FemModel* femmodel){/*{{{*/
     32
     33   /*Initialization step of Thermalforcingautoregressionx*/
     34   int M,N,Nphi,arorder,numbasins,my_rank;
     35   IssmDouble starttime,tstep_ar,tinit_ar;
     36   femmodel->parameters->FindParam(&numbasins,FrontalForcingsNumberofBasinsEnum);
     37   femmodel->parameters->FindParam(&arorder,FrontalForcingsAutoregressiveOrderEnum);
     38   IssmDouble* beta0    = NULL;
     39   IssmDouble* beta1    = NULL;
     40   IssmDouble* phi      = NULL;
     41   IssmDouble* covmat   = NULL;
     42   femmodel->parameters->FindParam(&starttime,TimesteppingStartTimeEnum);
     43   femmodel->parameters->FindParam(&tstep_ar,FrontalForcingsAutoregressionTimestepEnum);
     44   femmodel->parameters->FindParam(&tinit_ar,FrontalForcingsAutoregressionInitialTimeEnum);
     45   femmodel->parameters->FindParam(&beta0,&M,FrontalForcingsBeta0Enum);    _assert_(M==numbasins);
     46   femmodel->parameters->FindParam(&beta1,&M,FrontalForcingsBeta1Enum);    _assert_(M==numbasins);
     47   femmodel->parameters->FindParam(&phi,&M,&Nphi,FrontalForcingsPhiEnum);  _assert_(M==numbasins); _assert_(Nphi==arorder);
     48   femmodel->parameters->FindParam(&covmat,&M,&N,FrontalForcingsCovmatEnum); _assert_(M==numbasins); _assert_(N==numbasins);
     49
     50   /*AR model spin-up*/
     51   int nspin{2*arorder+5};
     52   IssmDouble* noisespin = xNewZeroInit<IssmDouble>(numbasins*nspin);
     53   my_rank=IssmComm::GetRank();
     54   if(my_rank==0){
     55      bool randomflag{};
     56      femmodel->parameters->FindParam(&randomflag,FrontalForcingsRandomflagEnum);
     57      int fixedseed;
     58      for(int i=0;i<nspin;i++){
     59         IssmDouble* temparray = NULL;
     60         /*Determine whether random seed is fixed to for loop step (randomflag==false) or random seed truly random (randomflag==true)*/
     61         if(randomflag) fixedseed=-1;
     62         else fixedseed = i;
     63         multivariateNormal(&temparray,numbasins,0.0,covmat,fixedseed);
     64         for(int j=0;j<numbasins;j++){noisespin[i*numbasins+j]=temparray[j];}
     65         xDelete<IssmDouble>(temparray);
     66      }
     67   }
     68   ISSM_MPI_Bcast(noisespin,numbasins*nspin,ISSM_MPI_DOUBLE,0,IssmComm::GetComm());
     69
     70   /*Initialize ThermalforcingValuesAutoregressionEnum*/
     71   for(Object* &object:femmodel->elements->objects){
     72      Element* element      = xDynamicCast<Element*>(object); //generate element object
     73      element->AutoregressionInit(numbasins,arorder,nspin,starttime,tstep_ar,tinit_ar,beta0,beta1,phi,noisespin,FrontalForcingsRignotAutoregressionEnum);
     74   }
     75
     76   /*Cleanup*/
     77   xDelete<IssmDouble>(beta0);
     78   xDelete<IssmDouble>(beta1);
     79   xDelete<IssmDouble>(phi);
     80   xDelete<IssmDouble>(noisespin);
     81   xDelete<IssmDouble>(covmat);
     82}/*}}}*/
     83void Thermalforcingautoregressionx(FemModel* femmodel){/*{{{*/
     84
     85   /*Get time parameters*/
     86   IssmDouble time,dt,starttime,tstep_ar;
     87   femmodel->parameters->FindParam(&time,TimeEnum);
     88   femmodel->parameters->FindParam(&dt,TimesteppingTimeStepEnum);
     89   femmodel->parameters->FindParam(&starttime,TimesteppingStartTimeEnum);
     90   femmodel->parameters->FindParam(&tstep_ar,FrontalForcingsAutoregressionTimestepEnum);
     91
     92   /*Initialize module at first time step*/
     93   if(time<=starttime+dt){ThermalforcingautoregressionInitx(femmodel);}
     94   /*Determine if this is a time step for the AR model*/
     95   bool isstepforar = false;
     96
     97   #ifndef _HAVE_AD_
     98   if((fmod(time,tstep_ar)<fmod((time-dt),tstep_ar)) || (time<=starttime+dt) || tstep_ar==dt) isstepforar = true;
     99   #else
     100   _error_("not implemented yet");
     101   #endif
     102
     103   /*Load parameters*/
     104   int M,N,Nphi,arorder,numbasins,my_rank;
     105   femmodel->parameters->FindParam(&numbasins,FrontalForcingsNumberofBasinsEnum);
     106   femmodel->parameters->FindParam(&arorder,FrontalForcingsAutoregressiveOrderEnum);
     107   IssmDouble tinit_ar;
     108   IssmDouble* beta0      = NULL;
     109   IssmDouble* beta1      = NULL;
     110   IssmDouble* phi        = NULL;
     111   IssmDouble* covmat     = NULL;
     112   IssmDouble* noiseterms = xNew<IssmDouble>(numbasins);
     113   femmodel->parameters->FindParam(&tinit_ar,FrontalForcingsAutoregressionInitialTimeEnum);
     114   femmodel->parameters->FindParam(&beta0,&M,FrontalForcingsBeta0Enum);    _assert_(M==numbasins);
     115   femmodel->parameters->FindParam(&beta1,&M,FrontalForcingsBeta1Enum);    _assert_(M==numbasins);
     116   femmodel->parameters->FindParam(&phi,&M,&Nphi,FrontalForcingsPhiEnum);  _assert_(M==numbasins); _assert_(Nphi==arorder);
     117   femmodel->parameters->FindParam(&covmat,&M,&N,FrontalForcingsCovmatEnum); _assert_(M==numbasins); _assert_(N==numbasins);
     118
     119   /*Time elapsed with respect to AR model initial time*/
     120   IssmDouble telapsed_ar = time-tinit_ar;
     121
     122   /*Before looping through elements: compute noise term specific to each basin from covmat*/
     123   my_rank=IssmComm::GetRank();
     124   if(my_rank==0){
     125      bool randomflag{};
     126      femmodel->parameters->FindParam(&randomflag,FrontalForcingsRandomflagEnum);
     127      /*Determine whether random seed is fixed to time step (randomflag==false) or random seed truly random (randomflag==true)*/
     128      int fixedseed;
     129      if(randomflag) fixedseed=-1;
     130      else fixedseed = reCast<int,IssmDouble>((time-starttime)/dt);
     131                /*multivariateNormal needs to be passed a NULL pointer to avoid memory leak issues*/
     132      IssmDouble* temparray = NULL;
     133      multivariateNormal(&temparray,numbasins,0.0,covmat,fixedseed);
     134      for(int i=0;i<numbasins;i++) noiseterms[i]=temparray[i];
     135      xDelete<IssmDouble>(temparray);
     136   }
     137   ISSM_MPI_Bcast(noiseterms,numbasins,ISSM_MPI_DOUBLE,0,IssmComm::GetComm());
     138
     139   /*Loop over each element to compute SMB at vertices*/
     140   for(Object* &object:femmodel->elements->objects){
     141      Element* element = xDynamicCast<Element*>(object);
     142      element->Autoregression(isstepforar,arorder,telapsed_ar,beta0,beta1,phi,noiseterms,FrontalForcingsRignotAutoregressionEnum);
     143   }
     144
     145   /*Cleanup*/
     146   xDelete<IssmDouble>(beta0);
     147   xDelete<IssmDouble>(beta1);
     148   xDelete<IssmDouble>(phi);
     149   xDelete<IssmDouble>(noiseterms);
     150   xDelete<IssmDouble>(covmat);
     151}/*}}}*/
  • issm/trunk-jpl/src/c/modules/FrontalForcingsx/FrontalForcingsx.h

    r23652 r26495  
    77/* local prototypes: */
    88void FrontalForcingsx(FemModel* femmodel);
     9void ThermalforcingautoregressionInitx(FemModel* femmodel);
     10void Thermalforcingautoregressionx(FemModel* femmodel);
    911
    1012#endif
  • issm/trunk-jpl/src/c/modules/SurfaceMassBalancex/SurfaceMassBalancex.cpp

    r26487 r26495  
    154154        femmodel->parameters->FindParam(&numbasins,SmbNumBasinsEnum);
    155155        femmodel->parameters->FindParam(&arorder,SmbAutoregressiveOrderEnum);
    156         IssmDouble* beta0    = xNew<IssmDouble>(numbasins);
    157         IssmDouble* beta1    = xNew<IssmDouble>(numbasins);
    158         IssmDouble* phi      = xNew<IssmDouble>(numbasins*arorder);
    159         IssmDouble* covmat   = xNew<IssmDouble>(numbasins*numbasins);
     156        IssmDouble* beta0    = NULL;
     157        IssmDouble* beta1    = NULL;
     158        IssmDouble* phi      = NULL;
     159        IssmDouble* covmat   = NULL;
    160160        femmodel->parameters->FindParam(&starttime,TimesteppingStartTimeEnum);
    161161   femmodel->parameters->FindParam(&tstep_ar,SmbAutoregressionTimestepEnum);
     
    175175                int fixedseed;
    176176                for(int i=0;i<nspin;i++){
    177                         IssmDouble* temparray = xNew<IssmDouble>(numbasins);
     177                        //IssmDouble* temparray = xNew<IssmDouble>(numbasins);
     178                        IssmDouble* temparray = NULL;
    178179                        /*Determine whether random seed is fixed to for loop step (randomflag==false) or random seed truly random (randomflag==true)*/
    179180                        if(randomflag) fixedseed=-1;
     
    189190        for(Object* &object:femmodel->elements->objects){
    190191      Element* element      = xDynamicCast<Element*>(object); //generate element object
    191                 element->SmbautoregressionInit(numbasins,arorder,nspin,starttime,tstep_ar,tinit_ar,beta0,beta1,phi,noisespin);
     192                element->AutoregressionInit(numbasins,arorder,nspin,starttime,tstep_ar,tinit_ar,beta0,beta1,phi,noisespin,SMBautoregressionEnum);
    192193        }
    193194       
     
    224225        femmodel->parameters->FindParam(&arorder,SmbAutoregressiveOrderEnum);
    225226        IssmDouble tinit_ar;
    226         IssmDouble* beta0      = xNew<IssmDouble>(numbasins);
    227         IssmDouble* beta1      = xNew<IssmDouble>(numbasins);
    228         IssmDouble* phi        = xNew<IssmDouble>(numbasins*arorder);
     227        IssmDouble* beta0      = NULL;
     228        IssmDouble* beta1      = NULL;
     229        IssmDouble* phi        = NULL;
     230        IssmDouble* covmat     = NULL;
    229231        IssmDouble* noiseterms = xNew<IssmDouble>(numbasins);
    230         IssmDouble* covmat     = xNew<IssmDouble>(numbasins*numbasins);
    231232        femmodel->parameters->FindParam(&tinit_ar,SmbAutoregressionInitialTimeEnum);
    232233        femmodel->parameters->FindParam(&beta0,&M,SmbBeta0Enum);    _assert_(M==numbasins);
     
    247248                if(randomflag) fixedseed=-1;
    248249                else fixedseed =  reCast<int,IssmDouble>((time-starttime)/dt);
    249                 multivariateNormal(&noiseterms,numbasins,0.0,covmat,fixedseed);
     250                /*multivariateNormal needs to be passed a NULL pointer to avoid memory leak issues*/   
     251                IssmDouble* temparray = NULL;
     252                multivariateNormal(&temparray,numbasins,0.0,covmat,fixedseed);
     253                for(int i=0;i<numbasins;i++) noiseterms[i]=temparray[i];
     254                xDelete<IssmDouble>(temparray);
    250255        }
    251256        ISSM_MPI_Bcast(noiseterms,numbasins,ISSM_MPI_DOUBLE,0,IssmComm::GetComm());
     
    254259        for(Object* &object:femmodel->elements->objects){
    255260                Element* element = xDynamicCast<Element*>(object);
    256                 element->Smbautoregression(isstepforar,arorder,telapsed_ar,beta0,beta1,phi,noiseterms);
     261                element->Autoregression(isstepforar,arorder,telapsed_ar,beta0,beta1,phi,noiseterms,SMBautoregressionEnum);
    257262        }
    258263
  • issm/trunk-jpl/src/c/shared/Enum/Enum.vim

    r26488 r26495  
    177177syn keyword cConstant FrictionVoidRatioEnum
    178178syn keyword cConstant FrontalForcingsBasinIcefrontAreaEnum
     179syn keyword cConstant FrontalForcingsAutoregressionInitialTimeEnum
     180syn keyword cConstant FrontalForcingsAutoregressionTimestepEnum
     181syn keyword cConstant FrontalForcingsAutoregressiveOrderEnum
     182syn keyword cConstant FrontalForcingsBeta0Enum
     183syn keyword cConstant FrontalForcingsBeta1Enum
     184syn keyword cConstant FrontalForcingsCovmatEnum
    179185syn keyword cConstant FrontalForcingsNumberofBasinsEnum
    180186syn keyword cConstant FrontalForcingsParamEnum
     187syn keyword cConstant FrontalForcingsPhiEnum
     188syn keyword cConstant FrontalForcingsRandomflagEnum
    181189syn keyword cConstant GrdModelEnum
    182190syn keyword cConstant GroundinglineFrictionInterpolationEnum
     
    10161024syn keyword cConstant TemperaturePicardEnum
    10171025syn keyword cConstant TemperatureSEMICEnum
     1026syn keyword cConstant ThermalforcingValuesAutoregressionEnum
    10181027syn keyword cConstant ThermalSpctemperatureEnum
    10191028syn keyword cConstant ThicknessAbsGradientEnum
     
    12621271syn keyword cConstant FrontalForcingsDefaultEnum
    12631272syn keyword cConstant FrontalForcingsRignotEnum
     1273syn keyword cConstant FrontalForcingsRignotAutoregressionEnum
    12641274syn keyword cConstant FsetEnum
    12651275syn keyword cConstant FullMeltOnPartiallyFloatingEnum
     
    15531563syn keyword cType Cfsurfacesquare
    15541564syn keyword cType Channel
     1565syn keyword cType classes
    15551566syn keyword cType Constraint
    15561567syn keyword cType Constraints
     
    15591570syn keyword cType ControlInput
    15601571syn keyword cType Covertree
     1572syn keyword cType DatasetInput
    15611573syn keyword cType DataSetParam
    1562 syn keyword cType DatasetInput
    15631574syn keyword cType Definition
    15641575syn keyword cType DependentObject
     
    15731584syn keyword cType ElementInput
    15741585syn keyword cType ElementMatrix
     1586syn keyword cType Elements
    15751587syn keyword cType ElementVector
    1576 syn keyword cType Elements
    15771588syn keyword cType ExponentialVariogram
    15781589syn keyword cType ExternalResult
     
    15811592syn keyword cType Friction
    15821593syn keyword cType Gauss
     1594syn keyword cType GaussianVariogram
     1595syn keyword cType gaussobjects
    15831596syn keyword cType GaussPenta
    15841597syn keyword cType GaussSeg
    15851598syn keyword cType GaussTetra
    15861599syn keyword cType GaussTria
    1587 syn keyword cType GaussianVariogram
    15881600syn keyword cType GenericExternalResult
    15891601syn keyword cType GenericOption
     
    16011613syn keyword cType IssmDirectApplicInterface
    16021614syn keyword cType IssmParallelDirectApplicInterface
     1615syn keyword cType krigingobjects
    16031616syn keyword cType Load
    16041617syn keyword cType Loads
     
    16111624syn keyword cType Matice
    16121625syn keyword cType Matlitho
     1626syn keyword cType matrixobjects
    16131627syn keyword cType MatrixParam
    16141628syn keyword cType Misfit
     
    16231637syn keyword cType Observations
    16241638syn keyword cType Option
     1639syn keyword cType Options
    16251640syn keyword cType OptionUtilities
    1626 syn keyword cType Options
    16271641syn keyword cType Param
    16281642syn keyword cType Parameters
     
    16381652syn keyword cType Regionaloutput
    16391653syn keyword cType Results
     1654syn keyword cType Riftfront
    16401655syn keyword cType RiftStruct
    1641 syn keyword cType Riftfront
    16421656syn keyword cType SealevelGeometry
    16431657syn keyword cType Seg
    16441658syn keyword cType SegInput
     1659syn keyword cType Segment
    16451660syn keyword cType SegRef
    1646 syn keyword cType Segment
    16471661syn keyword cType SpcDynamic
    16481662syn keyword cType SpcStatic
     
    16631677syn keyword cType Vertex
    16641678syn keyword cType Vertices
    1665 syn keyword cType classes
    1666 syn keyword cType gaussobjects
    1667 syn keyword cType krigingobjects
    1668 syn keyword cType matrixobjects
    16691679syn keyword cType AdjointBalancethickness2Analysis
    16701680syn keyword cType AdjointBalancethicknessAnalysis
  • issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h

    r26488 r26495  
    171171        FrictionVoidRatioEnum,
    172172        FrontalForcingsBasinIcefrontAreaEnum,
     173        FrontalForcingsAutoregressionInitialTimeEnum,
     174   FrontalForcingsAutoregressionTimestepEnum,
     175   FrontalForcingsAutoregressiveOrderEnum,
     176        FrontalForcingsBeta0Enum,
     177   FrontalForcingsBeta1Enum,
     178   FrontalForcingsCovmatEnum,
    173179        FrontalForcingsNumberofBasinsEnum,
    174180        FrontalForcingsParamEnum,
     181   FrontalForcingsPhiEnum,
     182        FrontalForcingsRandomflagEnum,
    175183        GrdModelEnum,
    176184        GroundinglineFrictionInterpolationEnum,
     
    10131021        TemperaturePicardEnum,
    10141022        TemperatureSEMICEnum,
     1023        ThermalforcingValuesAutoregressionEnum,
    10151024        ThermalSpctemperatureEnum,
    10161025        ThicknessAbsGradientEnum,
     
    12611270        FrontalForcingsDefaultEnum,
    12621271        FrontalForcingsRignotEnum,
     1272        FrontalForcingsRignotAutoregressionEnum,
    12631273        FsetEnum,
    12641274        FullMeltOnPartiallyFloatingEnum,
  • issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp

    r26488 r26495  
    179179                case FrictionVoidRatioEnum : return "FrictionVoidRatio";
    180180                case FrontalForcingsBasinIcefrontAreaEnum : return "FrontalForcingsBasinIcefrontArea";
     181                case FrontalForcingsAutoregressionInitialTimeEnum : return "FrontalForcingsAutoregressionInitialTime";
     182                case FrontalForcingsAutoregressionTimestepEnum : return "FrontalForcingsAutoregressionTimestep";
     183                case FrontalForcingsAutoregressiveOrderEnum : return "FrontalForcingsAutoregressiveOrder";
     184                case FrontalForcingsBeta0Enum : return "FrontalForcingsBeta0";
     185                case FrontalForcingsBeta1Enum : return "FrontalForcingsBeta1";
     186                case FrontalForcingsCovmatEnum : return "FrontalForcingsCovmat";
    181187                case FrontalForcingsNumberofBasinsEnum : return "FrontalForcingsNumberofBasins";
    182188                case FrontalForcingsParamEnum : return "FrontalForcingsParam";
     189                case FrontalForcingsPhiEnum : return "FrontalForcingsPhi";
     190                case FrontalForcingsRandomflagEnum : return "FrontalForcingsRandomflag";
    183191                case GrdModelEnum : return "GrdModel";
    184192                case GroundinglineFrictionInterpolationEnum : return "GroundinglineFrictionInterpolation";
     
    10181026                case TemperaturePicardEnum : return "TemperaturePicard";
    10191027                case TemperatureSEMICEnum : return "TemperatureSEMIC";
     1028                case ThermalforcingValuesAutoregressionEnum : return "ThermalforcingValuesAutoregression";
    10201029                case ThermalSpctemperatureEnum : return "ThermalSpctemperature";
    10211030                case ThicknessAbsGradientEnum : return "ThicknessAbsGradient";
     
    12641273                case FrontalForcingsDefaultEnum : return "FrontalForcingsDefault";
    12651274                case FrontalForcingsRignotEnum : return "FrontalForcingsRignot";
     1275                case FrontalForcingsRignotAutoregressionEnum : return "FrontalForcingsRignotAutoregression";
    12661276                case FsetEnum : return "Fset";
    12671277                case FullMeltOnPartiallyFloatingEnum : return "FullMeltOnPartiallyFloating";
  • issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp

    r26488 r26495  
    182182              else if (strcmp(name,"FrictionVoidRatio")==0) return FrictionVoidRatioEnum;
    183183              else if (strcmp(name,"FrontalForcingsBasinIcefrontArea")==0) return FrontalForcingsBasinIcefrontAreaEnum;
     184              else if (strcmp(name,"FrontalForcingsAutoregressionInitialTime")==0) return FrontalForcingsAutoregressionInitialTimeEnum;
     185              else if (strcmp(name,"FrontalForcingsAutoregressionTimestep")==0) return FrontalForcingsAutoregressionTimestepEnum;
     186              else if (strcmp(name,"FrontalForcingsAutoregressiveOrder")==0) return FrontalForcingsAutoregressiveOrderEnum;
     187              else if (strcmp(name,"FrontalForcingsBeta0")==0) return FrontalForcingsBeta0Enum;
     188              else if (strcmp(name,"FrontalForcingsBeta1")==0) return FrontalForcingsBeta1Enum;
     189              else if (strcmp(name,"FrontalForcingsCovmat")==0) return FrontalForcingsCovmatEnum;
    184190              else if (strcmp(name,"FrontalForcingsNumberofBasins")==0) return FrontalForcingsNumberofBasinsEnum;
    185191              else if (strcmp(name,"FrontalForcingsParam")==0) return FrontalForcingsParamEnum;
     192              else if (strcmp(name,"FrontalForcingsPhi")==0) return FrontalForcingsPhiEnum;
     193              else if (strcmp(name,"FrontalForcingsRandomflag")==0) return FrontalForcingsRandomflagEnum;
    186194              else if (strcmp(name,"GrdModel")==0) return GrdModelEnum;
    187195              else if (strcmp(name,"GroundinglineFrictionInterpolation")==0) return GroundinglineFrictionInterpolationEnum;
     
    252260              else if (strcmp(name,"InversionNsteps")==0) return InversionNstepsEnum;
    253261              else if (strcmp(name,"InversionNumControlParameters")==0) return InversionNumControlParametersEnum;
    254               else if (strcmp(name,"InversionNumCostFunctions")==0) return InversionNumCostFunctionsEnum;
     262         else stage=3;
     263   }
     264   if(stage==3){
     265              if (strcmp(name,"InversionNumCostFunctions")==0) return InversionNumCostFunctionsEnum;
    255266              else if (strcmp(name,"InversionStepThreshold")==0) return InversionStepThresholdEnum;
    256267              else if (strcmp(name,"InversionType")==0) return InversionTypeEnum;
     
    260271              else if (strcmp(name,"LevelsetReinitFrequency")==0) return LevelsetReinitFrequencyEnum;
    261272              else if (strcmp(name,"LevelsetStabilization")==0) return LevelsetStabilizationEnum;
    262          else stage=3;
    263    }
    264    if(stage==3){
    265               if (strcmp(name,"LockFileName")==0) return LockFileNameEnum;
     273              else if (strcmp(name,"LockFileName")==0) return LockFileNameEnum;
    266274              else if (strcmp(name,"LoveAllowLayerDeletion")==0) return LoveAllowLayerDeletionEnum;
    267275              else if (strcmp(name,"LoveCoreMantleBoundary")==0) return LoveCoreMantleBoundaryEnum;
     
    375383              else if (strcmp(name,"SolidearthSettingsViscous")==0) return SolidearthSettingsViscousEnum;
    376384              else if (strcmp(name,"SealevelchangeGeometryDone")==0) return SealevelchangeGeometryDoneEnum;
    377               else if (strcmp(name,"SealevelchangeViscousNumSteps")==0) return SealevelchangeViscousNumStepsEnum;
     385         else stage=4;
     386   }
     387   if(stage==4){
     388              if (strcmp(name,"SealevelchangeViscousNumSteps")==0) return SealevelchangeViscousNumStepsEnum;
    378389              else if (strcmp(name,"SealevelchangeViscousTimes")==0) return SealevelchangeViscousTimesEnum;
    379390              else if (strcmp(name,"SealevelchangeViscousIndex")==0) return SealevelchangeViscousIndexEnum;
     
    383394              else if (strcmp(name,"TidalLoveL")==0) return TidalLoveLEnum;
    384395              else if (strcmp(name,"TidalLoveK2Secular")==0) return TidalLoveK2SecularEnum;
    385          else stage=4;
    386    }
    387    if(stage==4){
    388               if (strcmp(name,"LoadLoveH")==0) return LoadLoveHEnum;
     396              else if (strcmp(name,"LoadLoveH")==0) return LoadLoveHEnum;
    389397              else if (strcmp(name,"LoadLoveK")==0) return LoadLoveKEnum;
    390398              else if (strcmp(name,"LoadLoveL")==0) return LoadLoveLEnum;
     
    498506              else if (strcmp(name,"StressbalanceReltol")==0) return StressbalanceReltolEnum;
    499507              else if (strcmp(name,"StressbalanceRequestedOutputs")==0) return StressbalanceRequestedOutputsEnum;
    500               else if (strcmp(name,"StressbalanceRestol")==0) return StressbalanceRestolEnum;
     508         else stage=5;
     509   }
     510   if(stage==5){
     511              if (strcmp(name,"StressbalanceRestol")==0) return StressbalanceRestolEnum;
    501512              else if (strcmp(name,"StressbalanceRiftPenaltyThreshold")==0) return StressbalanceRiftPenaltyThresholdEnum;
    502513              else if (strcmp(name,"StressbalanceShelfDampening")==0) return StressbalanceShelfDampeningEnum;
     
    506517              else if (strcmp(name,"ThermalMaxiter")==0) return ThermalMaxiterEnum;
    507518              else if (strcmp(name,"ThermalNumRequestedOutputs")==0) return ThermalNumRequestedOutputsEnum;
    508          else stage=5;
    509    }
    510    if(stage==5){
    511               if (strcmp(name,"ThermalPenaltyFactor")==0) return ThermalPenaltyFactorEnum;
     519              else if (strcmp(name,"ThermalPenaltyFactor")==0) return ThermalPenaltyFactorEnum;
    512520              else if (strcmp(name,"ThermalPenaltyLock")==0) return ThermalPenaltyLockEnum;
    513521              else if (strcmp(name,"ThermalPenaltyThreshold")==0) return ThermalPenaltyThresholdEnum;
     
    621629              else if (strcmp(name,"CalvingrateyAverage")==0) return CalvingrateyAverageEnum;
    622630              else if (strcmp(name,"Calvingratey")==0) return CalvingrateyEnum;
    623               else if (strcmp(name,"CalvingFluxLevelset")==0) return CalvingFluxLevelsetEnum;
     631         else stage=6;
     632   }
     633   if(stage==6){
     634              if (strcmp(name,"CalvingFluxLevelset")==0) return CalvingFluxLevelsetEnum;
    624635              else if (strcmp(name,"CalvingMeltingFluxLevelset")==0) return CalvingMeltingFluxLevelsetEnum;
    625636              else if (strcmp(name,"Converged")==0) return ConvergedEnum;
     
    629640              else if (strcmp(name,"DamageDbar")==0) return DamageDbarEnum;
    630641              else if (strcmp(name,"DamageDbarOld")==0) return DamageDbarOldEnum;
    631          else stage=6;
    632    }
    633    if(stage==6){
    634               if (strcmp(name,"DamageF")==0) return DamageFEnum;
     642              else if (strcmp(name,"DamageF")==0) return DamageFEnum;
    635643              else if (strcmp(name,"DegreeOfChannelization")==0) return DegreeOfChannelizationEnum;
    636644              else if (strcmp(name,"DepthBelowSurface")==0) return DepthBelowSurfaceEnum;
     
    744752              else if (strcmp(name,"HydrologyWaterVx")==0) return HydrologyWaterVxEnum;
    745753              else if (strcmp(name,"HydrologyWaterVy")==0) return HydrologyWaterVyEnum;
    746               else if (strcmp(name,"Ice")==0) return IceEnum;
     754         else stage=7;
     755   }
     756   if(stage==7){
     757              if (strcmp(name,"Ice")==0) return IceEnum;
    747758              else if (strcmp(name,"IceMaskNodeActivation")==0) return IceMaskNodeActivationEnum;
    748759              else if (strcmp(name,"Input")==0) return InputEnum;
     
    752763              else if (strcmp(name,"InversionVelObs")==0) return InversionVelObsEnum;
    753764              else if (strcmp(name,"InversionVxObs")==0) return InversionVxObsEnum;
    754          else stage=7;
    755    }
    756    if(stage==7){
    757               if (strcmp(name,"InversionVyObs")==0) return InversionVyObsEnum;
     765              else if (strcmp(name,"InversionVyObs")==0) return InversionVyObsEnum;
    758766              else if (strcmp(name,"LevelsetfunctionSlopeX")==0) return LevelsetfunctionSlopeXEnum;
    759767              else if (strcmp(name,"LevelsetfunctionSlopeY")==0) return LevelsetfunctionSlopeYEnum;
     
    867875              else if (strcmp(name,"SealevelchangeGEsubelOcean")==0) return SealevelchangeGEsubelOceanEnum;
    868876              else if (strcmp(name,"SealevelchangeGNsubelOcean")==0) return SealevelchangeGNsubelOceanEnum;
    869               else if (strcmp(name,"SealevelchangeGsubelIce")==0) return SealevelchangeGsubelIceEnum;
     877         else stage=8;
     878   }
     879   if(stage==8){
     880              if (strcmp(name,"SealevelchangeGsubelIce")==0) return SealevelchangeGsubelIceEnum;
    870881              else if (strcmp(name,"SealevelchangeGUsubelIce")==0) return SealevelchangeGUsubelIceEnum;
    871882              else if (strcmp(name,"SealevelchangeGEsubelIce")==0) return SealevelchangeGEsubelIceEnum;
     
    875886              else if (strcmp(name,"SealevelchangeGEsubelHydro")==0) return SealevelchangeGEsubelHydroEnum;
    876887              else if (strcmp(name,"SealevelchangeGNsubelHydro")==0) return SealevelchangeGNsubelHydroEnum;
    877          else stage=8;
    878    }
    879    if(stage==8){
    880               if (strcmp(name,"SealevelchangeViscousRSL")==0) return SealevelchangeViscousRSLEnum;
     888              else if (strcmp(name,"SealevelchangeViscousRSL")==0) return SealevelchangeViscousRSLEnum;
    881889              else if (strcmp(name,"SealevelchangeViscousU")==0) return SealevelchangeViscousUEnum;
    882890              else if (strcmp(name,"SealevelchangeViscousN")==0) return SealevelchangeViscousNEnum;
     
    990998              else if (strcmp(name,"SmbTz")==0) return SmbTzEnum;
    991999              else if (strcmp(name,"SmbValuesAutoregression")==0) return SmbValuesAutoregressionEnum;
    992               else if (strcmp(name,"SmbV")==0) return SmbVEnum;
     1000         else stage=9;
     1001   }
     1002   if(stage==9){
     1003              if (strcmp(name,"SmbV")==0) return SmbVEnum;
    9931004              else if (strcmp(name,"SmbVmean")==0) return SmbVmeanEnum;
    9941005              else if (strcmp(name,"SmbVz")==0) return SmbVzEnum;
     
    9981009              else if (strcmp(name,"SmbZMax")==0) return SmbZMaxEnum;
    9991010              else if (strcmp(name,"SmbZMin")==0) return SmbZMinEnum;
    1000          else stage=9;
    1001    }
    1002    if(stage==9){
    1003               if (strcmp(name,"SmbZTop")==0) return SmbZTopEnum;
     1011              else if (strcmp(name,"SmbZTop")==0) return SmbZTopEnum;
    10041012              else if (strcmp(name,"SmbZY")==0) return SmbZYEnum;
    10051013              else if (strcmp(name,"SolidearthExternalDisplacementEastRate")==0) return SolidearthExternalDisplacementEastRateEnum;
     
    10421050              else if (strcmp(name,"TemperaturePicard")==0) return TemperaturePicardEnum;
    10431051              else if (strcmp(name,"TemperatureSEMIC")==0) return TemperatureSEMICEnum;
     1052              else if (strcmp(name,"ThermalforcingValuesAutoregression")==0) return ThermalforcingValuesAutoregressionEnum;
    10441053              else if (strcmp(name,"ThermalSpctemperature")==0) return ThermalSpctemperatureEnum;
    10451054              else if (strcmp(name,"ThicknessAbsGradient")==0) return ThicknessAbsGradientEnum;
     
    11121121              else if (strcmp(name,"Outputdefinition35")==0) return Outputdefinition35Enum;
    11131122              else if (strcmp(name,"Outputdefinition36")==0) return Outputdefinition36Enum;
    1114               else if (strcmp(name,"Outputdefinition37")==0) return Outputdefinition37Enum;
     1123         else stage=10;
     1124   }
     1125   if(stage==10){
     1126              if (strcmp(name,"Outputdefinition37")==0) return Outputdefinition37Enum;
    11151127              else if (strcmp(name,"Outputdefinition38")==0) return Outputdefinition38Enum;
    11161128              else if (strcmp(name,"Outputdefinition39")==0) return Outputdefinition39Enum;
     
    11211133              else if (strcmp(name,"Outputdefinition43")==0) return Outputdefinition43Enum;
    11221134              else if (strcmp(name,"Outputdefinition44")==0) return Outputdefinition44Enum;
    1123          else stage=10;
    1124    }
    1125    if(stage==10){
    1126               if (strcmp(name,"Outputdefinition45")==0) return Outputdefinition45Enum;
     1135              else if (strcmp(name,"Outputdefinition45")==0) return Outputdefinition45Enum;
    11271136              else if (strcmp(name,"Outputdefinition46")==0) return Outputdefinition46Enum;
    11281137              else if (strcmp(name,"Outputdefinition47")==0) return Outputdefinition47Enum;
     
    12351244              else if (strcmp(name,"Contact")==0) return ContactEnum;
    12361245              else if (strcmp(name,"Contour")==0) return ContourEnum;
    1237               else if (strcmp(name,"Contours")==0) return ContoursEnum;
     1246         else stage=11;
     1247   }
     1248   if(stage==11){
     1249              if (strcmp(name,"Contours")==0) return ContoursEnum;
    12381250              else if (strcmp(name,"ControlInput")==0) return ControlInputEnum;
    12391251              else if (strcmp(name,"ControlInputGrad")==0) return ControlInputGradEnum;
     
    12441256              else if (strcmp(name,"Cuffey")==0) return CuffeyEnum;
    12451257              else if (strcmp(name,"CuffeyTemperate")==0) return CuffeyTemperateEnum;
    1246          else stage=11;
    1247    }
    1248    if(stage==11){
    1249               if (strcmp(name,"DamageEvolutionAnalysis")==0) return DamageEvolutionAnalysisEnum;
     1258              else if (strcmp(name,"DamageEvolutionAnalysis")==0) return DamageEvolutionAnalysisEnum;
    12501259              else if (strcmp(name,"DamageEvolutionSolution")==0) return DamageEvolutionSolutionEnum;
    12511260              else if (strcmp(name,"DataSet")==0) return DataSetEnum;
     
    12941303              else if (strcmp(name,"FrontalForcingsDefault")==0) return FrontalForcingsDefaultEnum;
    12951304              else if (strcmp(name,"FrontalForcingsRignot")==0) return FrontalForcingsRignotEnum;
     1305              else if (strcmp(name,"FrontalForcingsRignotAutoregression")==0) return FrontalForcingsRignotAutoregressionEnum;
    12961306              else if (strcmp(name,"Fset")==0) return FsetEnum;
    12971307              else if (strcmp(name,"FullMeltOnPartiallyFloating")==0) return FullMeltOnPartiallyFloatingEnum;
     
    13571367              else if (strcmp(name,"LATaylorHood")==0) return LATaylorHoodEnum;
    13581368              else if (strcmp(name,"LambdaS")==0) return LambdaSEnum;
    1359               else if (strcmp(name,"LevelsetAnalysis")==0) return LevelsetAnalysisEnum;
     1369         else stage=12;
     1370   }
     1371   if(stage==12){
     1372              if (strcmp(name,"LevelsetAnalysis")==0) return LevelsetAnalysisEnum;
    13601373              else if (strcmp(name,"LevelsetfunctionPicard")==0) return LevelsetfunctionPicardEnum;
    13611374              else if (strcmp(name,"LinearFloatingMeltRate")==0) return LinearFloatingMeltRateEnum;
     
    13671380              else if (strcmp(name,"LoveKernelsImag")==0) return LoveKernelsImagEnum;
    13681381              else if (strcmp(name,"LoveKernelsReal")==0) return LoveKernelsRealEnum;
    1369          else stage=12;
    1370    }
    1371    if(stage==12){
    1372               if (strcmp(name,"LoveKi")==0) return LoveKiEnum;
     1382              else if (strcmp(name,"LoveKi")==0) return LoveKiEnum;
    13731383              else if (strcmp(name,"LoveKr")==0) return LoveKrEnum;
    13741384              else if (strcmp(name,"LoveLi")==0) return LoveLiEnum;
     
    14801490              else if (strcmp(name,"SMBsemic")==0) return SMBsemicEnum;
    14811491              else if (strcmp(name,"SSAApproximation")==0) return SSAApproximationEnum;
    1482               else if (strcmp(name,"SSAFSApproximation")==0) return SSAFSApproximationEnum;
     1492         else stage=13;
     1493   }
     1494   if(stage==13){
     1495              if (strcmp(name,"SSAFSApproximation")==0) return SSAFSApproximationEnum;
    14831496              else if (strcmp(name,"SSAHOApproximation")==0) return SSAHOApproximationEnum;
    14841497              else if (strcmp(name,"Scaled")==0) return ScaledEnum;
     
    14901503              else if (strcmp(name,"SealevelchangePolarMotion")==0) return SealevelchangePolarMotionEnum;
    14911504              else if (strcmp(name,"SealevelNmotion")==0) return SealevelNmotionEnum;
    1492          else stage=13;
    1493    }
    1494    if(stage==13){
    1495               if (strcmp(name,"SealevelUmotion")==0) return SealevelUmotionEnum;
     1505              else if (strcmp(name,"SealevelUmotion")==0) return SealevelUmotionEnum;
    14961506              else if (strcmp(name,"SealevelchangeAnalysis")==0) return SealevelchangeAnalysisEnum;
    14971507              else if (strcmp(name,"Seg")==0) return SegEnum;
  • issm/trunk-jpl/src/c/shared/io/Marshalling/IoCodeConversions.cpp

    r26477 r26495  
    274274                case 1: return FrontalForcingsDefaultEnum;
    275275                case 2: return FrontalForcingsRignotEnum;
     276                case 55: return FrontalForcingsRignotAutoregressionEnum;
    276277                default: _error_("Marshalled Frontalforcings code \""<<enum_in<<"\" not supported yet");
    277278        }
  • issm/trunk-jpl/test/NightlyRun/test257.m

    r26487 r26495  
    3131    end
    3232end
     33
     34%SMB parameters
     35md.timestepping.start_time = 0;
     36md.timestepping.time_step  = 1;
     37md.timestepping.final_time = 5;
     38md.smb                = SMBautoregression();
     39md.smb.num_basins     = 3; %number of basins
     40md.smb.basin_id       = idbasin; %prescribe basin ID number to elements
     41md.smb.beta0          = [0.5,1.2,1.5]; %intercept values of SMB in basins [m ice eq./yr]
     42md.smb.beta1          = [0.0,0.01,-0.01]; %trend values of SMB in basins [m ice eq./yr^2]
     43md.smb.ar_initialtime = md.timestepping.start_time;
     44md.smb.ar_order       = 4;
     45md.smb.ar_timestep    = 2.0; %timestep of the autoregressive model [yr]
     46md.smb.phi            = [[0.2,0.1,0.05,0.01];[0.4,0.2,-0.2,0.1];[0.4,-0.4,0.1,-0.1]];
     47md.smb.covmat         = [[0.15 0.08 -0.02];[0.08 0.12 -0.05];[-0.02 -0.05 0.1]];
     48md.smb.randomflag     = 0; %fixed random seeds
    3349
    3450md=solve(md,'Transient');
  • issm/trunk-jpl/test/NightlyRun/test542.m

    r26487 r26495  
    99%separate domain in 2 basins
    1010idbasin = zeros(md.mesh.numberofelements,1);
    11 iid1    = find(md.mesh.y>=mean(md.mesh.y));
     11iid1    = find(md.mesh.x<=-1.6e6);
    1212for ii=1:md.mesh.numberofelements
    1313    for vertex=1:3
Note: See TracChangeset for help on using the changeset viewer.