Changeset 22918


Ignore:
Timestamp:
07/13/18 13:01:36 (7 years ago)
Author:
tpelle
Message:

CHG: Adding buoyant plume basal melt-rate parameterization to ISSM, adapted from Lazeroms et al. (2018)

Location:
issm/trunk-jpl
Files:
16 edited

Legend:

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

    r22909 r22918  
    4141
    4242        iomodel->FetchDataToInput(elements,"md.geometry.surface",SurfaceEnum);
    43         iomodel->FetchDataToInput(elements,"md.geometry.base",BaseEnum);
     43        iomodel->FetchDataToInput(elements,"md.geometry.bed",BedEnum);
     44   iomodel->FetchDataToInput(elements,"md.geometry.base",BaseEnum);
    4445        iomodel->FetchDataToInput(elements,"md.slr.sealevel",SealevelEnum,0);
    4546        iomodel->FetchDataToInput(elements,"md.mask.ice_levelset",MaskIceLevelsetEnum);
     
    165166                case SurfaceSlopeXEnum: input2 = basalelement->GetInput(SurfaceEnum); _assert_(input2); break;
    166167                case SurfaceSlopeYEnum: input2 = basalelement->GetInput(SurfaceEnum); _assert_(input2); break;
    167                 case BedSlopeXEnum:     input2 = basalelement->GetInput(BaseEnum);     _assert_(input2); break;
    168                 case BedSlopeYEnum:     input2 = basalelement->GetInput(BaseEnum);     _assert_(input2); break;
     168                case BedSlopeXEnum:     input2 = basalelement->GetInput(BedEnum);     _assert_(input2); break;
     169                case BedSlopeYEnum:     input2 = basalelement->GetInput(BedEnum);     _assert_(input2); break;
     170                case BaseSlopeXEnum:    input2 = basalelement->GetInput(BaseEnum);    _assert_(input2); break;
     171                case BaseSlopeYEnum:    input2 = basalelement->GetInput(BaseEnum);    _assert_(input2); break;
    169172                case LevelsetfunctionSlopeXEnum: input2 = basalelement->GetInput(MaskIceLevelsetEnum);     _assert_(input2); break;
    170173                case LevelsetfunctionSlopeYEnum: input2 = basalelement->GetInput(MaskIceLevelsetEnum);     _assert_(input2); break;
     
    182185                if(input2) input2->GetInputDerivativeValue(&slopes[0],xyz_list,gauss);
    183186                switch(input_enum){
    184                         case SurfaceSlopeXEnum: case BedSlopeXEnum: case LevelsetfunctionSlopeXEnum: value = slopes[0]; break;
    185                         case SurfaceSlopeYEnum: case BedSlopeYEnum: case LevelsetfunctionSlopeYEnum: value = slopes[1]; break;
     187                        case SurfaceSlopeXEnum: case BedSlopeXEnum: case BaseSlopeXEnum: case LevelsetfunctionSlopeXEnum: value = slopes[0]; break;
     188                        case SurfaceSlopeYEnum: case BedSlopeYEnum: case BaseSlopeYEnum: case LevelsetfunctionSlopeYEnum: value = slopes[1]; break;
    186189                        default: input->GetInputValue(&value,gauss);
    187190                }
  • issm/trunk-jpl/src/c/classes/Elements/Element.h

    r22828 r22918  
    281281                virtual void       PicoUpdateBoxid(int* pmax_boxid_basin)=0;
    282282                virtual void       PicoUpdateBox(int loopboxid)=0;
     283                virtual void       PicoComputeBaseSlope(void)=0;
     284                virtual void       PicoComputeGroundingLineDepth(void)=0;
     285                virtual void       PicoComputeBasalMelt(void)=0;
    283286                virtual void       PotentialUngrounding(Vector<IssmDouble>* potential_sheet_ungrounding)=0;
    284287                virtual int        PressureInterpolation()=0;
  • issm/trunk-jpl/src/c/classes/Elements/Penta.h

    r22828 r22918  
    143143                void                            PicoUpdateBoxid(int* pmax_boxid_basin){_error_("not implemented yet");};
    144144                void                            PicoUpdateBox(int loopboxid){_error_("not implemented yet");};
     145                void                            PicoComputeBaseSlope(void){_error_("not implemented yet");};
     146                void                            PicoComputeGroundingLineDepth(void){_error_("not implemented yet");};
     147                void                            PicoComputeBasalMelt(void){_error_("not implemented yet");};
    145148                void           PotentialUngrounding(Vector<IssmDouble>* potential_sheet_ungrounding);
    146149                int            PressureInterpolation();
  • issm/trunk-jpl/src/c/classes/Elements/Seg.h

    r22828 r22918  
    132132                void        PicoUpdateBoxid(int* pmax_boxid_basin){_error_("not implemented yet");};
    133133                void                    PicoUpdateBox(int loopboxid){_error_("not implemented yet");};
     134                void                    PicoComputeBaseSlope(void){_error_("not implemented yet");};
     135                void                    PicoComputeGroundingLineDepth(void){_error_("not implemented yet");};
     136                void                    PicoComputeBasalMelt(void){_error_("not implemented yet");};
    134137                void        PotentialUngrounding(Vector<IssmDouble>* potential_sheet_ungrounding){_error_("not implemented yet");};
    135138                int         PressureInterpolation(void){_error_("not implemented yet");};
  • issm/trunk-jpl/src/c/classes/Elements/Tetra.h

    r22828 r22918  
    140140                void                    PicoUpdateBoxid(int* pmax_boxid_basin){_error_("not implemented yet");};       
    141141                void                    PicoUpdateBox(int loopboxid){_error_("not implemented yet");};
     142                void                    PicoComputeBaseSlope(void){_error_("not implemented yet");};
     143                void                    PicoComputeGroundingLineDepth(void){_error_("not implemented yet");};
     144                void                    PicoComputeBasalMelt(void){_error_("not implemented yet");};
    142145                void        PotentialUngrounding(Vector<IssmDouble>* potential_sheet_ungrounding){_error_("not implemented yet");};
    143146                int         PressureInterpolation(void);
  • issm/trunk-jpl/src/c/classes/Elements/Tria.cpp

    r22828 r22918  
    29372937        IssmDouble gamma_T, overturning_coeff, thickness;
    29382938        IssmDouble pressure, T_star,p_coeff, q_coeff;
     2939        bool       isplume;
    29392940
    29402941        /*Get variables*/
     
    29592960        this->parameters->FindParam(&maxbox,BasalforcingsPicoMaxboxcountEnum);
    29602961        this->inputs->GetInputValue(&basinid,BasalforcingsPicoBasinIdEnum);
     2962        this->parameters->FindParam(&isplume, BasalforcingsPicoIsplumeEnum);
    29612963        Input* thickness_input=this->GetInput(ThicknessEnum); _assert_(thickness_input);
    29622964        _assert_(basinid<=num_basins);
     
    30013003                        Socs[i] = soc_farocean-(soc_farocean/(nu*lambda))*(toc_farocean-Tocs[i]);
    30023004                        potential_pressure_melting_point[i] = a*Socs[i]+b-c*pressure;
    3003                         basalmeltrates_shelf[i] = (-gamma_T/(nu*lambda))*(potential_pressure_melting_point[i]-Tocs[i]);
     3005                        if(!isplume){basalmeltrates_shelf[i] = (-gamma_T/(nu*lambda))*(potential_pressure_melting_point[i]-Tocs[i]);}
    30043006                        overturnings[i] = overturning_coeff*rho_star*(Beta*(soc_farocean-Socs[i])-alpha*(toc_farocean-Tocs[i]));
    30053007                }
    30063008
    3007                 this->AddInput(BasalforcingsFloatingiceMeltingRateEnum,basalmeltrates_shelf,P1Enum);
     3009                if(!isplume){this->AddInput(BasalforcingsFloatingiceMeltingRateEnum,basalmeltrates_shelf,P1Enum);}
    30083010                this->AddInput(BasalforcingsPicoSubShelfOceanTempEnum,Tocs,P1Enum);
    30093011                this->AddInput(BasalforcingsPicoSubShelfOceanSalinityEnum,Socs,P1Enum);
     
    30383040                        Socs[i]  = mean_soc-mean_soc*((mean_toc-Tocs[i])/(nu*lambda));
    30393041                        potential_pressure_melting_point[i] = a*Socs[i]+b-c*pressure;
    3040                         basalmeltrates_shelf[i] = (-gamma_T/(nu*lambda))*(potential_pressure_melting_point[i]-Tocs[i]);
    3041                 }
    3042 
    3043                 this->AddInput(BasalforcingsFloatingiceMeltingRateEnum,basalmeltrates_shelf,P1Enum);
     3042                        if(!isplume){basalmeltrates_shelf[i] = (-gamma_T/(nu*lambda))*(potential_pressure_melting_point[i]-Tocs[i]);}
     3043                }
     3044
     3045                if(!isplume){this->AddInput(BasalforcingsFloatingiceMeltingRateEnum,basalmeltrates_shelf,P1Enum);}
    30443046                this->AddInput(BasalforcingsPicoSubShelfOceanTempEnum,Tocs,P1Enum);
    30453047                this->AddInput(BasalforcingsPicoSubShelfOceanSalinityEnum,Socs,P1Enum);
     
    30563058}
    30573059/*}}}*/
     3060void       Tria::PicoComputeBaseSlope(void){/*{{{*/
     3061
     3062   //if(!this->IsIceInElement() || !this->IsFloating()) return;
     3063
     3064        /*Define variables and get inputs */
     3065        IssmDouble  slopex,slopey;
     3066        IssmDouble slope[NUMVERTICES];
     3067        Input* baseslopex_input     = this->GetInput(BaseSlopeXEnum);     _assert_(baseslopex_input);
     3068        Input* baseslopey_input     = this->GetInput(BaseSlopeYEnum);     _assert_(baseslopey_input);
     3069
     3070        Gauss* gauss=this->NewGauss();
     3071        for(int i=0;i<NUMVERTICES;i++){
     3072                gauss->GaussVertex(i);
     3073                baseslopex_input->GetInputValue(&slopex,gauss);
     3074                baseslopey_input->GetInputValue(&slopey,gauss);
     3075                slope[i] = sqrt(slopex*slopex + slopey*slopey);
     3076        }
     3077
     3078        this->AddInput(BasalforcingsPicoShelfSlopeEnum,slope,P1Enum);
     3079
     3080        /*Cleanup and return*/
     3081        delete gauss;
     3082}/*}}}*/
     3083void       Tria::PicoComputeGroundingLineDepth(void){/*{{{*/
     3084
     3085        if(!this->IsIceInElement() || !this->IsFloating()) return;
     3086
     3087        /*Define variables and get inputs */
     3088        IssmDouble bed;
     3089        IssmDouble zgl[NUMVERTICES];
     3090        Input* bed_input = this->GetInput(BedEnum);  _assert_(bed_input);
     3091
     3092        Gauss* gauss=this->NewGauss();
     3093        for(int i=0;i<NUMVERTICES;i++){
     3094                gauss->GaussVertex(i);
     3095                bed_input->GetInputValue(&bed,gauss);
     3096           zgl[i] = bed -50.;
     3097        }
     3098
     3099        this->AddInput(BasalforcingsPicoGroundingLineDepthEnum,zgl,P1Enum);
     3100
     3101        /*Cleanup and return*/
     3102        delete gauss;
     3103}/*}}}*/
     3104void       Tria::PicoComputeBasalMelt(void){/*{{{*/
     3105
     3106        if(!this->IsIceInElement() || !this->IsFloating()) return;
     3107
     3108   IssmDouble E0, Cd, CdT, YT, lam1, lam2, lam3, M0, CdTS0, y1, y2, x0;
     3109        IssmDouble Tf_gl, YTS, CdTS, G1, G2, G3, g_alpha, M, l, X_hat, M_hat;
     3110        IssmDouble alpha, zgl, Toc, Soc, z_base, yts;
     3111
     3112        /*Get variables*/
     3113        E0    = 3.6e-2;        //Entrainment coefficient
     3114        Cd    = 2.5e-3;        //Drag coefficient
     3115        CdT   = 1.1e-3;        //Turbulent heat exchange coefficient
     3116        YT    = CdT/sqrt(Cd);  //Heat exchange coefficient
     3117        lam1  = -5.73e-2;      //Freezing point-salinity coefficient (degrees C)
     3118        lam2  = 8.32e-2;       //Freezing point offset (degrees C)
     3119        lam3  = 7.61e-4;       //Freezing point-depth coefficient (K m-1)
     3120        M0    = 10.;           //Melt-rate parameter (m yr-1 C-2)
     3121        CdTS0 = 6e-4;          //Heat exchange parameter
     3122        y1    = 0.545;         //Heat exchange parameter
     3123        y2    = 3.5e-5;        //Heat exchange parameter
     3124        x0    = 0.56;          //Dimentionless scaling factor
     3125
     3126        /*Define arrays*/
     3127        IssmDouble basalmeltrates_shelf[NUMVERTICES];  //Basal melt-rate
     3128
     3129        /*Polynomial coefficients*/
     3130        IssmDouble p[12];
     3131        p[0]  =  0.1371330075095435;
     3132        p[1]  =  5.527656234709359E1;
     3133        p[2]  = -8.951812433987858E2;
     3134        p[3]  =  8.927093637594877E3;
     3135        p[4]  = -5.563863123811898E4;
     3136        p[5]  =  2.218596970948727E5;
     3137        p[6]  = -5.820015295669482E5;
     3138        p[7]  =  1.015475347943186E6;
     3139        p[8]  = -1.166290429178556E6;
     3140        p[9]  =  8.466870335320488E5;
     3141        p[10] = -3.520598035764990E5;
     3142        p[11] =  6.387953795485420E4;
     3143
     3144        /*Get inputs*/
     3145   Input* alpha_input=this->GetInput(BasalforcingsPicoShelfSlopeEnum);              _assert_(alpha_input);
     3146   Input* zgl_input=this->GetInput(BasalforcingsPicoGroundingLineDepthEnum);        _assert_(zgl_input);
     3147        Input* toc_input=this->GetInput(BasalforcingsPicoSubShelfOceanTempEnum);         _assert_(toc_input);
     3148        Input* soc_input=this->GetInput(BasalforcingsPicoSubShelfOceanSalinityEnum);     _assert_(soc_input);
     3149        Input* base_input=this->GetInput(BaseEnum);                                      _assert_(base_input);
     3150        this->FindParam(&yts, ConstantsYtsEnum);
     3151
     3152        /*Loop over the number of vertices in this element*/
     3153        Gauss* gauss=this->NewGauss();
     3154        for(int i=0;i<NUMVERTICES;i++){
     3155                gauss->GaussVertex(i);
     3156
     3157                /*Get inputs*/
     3158      alpha_input->GetInputValue(&alpha,gauss);
     3159      zgl_input->GetInputValue(&zgl,gauss);
     3160                toc_input->GetInputValue(&Toc,gauss); //(K)
     3161                soc_input->GetInputValue(&Soc,gauss);
     3162                base_input->GetInputValue(&z_base,gauss);
     3163
     3164                /*Make necessary conversions*/
     3165                Toc = Toc-273.15;     // (Degrees C)
     3166                alpha = atan(alpha);  // (Degrees)
     3167
     3168                /*Low bound for Toc to ensure X_hat is between 0 and 1*/
     3169                if(Toc<lam1*Soc+lam2) {Toc=lam1*Soc+lam2;}
     3170
     3171                /*Compute parameters needed for melt-rate calculation*/
     3172                Tf_gl = lam1*Soc+lam2+lam3*zgl;                                              //Characteristic freezing point
     3173                YTS = YT*(y1+y2*(((Toc-Tf_gl)*E0*sin(alpha))/(lam3*(CdTS0+E0*sin(alpha))))); //Effective heat exchange coefficient
     3174                CdTS = sqrt(Cd)*YTS;                                                         //Heat exchange coefficient
     3175                G1 = sqrt(sin(alpha)/(Cd+E0*sin(alpha)));                                    //Geometric factor
     3176                G2 = sqrt(CdTS/(CdTS+E0*sin(alpha)));                                        //Geometric factor
     3177                G3 = (E0*sin(alpha))/(CdTS+E0*sin(alpha));                                   //Geometric factor
     3178      g_alpha = G1*G2*G3;                                                          //Melt scaling factor
     3179                M = M0*g_alpha*pow((Toc-Tf_gl),2);                                           //Melt-rate scale
     3180                l = ((Toc-Tf_gl)*(x0*CdTS+E0*sin(alpha)))/(lam3*x0*(CdTS+E0*sin(alpha)));    //Length scale
     3181                X_hat = (z_base-zgl)/l;                                                      //Dimentionless coordinate system
     3182
     3183                /*Compute polynomial fit*/
     3184                M_hat = 0.;                                                                  //Reset summation variable for each node
     3185                for(int ii=0;ii<12;ii++) {
     3186                 M_hat += p[ii]*pow(X_hat,ii);                                               //Polynomial fit
     3187                }
     3188
     3189                /*Compute melt-rate*/
     3190                basalmeltrates_shelf[i] = (M*M_hat)/yts;                                     //Basal melt-rate (m/s)
     3191        }
     3192   /*Save computed melt-rate*/
     3193   this->AddInput(BasalforcingsFloatingiceMeltingRateEnum,basalmeltrates_shelf,P1Enum);
     3194
     3195   /*Cleanup and return*/
     3196        delete gauss;
     3197}/*}}}*/
    30583198void       Tria::PotentialUngrounding(Vector<IssmDouble>* potential_ungrounding){/*{{{*/
    30593199
  • issm/trunk-jpl/src/c/classes/Elements/Tria.h

    r22828 r22918  
    114114                void        PicoUpdateBoxid(int* pmax_boxid_basin);
    115115                void        PicoUpdateBox(int loopboxid);
     116                void        PicoComputeBaseSlope(void);
     117                void        PicoComputeGroundingLineDepth(void);
     118                void        PicoComputeBasalMelt(void);
    116119                void        PotentialUngrounding(Vector<IssmDouble>* potential_sheet_ungrounding);
    117120                int         PressureInterpolation();
  • issm/trunk-jpl/src/c/cores/bmb_core.cpp

    r22914 r22918  
    2020        /*In some cases we need to run additional analyses to get the required input data*/
    2121        if(basalforcing_model==BasalforcingsPicoEnum){
    22                 //femmodel->parameters->FindParam(&isplume,BasalforcingsIsplumeEnum);
     22                femmodel->parameters->FindParam(&isplume,BasalforcingsPicoIsplumeEnum);
    2323                if(isplume){
    24 
    2524                        femmodel->SetCurrentConfiguration(L2ProjectionBaseAnalysisEnum);
    26                         _error_("STOP");
    27                         //femmodel->parameters->SetParam(BaseSlopeXEnum,InputToL2ProjectEnum);
     25                        femmodel->parameters->SetParam(BaseSlopeXEnum,InputToL2ProjectEnum);
    2826                        solutionsequence_linear(femmodel);
    29                         //femmodel->parameters->SetParam(BaseSlopeYEnum,InputToL2ProjectEnum);
     27                        femmodel->parameters->SetParam(BaseSlopeYEnum,InputToL2ProjectEnum);
    3028                        solutionsequence_linear(femmodel);
    3129                }
  • issm/trunk-jpl/src/c/modules/FloatingiceMeltingRatePicox/FloatingiceMeltingRatePicox.cpp

    r22749 r22918  
    1010
    1111        int maxbox;
     12        bool isplume;
    1213
    1314   /*First, reset all melt to 0 */
     
    2021           }
    2122
     23        /*PICO nelt rate parameterization (Reese et al., 2018)*/
    2224   femmodel->parameters->FindParam(&maxbox,BasalforcingsPicoMaxboxcountEnum);
    2325   UpdateBoxIdsPico(femmodel);
     
    2628              UpdateBoxPico(femmodel,i);
    2729              ComputeAverageOceanvarsPico(femmodel,i);
     30        }
     31
     32        /*Optional buoyant plume melt rate parameterization (Lazeroms et al., 2018) */
     33        femmodel->parameters->FindParam(&isplume,BasalforcingsPicoIsplumeEnum);
     34        if(isplume){
     35                   ComputeSubshelfSlopePlume(femmodel);
     36                        ComputeGroundingLineDepthPlume(femmodel);
     37         ComputeBasalMeltPlume(femmodel);
    2838        }
    2939}/*}}}*/
     
    222232        xDelete<IssmDouble>(boxareas);
    223233}/*}}}*/
     234void ComputeSubshelfSlopePlume(FemModel* femmodel){/*{{{*/
     235        for(int i=0;i<femmodel->elements->Size();i++){
     236                Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
     237                element->PicoComputeBaseSlope();
     238        }
     239}/*}}}*/
     240void ComputeGroundingLineDepthPlume(FemModel* femmodel){/*{{{*/
     241        for(int i=0;i<femmodel->elements->Size();i++){
     242                Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
     243                element->PicoComputeGroundingLineDepth();
     244        }
     245}/*}}}*/
     246void ComputeBasalMeltPlume(FemModel* femmodel){/*{{{*/
     247        for(int i=0;i<femmodel->elements->Size();i++){
     248                Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
     249                element->PicoComputeBasalMelt();
     250        }
     251}/*}}}*/
  • issm/trunk-jpl/src/c/modules/FloatingiceMeltingRatePicox/FloatingiceMeltingRatePicox.h

    r22732 r22918  
    1515void UpdateBoxPico(FemModel* femmodel, int loopboxid);
    1616void ComputeAverageOceanvarsPico(FemModel* femmodel, int boxid);
     17void ComputeSubshelfSlopePlume(FemModel* femmodel);
     18void ComputeGroundingLineDepthPlume(FemModel* femmodel);
     19void ComputeBasalMeltPlume(FemModel* femmodel);
    1720
    1821#endif  /* _FloatingiceMeltingRatePicox_H*/
  • issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp

    r22802 r22918  
    233233                                parameters->AddObject(iomodel->CopyConstantObject("md.basalforcings.overturning_coeff",BasalforcingsPicoOverturningCoeffEnum));
    234234                                parameters->AddObject(iomodel->CopyConstantObject("md.basalforcings.gamma_T",BasalforcingsPicoGammaTEnum));
     235                                parameters->AddObject(iomodel->CopyConstantObject("md.basalforcings.isplume",BasalforcingsPicoIsplumeEnum));
    235236                                iomodel->FetchData(&transparam,&M,&N,"md.basalforcings.farocean_temperature");
    236237                                _assert_(M>=1 && N>=1);
  • issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h

    r22911 r22918  
    7373        BasalforcingsPicoFarOceantemperatureEnum,
    7474        BasalforcingsPicoGammaTEnum,
     75        BasalforcingsPicoIsplumeEnum,
    7576        BasalforcingsPicoMaxboxcountEnum,
    7677        BasalforcingsPicoNumBasinsEnum,
     
    372373        BasalforcingsPicoBasinIdEnum,
    373374        BasalforcingsPicoBoxIdEnum,
     375        BasalforcingsPicoGroundingLineDepthEnum,
     376        BasalforcingsPicoShelfSlopeEnum,
    374377        BasalforcingsPicoSubShelfOceanOverturningEnum,
    375378        BasalforcingsPicoSubShelfOceanSalinityEnum,
    376379        BasalforcingsPicoSubShelfOceanTempEnum,
    377380        BaseEnum,
     381        BaseSlopeXEnum,
     382        BaseSlopeYEnum,
    378383        BedEnum,
    379384        BedSlopeXEnum,
  • issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp

    r22911 r22918  
    8181                case BasalforcingsPicoFarOceantemperatureEnum : return "BasalforcingsPicoFarOceantemperature";
    8282                case BasalforcingsPicoGammaTEnum : return "BasalforcingsPicoGammaT";
     83                case BasalforcingsPicoIsplumeEnum : return "BasalforcingsPicoIsplume";
    8384                case BasalforcingsPicoMaxboxcountEnum : return "BasalforcingsPicoMaxboxcount";
    8485                case BasalforcingsPicoNumBasinsEnum : return "BasalforcingsPicoNumBasins";
     
    378379                case BasalforcingsPicoBasinIdEnum : return "BasalforcingsPicoBasinId";
    379380                case BasalforcingsPicoBoxIdEnum : return "BasalforcingsPicoBoxId";
     381                case BasalforcingsPicoGroundingLineDepthEnum : return "BasalforcingsPicoGroundingLineDepth";
     382                case BasalforcingsPicoShelfSlopeEnum : return "BasalforcingsPicoShelfSlope";
    380383                case BasalforcingsPicoSubShelfOceanOverturningEnum : return "BasalforcingsPicoSubShelfOceanOverturning";
    381384                case BasalforcingsPicoSubShelfOceanSalinityEnum : return "BasalforcingsPicoSubShelfOceanSalinity";
    382385                case BasalforcingsPicoSubShelfOceanTempEnum : return "BasalforcingsPicoSubShelfOceanTemp";
    383386                case BaseEnum : return "Base";
     387                case BaseSlopeXEnum : return "BaseSlopeX";
     388                case BaseSlopeYEnum : return "BaseSlopeY";
    384389                case BedEnum : return "Bed";
    385390                case BedSlopeXEnum : return "BedSlopeX";
  • issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp

    r22911 r22918  
    8181              else if (strcmp(name,"BasalforcingsPicoFarOceantemperature")==0) return BasalforcingsPicoFarOceantemperatureEnum;
    8282              else if (strcmp(name,"BasalforcingsPicoGammaT")==0) return BasalforcingsPicoGammaTEnum;
     83              else if (strcmp(name,"BasalforcingsPicoIsplume")==0) return BasalforcingsPicoIsplumeEnum;
    8384              else if (strcmp(name,"BasalforcingsPicoMaxboxcount")==0) return BasalforcingsPicoMaxboxcountEnum;
    8485              else if (strcmp(name,"BasalforcingsPicoNumBasins")==0) return BasalforcingsPicoNumBasinsEnum;
     
    136137              else if (strcmp(name,"GiaCrossSectionShape")==0) return GiaCrossSectionShapeEnum;
    137138              else if (strcmp(name,"GroundinglineMigration")==0) return GroundinglineMigrationEnum;
    138               else if (strcmp(name,"HydrologydcEplflipLock")==0) return HydrologydcEplflipLockEnum;
    139139         else stage=2;
    140140   }
    141141   if(stage==2){
    142               if (strcmp(name,"HydrologydcEplThickComp")==0) return HydrologydcEplThickCompEnum;
     142              if (strcmp(name,"HydrologydcEplflipLock")==0) return HydrologydcEplflipLockEnum;
     143              else if (strcmp(name,"HydrologydcEplThickComp")==0) return HydrologydcEplThickCompEnum;
    143144              else if (strcmp(name,"HydrologydcIsefficientlayer")==0) return HydrologydcIsefficientlayerEnum;
    144145              else if (strcmp(name,"HydrologydcLeakageFactor")==0) return HydrologydcLeakageFactorEnum;
     
    259260              else if (strcmp(name,"SealevelriseTidalLoveH")==0) return SealevelriseTidalLoveHEnum;
    260261              else if (strcmp(name,"SealevelriseTidalLoveK")==0) return SealevelriseTidalLoveKEnum;
    261               else if (strcmp(name,"SealevelriseTransitions")==0) return SealevelriseTransitionsEnum;
    262262         else stage=3;
    263263   }
    264264   if(stage==3){
    265               if (strcmp(name,"SealevelriseUElastic")==0) return SealevelriseUElasticEnum;
     265              if (strcmp(name,"SealevelriseTransitions")==0) return SealevelriseTransitionsEnum;
     266              else if (strcmp(name,"SealevelriseUElastic")==0) return SealevelriseUElasticEnum;
    266267              else if (strcmp(name,"SettingsIoGather")==0) return SettingsIoGatherEnum;
    267268              else if (strcmp(name,"SettingsOutputFrequency")==0) return SettingsOutputFrequencyEnum;
     
    382383              else if (strcmp(name,"BasalforcingsGeothermalflux")==0) return BasalforcingsGeothermalfluxEnum;
    383384              else if (strcmp(name,"BasalforcingsGroundediceMeltingRate")==0) return BasalforcingsGroundediceMeltingRateEnum;
    384               else if (strcmp(name,"BasalforcingsPicoBasinId")==0) return BasalforcingsPicoBasinIdEnum;
    385385         else stage=4;
    386386   }
    387387   if(stage==4){
    388               if (strcmp(name,"BasalforcingsPicoBoxId")==0) return BasalforcingsPicoBoxIdEnum;
     388              if (strcmp(name,"BasalforcingsPicoBasinId")==0) return BasalforcingsPicoBasinIdEnum;
     389              else if (strcmp(name,"BasalforcingsPicoBoxId")==0) return BasalforcingsPicoBoxIdEnum;
     390              else if (strcmp(name,"BasalforcingsPicoGroundingLineDepth")==0) return BasalforcingsPicoGroundingLineDepthEnum;
     391              else if (strcmp(name,"BasalforcingsPicoShelfSlope")==0) return BasalforcingsPicoShelfSlopeEnum;
    389392              else if (strcmp(name,"BasalforcingsPicoSubShelfOceanOverturning")==0) return BasalforcingsPicoSubShelfOceanOverturningEnum;
    390393              else if (strcmp(name,"BasalforcingsPicoSubShelfOceanSalinity")==0) return BasalforcingsPicoSubShelfOceanSalinityEnum;
    391394              else if (strcmp(name,"BasalforcingsPicoSubShelfOceanTemp")==0) return BasalforcingsPicoSubShelfOceanTempEnum;
    392395              else if (strcmp(name,"Base")==0) return BaseEnum;
     396              else if (strcmp(name,"BaseSlopeX")==0) return BaseSlopeXEnum;
     397              else if (strcmp(name,"BaseSlopeY")==0) return BaseSlopeYEnum;
    393398              else if (strcmp(name,"Bed")==0) return BedEnum;
    394399              else if (strcmp(name,"BedSlopeX")==0) return BedSlopeXEnum;
     
    501506              else if (strcmp(name,"Misfit")==0) return MisfitEnum;
    502507              else if (strcmp(name,"Neumannflux")==0) return NeumannfluxEnum;
    503               else if (strcmp(name,"Node")==0) return NodeEnum;
     508         else stage=5;
     509   }
     510   if(stage==5){
     511              if (strcmp(name,"Node")==0) return NodeEnum;
    504512              else if (strcmp(name,"OmegaAbsGradient")==0) return OmegaAbsGradientEnum;
    505513              else if (strcmp(name,"P0")==0) return P0Enum;
    506514              else if (strcmp(name,"P1")==0) return P1Enum;
    507515              else if (strcmp(name,"Pressure")==0) return PressureEnum;
    508          else stage=5;
    509    }
    510    if(stage==5){
    511               if (strcmp(name,"RheologyBAbsGradient")==0) return RheologyBAbsGradientEnum;
     516              else if (strcmp(name,"RheologyBAbsGradient")==0) return RheologyBAbsGradientEnum;
    512517              else if (strcmp(name,"RheologyBbarAbsGradient")==0) return RheologyBbarAbsGradientEnum;
    513518              else if (strcmp(name,"Sealevel")==0) return SealevelEnum;
     
    624629              else if (strcmp(name,"Vy")==0) return VyEnum;
    625630              else if (strcmp(name,"VyMesh")==0) return VyMeshEnum;
    626               else if (strcmp(name,"VyObs")==0) return VyObsEnum;
     631         else stage=6;
     632   }
     633   if(stage==6){
     634              if (strcmp(name,"VyObs")==0) return VyObsEnum;
    627635              else if (strcmp(name,"Vz")==0) return VzEnum;
    628636              else if (strcmp(name,"VzFS")==0) return VzFSEnum;
    629637              else if (strcmp(name,"VzHO")==0) return VzHOEnum;
    630638              else if (strcmp(name,"VzMesh")==0) return VzMeshEnum;
    631          else stage=6;
    632    }
    633    if(stage==6){
    634               if (strcmp(name,"VzSSA")==0) return VzSSAEnum;
     639              else if (strcmp(name,"VzSSA")==0) return VzSSAEnum;
    635640              else if (strcmp(name,"Watercolumn")==0) return WatercolumnEnum;
    636641              else if (strcmp(name,"WaterColumnOld")==0) return WaterColumnOldEnum;
     
    747752              else if (strcmp(name,"FlowequationBorderFS")==0) return FlowequationBorderFSEnum;
    748753              else if (strcmp(name,"Free")==0) return FreeEnum;
    749               else if (strcmp(name,"FreeSurfaceBaseAnalysis")==0) return FreeSurfaceBaseAnalysisEnum;
     754         else stage=7;
     755   }
     756   if(stage==7){
     757              if (strcmp(name,"FreeSurfaceBaseAnalysis")==0) return FreeSurfaceBaseAnalysisEnum;
    750758              else if (strcmp(name,"FreeSurfaceTopAnalysis")==0) return FreeSurfaceTopAnalysisEnum;
    751759              else if (strcmp(name,"FSApproximation")==0) return FSApproximationEnum;
    752760              else if (strcmp(name,"Fset")==0) return FsetEnum;
    753761              else if (strcmp(name,"FSpressure")==0) return FSpressureEnum;
    754          else stage=7;
    755    }
    756    if(stage==7){
    757               if (strcmp(name,"FSSolver")==0) return FSSolverEnum;
     762              else if (strcmp(name,"FSSolver")==0) return FSSolverEnum;
    758763              else if (strcmp(name,"FSvelocity")==0) return FSvelocityEnum;
    759764              else if (strcmp(name,"GaussPenta")==0) return GaussPentaEnum;
     
    870875              else if (strcmp(name,"Matestar")==0) return MatestarEnum;
    871876              else if (strcmp(name,"Matice")==0) return MaticeEnum;
    872               else if (strcmp(name,"Matlitho")==0) return MatlithoEnum;
     877         else stage=8;
     878   }
     879   if(stage==8){
     880              if (strcmp(name,"Matlitho")==0) return MatlithoEnum;
    873881              else if (strcmp(name,"Matpar")==0) return MatparEnum;
    874882              else if (strcmp(name,"MatrixParam")==0) return MatrixParamEnum;
    875883              else if (strcmp(name,"MaxAbsVx")==0) return MaxAbsVxEnum;
    876884              else if (strcmp(name,"MaxAbsVy")==0) return MaxAbsVyEnum;
    877          else stage=8;
    878    }
    879    if(stage==8){
    880               if (strcmp(name,"MaxAbsVz")==0) return MaxAbsVzEnum;
     885              else if (strcmp(name,"MaxAbsVz")==0) return MaxAbsVzEnum;
    881886              else if (strcmp(name,"MaxDivergence")==0) return MaxDivergenceEnum;
    882887              else if (strcmp(name,"MaxVel")==0) return MaxVelEnum;
     
    993998              else if (strcmp(name,"Outputdefinition81")==0) return Outputdefinition81Enum;
    994999              else if (strcmp(name,"Outputdefinition82")==0) return Outputdefinition82Enum;
    995               else if (strcmp(name,"Outputdefinition83")==0) return Outputdefinition83Enum;
     1000         else stage=9;
     1001   }
     1002   if(stage==9){
     1003              if (strcmp(name,"Outputdefinition83")==0) return Outputdefinition83Enum;
    9961004              else if (strcmp(name,"Outputdefinition84")==0) return Outputdefinition84Enum;
    9971005              else if (strcmp(name,"Outputdefinition85")==0) return Outputdefinition85Enum;
    9981006              else if (strcmp(name,"Outputdefinition86")==0) return Outputdefinition86Enum;
    9991007              else if (strcmp(name,"Outputdefinition87")==0) return Outputdefinition87Enum;
    1000          else stage=9;
    1001    }
    1002    if(stage==9){
    1003               if (strcmp(name,"Outputdefinition88")==0) return Outputdefinition88Enum;
     1008              else if (strcmp(name,"Outputdefinition88")==0) return Outputdefinition88Enum;
    10041009              else if (strcmp(name,"Outputdefinition89")==0) return Outputdefinition89Enum;
    10051010              else if (strcmp(name,"Outputdefinition8")==0) return Outputdefinition8Enum;
     
    11161121              else if (strcmp(name,"ThermalSpctemperature")==0) return ThermalSpctemperatureEnum;
    11171122              else if (strcmp(name,"ThicknessErrorEstimator")==0) return ThicknessErrorEstimatorEnum;
    1118               else if (strcmp(name,"TotalFloatingBmb")==0) return TotalFloatingBmbEnum;
     1123         else stage=10;
     1124   }
     1125   if(stage==10){
     1126              if (strcmp(name,"TotalFloatingBmb")==0) return TotalFloatingBmbEnum;
    11191127              else if (strcmp(name,"TotalFloatingBmbScaled")==0) return TotalFloatingBmbScaledEnum;
    11201128              else if (strcmp(name,"TotalGroundedBmb")==0) return TotalGroundedBmbEnum;
    11211129              else if (strcmp(name,"TotalGroundedBmbScaled")==0) return TotalGroundedBmbScaledEnum;
    11221130              else if (strcmp(name,"TotalSmb")==0) return TotalSmbEnum;
    1123          else stage=10;
    1124    }
    1125    if(stage==10){
    1126               if (strcmp(name,"TotalSmbScaled")==0) return TotalSmbScaledEnum;
     1131              else if (strcmp(name,"TotalSmbScaled")==0) return TotalSmbScaledEnum;
    11271132              else if (strcmp(name,"TransientArrayParam")==0) return TransientArrayParamEnum;
    11281133              else if (strcmp(name,"TransientInput")==0) return TransientInputEnum;
  • issm/trunk-jpl/src/m/classes/basalforcingspico.m

    r22749 r22918  
    1313                farocean_temperature      = NaN;
    1414                farocean_salinity         = NaN;
     15                isplume                   = NaN;
    1516                geothermalflux            = NaN;
    1617                groundedice_melting_rate  = NaN;
     
    3839                                        disp('      no maximum number of boxes set, setting value to 5');
    3940                   end
    40 
    4141                        if isnan(self.overturning_coeff)
    4242                                self.overturning_coeff = 1e6; %m^3/s
    4343                                disp('      no overturning strength set, setting value to 1e6');
    4444                        end
    45 
    4645                        if isnan(self.gamma_T)
    4746                                self.gamma_T = 2e-5; %m/s
     
    5655                function self = setdefaultparameters(self) % {{{
    5756
    58                         self.maxboxcount = 5;
     57                        self.maxboxcount       = 5;
    5958                        self.overturning_coeff = 1e6; %m^3/s
    60                         self.gamma_T = 2e-5; %m/s
     59                        self.gamma_T           = 2e-5; %m/s
     60                        self.isplume           = false;
    6161
    6262                end % }}}
     
    7070                                md = checkfield(md,'fieldname','basalforcings.farocean_temperature','NaN',1,'Inf',1,'>',0,'size',[md.basalforcings.num_basins+1 NaN]);
    7171                                md = checkfield(md,'fieldname','basalforcings.farocean_salinity','NaN',1,'Inf',1,'>',0,'size',[md.basalforcings.num_basins+1 NaN]);
     72                                md = checkfield(md,'fieldname','basalforcings.isplume','values',[0 1]);
    7273                                md = checkfield(md,'fieldname','basalforcings.geothermalflux','NaN',1,'Inf',1,'>=',0,'timeseries',1);
    7374                                md = checkfield(md,'fieldname','basalforcings.groundedice_melting_rate','NaN',1,'Inf',1,'timeseries',1);
     
    7980                        fielddisplay(self,'basin_id','basin number assigned to each node [unitless]');
    8081                        fielddisplay(self,'maxboxcount','maximum number of boxes initialized under all ice shelves');
    81                         fielddisplay(self,'overturning_coeff','Overturning strength [m^3/s]');
    82                         fielddisplay(self,'gamma_T','Turbulent temperature exchange velocity [m/s]');
     82                        fielddisplay(self,'overturning_coeff','overturning strength [m^3/s]');
     83                        fielddisplay(self,'gamma_T','turbulent temperature exchange velocity [m/s]');
    8384                        fielddisplay(self,'farocean_temperature','depth averaged ocean temperature in front of the ice shelf for basin i [K]');
    8485                        fielddisplay(self,'farocean_salinity','depth averaged ocean salinity in front of the ice shelf for basin i [psu]');
     86                        fielddisplay(self,'isplume','boolean to use buoyant plume melt rate parameterization from Lazeroms et al., 2018 (default false)');
    8587                        fielddisplay(self,'geothermalflux','geothermal heat flux [W/m^2]');
    8688                        fielddisplay(self,'groundedice_melting_rate','basal melting rate (positive if melting) [m/yr]');
     
    98100                        WriteData(fid,prefix,'object',self,'fieldname','farocean_temperature','format','DoubleMat','name','md.basalforcings.farocean_temperature','timeserieslength',md.basalforcings.num_basins+1,'yts',md.constants.yts);
    99101                        WriteData(fid,prefix,'object',self,'fieldname','farocean_salinity','format','DoubleMat','name','md.basalforcings.farocean_salinity','timeserieslength',md.basalforcings.num_basins+1,'yts',md.constants.yts);
    100                         %WriteData(fid,prefix,'object',self,'fieldname','basin_id','format','DoubleMat','name','md.basalforcings.basin_id','mattype',2);
    101102                        WriteData(fid,prefix,'object',self,'fieldname','basin_id','data',self.basin_id-1,'name','md.basalforcings.basin_id','format','IntMat','mattype',2);   %Change to 0-indexing
     103                        WriteData(fid,prefix,'object',self,'fieldname','isplume','format','Boolean');
    102104                        WriteData(fid,prefix,'object',self,'fieldname','geothermalflux','format','DoubleMat','name','md.basalforcings.geothermalflux','mattype',1,'timeserieslength',md.mesh.numberofelements+1,'yts',md.constants.yts);
    103105                        WriteData(fid,prefix,'object',self,'fieldname','groundedice_melting_rate','format','DoubleMat','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1,'yts',md.constants.yts);
  • issm/trunk-jpl/test/NightlyRun/test470.m

    r22752 r22918  
    2424md.basalforcings.farocean_salinity    = [31 32 33; 34 35 36; 0.5 1 1.5]; %PSU               
    2525md.basalforcings.maxboxcount=5;
     26md.basalforcings.isplume = 0;
    2627
    2728%Boundary conditions:
Note: See TracChangeset for help on using the changeset viewer.