Changeset 26810


Ignore:
Timestamp:
01/25/22 05:41:26 (3 years ago)
Author:
vverjans
Message:

NEW: added SMB lapse rate computation per basin to SMBautoregression

Location:
issm/trunk-jpl
Files:
13 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk-jpl/src/c/classes/Elements/Element.cpp

    r26789 r26810  
    22562256        xDelete<IssmDouble>(depths);
    22572257
     2258}/*}}}*/
     2259void       Element::LapseRateBasinSMB(IssmDouble* lapseratepos, IssmDouble* lapserateneg,IssmDouble* refelevation){/*{{{*/
     2260
     2261        /*Variable declaration*/
     2262   const int numvertices = this->GetNumberOfVertices();
     2263   bool isadjustsmb = true;
     2264        int basinid;
     2265   IssmDouble ela,refelevation_b,lapseratepos_b,lapserateneg_b;
     2266   IssmDouble* surfacelist = xNew<IssmDouble>(numvertices);
     2267   IssmDouble* smblist     = xNew<IssmDouble>(numvertices);
     2268
     2269   /*Retrieve SMB values non-adjusted for SMB lapse rate*/
     2270   this->GetInputListOnVertices(smblist,SmbMassBalanceEnum);
     2271   /*Get basin-specific parameters of the element*/
     2272   this->GetInputValue(&basinid,SmbBasinsIdEnum);
     2273   refelevation_b = refelevation[basinid];
     2274   lapseratepos_b = lapseratepos[basinid];
     2275   lapserateneg_b = lapserateneg[basinid];
     2276   /*Get surface elevation on vertices*/
     2277   this->GetInputListOnVertices(surfacelist,SurfaceEnum);
     2278
     2279   for(int v=0;v<numvertices;v++){
     2280      /*Find ELA*/
     2281                if(smblist[v]>=0 && lapseratepos_b!=0)     ela = refelevation_b-smblist[v]/lapseratepos_b;
     2282      else if(smblist[v]<0 && lapserateneg_b!=0) ela = refelevation_b-smblist[v]/lapserateneg_b;
     2283                /*Lapse rate is zero: SMB not adjusted*/
     2284                else                                       isadjustsmb = false;
     2285                /*Adjust SMB value*/
     2286      if(isadjustsmb) smblist[v] = lapseratepos_b*max(surfacelist[v]-ela,0.0)+lapserateneg_b*min(surfacelist[v]-ela,0.0);
     2287        }
     2288
     2289   /*Add input to element*/
     2290   this->AddInput(SmbMassBalanceEnum,smblist,P1Enum);
     2291
     2292   /*Cleanup*/
     2293   xDelete<IssmDouble>(surfacelist);
     2294   xDelete<IssmDouble>(smblist);
    22582295}/*}}}*/
    22592296void       Element::LinearFloatingiceMeltingRate(){/*{{{*/
  • issm/trunk-jpl/src/c/classes/Elements/Element.h

    r26800 r26810  
    153153                bool               IsLandInElement();
    154154                void               Ismip6FloatingiceMeltingRate();
     155                void               LapseRateBasinSMB(IssmDouble* lapseratepos, IssmDouble* lapserateneg,IssmDouble* refelevation);
    155156                void               LinearFloatingiceMeltingRate();
    156157                void               SpatialLinearFloatingiceMeltingRate();
  • issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp

    r26800 r26810  
    412412         parameters->AddObject(new DoubleMatParam(SmbPhiEnum,transparam,M,N));
    413413         xDelete<IssmDouble>(transparam);
    414          break;
     414         iomodel->FetchData(&transparam,&M,&N,"md.smb.lapserate_pos");
     415         parameters->AddObject(new DoubleVecParam(SmbLapseRatePosEnum,transparam,N));
     416         xDelete<IssmDouble>(transparam);
     417         iomodel->FetchData(&transparam,&M,&N,"md.smb.lapserate_neg");
     418         parameters->AddObject(new DoubleVecParam(SmbLapseRateNegEnum,transparam,N));
     419         xDelete<IssmDouble>(transparam);
     420                        iomodel->FetchData(&transparam,&M,&N,"md.smb.refelevation");
     421         parameters->AddObject(new DoubleVecParam(SmbRefElevationEnum,transparam,N));
     422         xDelete<IssmDouble>(transparam);
     423                        break;
    415424                case SMBgembEnum:
    416425                        parameters->AddObject(iomodel->CopyConstantObject("md.smb.aIce",SmbAIceEnum));
  • issm/trunk-jpl/src/c/modules/SurfaceMassBalancex/SurfaceMassBalancex.cpp

    r26751 r26810  
    202202   femmodel->parameters->FindParam(&arorder,SmbAutoregressiveOrderEnum);
    203203   IssmDouble tinit_ar;
    204    IssmDouble* beta0      = NULL;
    205    IssmDouble* beta1      = NULL;
    206    IssmDouble* phi        = NULL;
     204   IssmDouble* beta0        = NULL;
     205   IssmDouble* beta1        = NULL;
     206   IssmDouble* phi          = NULL;
     207   IssmDouble* lapseratepos = NULL;
     208   IssmDouble* lapserateneg = NULL;
     209   IssmDouble* refelevation = NULL;
    207210
    208211   femmodel->parameters->FindParam(&tinit_ar,SmbAutoregressionInitialTimeEnum);
    209    femmodel->parameters->FindParam(&beta0,&M,SmbBeta0Enum);    _assert_(M==numbasins);
    210    femmodel->parameters->FindParam(&beta1,&M,SmbBeta1Enum);    _assert_(M==numbasins);
    211    femmodel->parameters->FindParam(&phi,&M,&Nphi,SmbPhiEnum);  _assert_(M==numbasins); _assert_(Nphi==arorder);
     212   femmodel->parameters->FindParam(&beta0,&M,SmbBeta0Enum);               _assert_(M==numbasins);
     213   femmodel->parameters->FindParam(&beta1,&M,SmbBeta1Enum);               _assert_(M==numbasins);
     214   femmodel->parameters->FindParam(&phi,&M,&Nphi,SmbPhiEnum);             _assert_(M==numbasins); _assert_(Nphi==arorder);
     215   femmodel->parameters->FindParam(&lapseratepos,&M,SmbLapseRatePosEnum); _assert_(M==numbasins);
     216   femmodel->parameters->FindParam(&lapserateneg,&M,SmbLapseRateNegEnum); _assert_(M==numbasins);
     217   femmodel->parameters->FindParam(&refelevation,&M,SmbRefElevationEnum); _assert_(M==numbasins);
    212218
    213219   femmodel->parameters->FindParam(&isstochastic,StochasticForcingIsStochasticForcingEnum);
     
    228234   for(Object* &object:femmodel->elements->objects){
    229235      Element* element = xDynamicCast<Element*>(object);
    230       element->Autoregression(isstepforar,arorder,telapsed_ar,beta0,beta1,phi,issmbstochastic,SMBautoregressionEnum);
    231    }
     236      /*Compute autoregression*/
     237                element->Autoregression(isstepforar,arorder,telapsed_ar,beta0,beta1,phi,issmbstochastic,SMBautoregressionEnum);
     238                /*Compute lapse rate adjustment*/
     239                element->LapseRateBasinSMB(lapseratepos,lapserateneg,refelevation);
     240        }
    232241
    233242   /*Cleanup*/
     
    235244   xDelete<IssmDouble>(beta1);
    236245   xDelete<IssmDouble>(phi);
     246   xDelete<IssmDouble>(lapseratepos);
     247   xDelete<IssmDouble>(lapserateneg);
     248   xDelete<IssmDouble>(refelevation);
    237249}/*}}}*/
    238250void Delta18oParameterizationx(FemModel* femmodel){/*{{{*/
  • issm/trunk-jpl/src/c/shared/Enum/Enum.vim

    r26800 r26810  
    421421syn keyword cConstant StochasticForcingNumFieldsEnum
    422422syn keyword cConstant StochasticForcingRandomflagEnum
    423 syn keyword cConstant RotationalPolarMoiEnum
    424423syn keyword cConstant SolidearthSettingsReltolEnum
    425424syn keyword cConstant SolidearthSettingsSelfAttractionEnum
     
    477476syn keyword cConstant SmbIsturbulentfluxEnum
    478477syn keyword cConstant SmbKEnum
     478syn keyword cConstant SmbLapseRateNegEnum
     479syn keyword cConstant SmbLapseRatePosEnum
    479480syn keyword cConstant SmbNumBasinsEnum
    480481syn keyword cConstant SmbNumRequestedOutputsEnum
     
    482483syn keyword cConstant SmbPhiEnum
    483484syn keyword cConstant SmbRdlEnum
     485syn keyword cConstant SmbRefElevationEnum
    484486syn keyword cConstant SmbRequestedOutputsEnum
    485487syn keyword cConstant SmbRlapsEnum
  • issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h

    r26800 r26810  
    470470        SmbIsturbulentfluxEnum,
    471471        SmbKEnum,
     472        SmbLapseRateNegEnum,
     473   SmbLapseRatePosEnum,
    472474        SmbNumBasinsEnum,
    473475        SmbNumRequestedOutputsEnum,
     
    475477        SmbPhiEnum,
    476478        SmbRdlEnum,
     479        SmbRefElevationEnum,
    477480        SmbRequestedOutputsEnum,
    478481        SmbRlapsEnum,
  • issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp

    r26800 r26810  
    478478                case SmbIsturbulentfluxEnum : return "SmbIsturbulentflux";
    479479                case SmbKEnum : return "SmbK";
     480                case SmbLapseRateNegEnum : return "SmbLapseRateNeg";
     481                case SmbLapseRatePosEnum : return "SmbLapseRatePos";
    480482                case SmbNumBasinsEnum : return "SmbNumBasins";
    481483                case SmbNumRequestedOutputsEnum : return "SmbNumRequestedOutputs";
     
    483485                case SmbPhiEnum : return "SmbPhi";
    484486                case SmbRdlEnum : return "SmbRdl";
     487                case SmbRefElevationEnum : return "SmbRefElevation";
    485488                case SmbRequestedOutputsEnum : return "SmbRequestedOutputs";
    486489                case SmbRlapsEnum : return "SmbRlaps";
  • issm/trunk-jpl/src/c/shared/Enum/Enumjl.vim

    r26800 r26810  
    469469syn keyword juliaConstC SmbIsturbulentfluxEnum
    470470syn keyword juliaConstC SmbKEnum
     471syn keyword juliaConstC SmbLapseRateNegEnum
     472syn keyword juliaConstC SmbLapseRatePosEnum
    471473syn keyword juliaConstC SmbNumBasinsEnum
    472474syn keyword juliaConstC SmbNumRequestedOutputsEnum
     
    474476syn keyword juliaConstC SmbPhiEnum
    475477syn keyword juliaConstC SmbRdlEnum
     478syn keyword juliaConstC SmbRefElevationEnum
    476479syn keyword juliaConstC SmbRequestedOutputsEnum
    477480syn keyword juliaConstC SmbRlapsEnum
  • issm/trunk-jpl/src/m/classes/SMBautoregression.m

    r26751 r26810  
    1414                phi               = NaN;
    1515                basin_id          = NaN;
     16                lapserate_pos     = NaN;
     17                lapserate_neg     = NaN;
     18                refelevation      = NaN;
    1619                steps_per_step    = 1;
    1720                averaging         = 0;
     
    7073                                md = checkfield(md,'fieldname','smb.ar_timestep','numel',1,'NaN',1,'Inf',1,'>=',md.timestepping.time_step); %autoregression time step cannot be finer than ISSM timestep
    7174                                md = checkfield(md,'fieldname','smb.phi','NaN',1,'Inf',1,'size',[md.smb.num_basins,md.smb.ar_order]);
     75                       
     76                                if (any(isnan(md.smb.lapserate_pos)==0) || numel(md.smb.lapserate_pos)>1)
     77               md = checkfield(md,'fieldname','smb.lapserate_pos','NaN',1,'Inf',1,'size',[1,md.smb.num_basins],'numel',md.smb.num_basins);
     78            end
     79                                if (any(isnan(md.smb.lapserate_neg)==0) || numel(md.smb.lapserate_neg)>1)
     80               md = checkfield(md,'fieldname','smb.lapserate_neg','NaN',1,'Inf',1,'size',[1,md.smb.num_basins],'numel',md.smb.num_basins);
     81            end
     82                                if (any(isnan(md.smb.refelevation)==0) || numel(md.smb.refelevation)>1)
     83                                        md = checkfield(md,'fieldname','smb.refelevation','NaN',1,'Inf',1,'>=',0,'size',[1,md.smb.num_basins],'numel',md.smb.num_basins);
     84                                end
     85
    7286                        end
    7387                        md = checkfield(md,'fieldname','smb.steps_per_step','>=',1,'numel',[1]);
     
    8599                        fielddisplay(self,'ar_timestep','time resolution of the autoregressive model [yr]');
    86100                        fielddisplay(self,'phi','basin-specific vectors of lag coefficients [unitless]');
     101                        fielddisplay(self,'lapserate_pos','basin-specific SMB lapse rates applied in range of SMB>=0 [m ice eq yr^-1 m^-1] (default: no lapse rate)');
     102                        fielddisplay(self,'lapserate_neg','basin-specific SMB lapse rates applied in range of SMB<0 [m ice eq yr^-1 m^-1] (default: no lapse rate');
     103                        fielddisplay(self,'refelevation','basin-specific reference elevations on which SMB lapse rates are applied (default: basin mean elevation) [m]');
    87104                        fielddisplay(self, 'steps_per_step', 'number of smb steps per time step');
    88105                        fielddisplay(self, 'averaging', 'averaging methods from short to long steps');
     
    97114                        yts=md.constants.yts;
    98115
     116                        templapserate_pos = md.smb.lapserate_pos;
     117                        templapserate_neg = md.smb.lapserate_neg;
     118                        temprefelevation  = md.smb.refelevation;
     119                        if(any(isnan(md.smb.lapserate_pos)))
     120                                templapserate_pos = zeros(1,md.smb.num_basins);
     121                                disp('      smb.lapserate_pos not specified: set to 0');
     122                        end
     123                        if(any(isnan(md.smb.lapserate_neg)))
     124            templapserate_neg = zeros(1,md.smb.num_basins);
     125            disp('      smb.lapserate_neg not specified: set to 0');
     126         end
     127                        if(any(isnan(md.smb.refelevation)))
     128                                temprefelevation = zeros(1,md.smb.num_basins);
     129                                areas = GetAreas(md.mesh.elements,md.mesh.x,md.mesh.y);
     130                                for ii=1:md.smb.num_basins
     131                                        indices = find(md.smb.basin_id==ii);
     132                                        elemsh  = zeros(numel(indices),1);
     133                                        for jj=1:numel(indices)
     134                                                elemsh(jj) = mean(md.geometry.surface(md.mesh.elements(indices(jj),:)));
     135                                        end
     136                                        temprefelevation(ii) = sum(areas(indices).*elemsh)/sum(areas(indices));
     137                                end
     138                                if(any([templapserate_pos,templapserate_neg])~=0)
     139                                        disp('      smb.refelevation not specified: Reference elevations set to mean surface elevation of basins');
     140                                end
     141                        end
     142
    99143                        WriteData(fid,prefix,'name','md.smb.model','data',55,'format','Integer');
    100144                        WriteData(fid,prefix,'object',self,'class','smb','fieldname','num_basins','format','Integer');
     
    106150                        WriteData(fid,prefix,'object',self,'class','smb','fieldname','beta1','format','DoubleMat','name','md.smb.beta1','scale',1./(yts^2),'yts',yts);
    107151                        WriteData(fid,prefix,'object',self,'class','smb','fieldname','phi','format','DoubleMat','name','md.smb.phi','yts',yts);
     152                        WriteData(fid,prefix,'data',templapserate_pos,'format','DoubleMat','name','md.smb.lapserate_pos','scale',1./yts,'yts',yts);
     153                        WriteData(fid,prefix,'data',templapserate_neg,'format','DoubleMat','name','md.smb.lapserate_neg','scale',1./yts,'yts',yts);
     154                        WriteData(fid,prefix,'data',temprefelevation,'format','DoubleMat','name','md.smb.refelevation');
    108155                        WriteData(fid,prefix,'object',self,'fieldname','steps_per_step','format','Integer');
    109156                        WriteData(fid,prefix,'object',self,'fieldname','averaging','format','Integer');
  • issm/trunk-jpl/src/m/classes/SMBautoregression.py

    r26751 r26810  
    55from project3d import *
    66from WriteData import *
    7 
     7from GetAreas import *
    88
    99class SMBautoregression(object):
     
    2323        self.phi = np.nan
    2424        self.basin_id = np.nan
     25        self.lapserate_pos = np.nan
     26        self.lapserate_neg = np.nan
     27        self.refelevation = np.nan
    2528        self.steps_per_step = 1
    2629        self.averaging = 0
     
    4447        s += '{}\n'.format(fielddisplay(self, 'ar_timestep', 'time resolution of the autoregressive model [yr]'))
    4548        s += '{}\n'.format(fielddisplay(self, 'phi', 'basin-specific vectors of lag coefficients [unitless]'))
    46         s += '{}\n'.format(fielddisplay(self, 'covmat', 'inter-basin covariance matrix for multivariate normal noise at each time step [m^2 ice eq. yr^(-2)]'))
    47         s += '{}\n'.format(fielddisplay(self, 'randomflag', 'whether to apply real randomness (true) or pseudo-randomness with fixed seed (false)'))
     49        s += '{}\n'.format(fielddisplay(self, 'lapserate_pos', 'basin-specific SMB lapse rates applied in range of SMB>=0 [m ice eq yr^-1 m^-1] (default: no lapse rate)'))
     50        s += '{}\n'.format(fielddisplay(self, 'lapserate_neg', 'basin-specific SMB lapse rates applied in range of SMB<0 [m ice eq yr^-1 m^-1] (default: no lapse rate)'))
     51        s += '{}\n'.format(fielddisplay(self, 'refelevation', 'basin-specific reference elevations on which SMB lapse rates are applied (default: basin mean elevation) [m]'))
    4852        s += '{}\n'.format(fielddisplay(self, 'steps_per_step', 'number of smb steps per time step'))
    4953        s += '{}\n'.format(fielddisplay(self, 'averaging', 'averaging methods from short to long steps'))
     
    97101            md = checkfield(md, 'fieldname', 'smb.ar_timestep', 'numel', 1, 'NaN', 1, 'Inf', 1, '>=', md.timestepping.time_step) # Autoregression time step cannot be finer than ISSM timestep
    98102            md = checkfield(md, 'fieldname', 'smb.phi', 'NaN', 1, 'Inf', 1, 'size', [md.smb.num_basins, md.smb.ar_order])
     103            if(np.any(np.isnan(md.smb.lapserate_pos)==False) or np.size(md.smb.lapserate_pos)>1):
     104                md = checkfield(md, 'fieldname', 'smb.lapserate_pos', 'NaN', 1, 'Inf', 1, 'size', [1, md.smb.num_basins], 'numel', md.smb.num_basins)
     105            if(np.any(np.isnan(md.smb.lapserate_neg)==False) or np.size(md.smb.lapserate_neg)>1):
     106                md = checkfield(md, 'fieldname', 'smb.lapserate_neg', 'NaN', 1, 'Inf', 1, 'size', [1, md.smb.num_basins], 'numel', md.smb.num_basins)
     107            if(np.any(np.isnan(md.smb.refelevation)==False) or np.size(md.smb.refelevation)>1):
     108                md = checkfield(md, 'fieldname', 'smb.refelevation', 'NaN', 1, 'Inf', 1, '>=', 0, 'size', [1, md.smb.num_basins], 'numel', md.smb.num_basins)
     109
    99110        md = checkfield(md, 'fieldname', 'smb.steps_per_step', '>=', 1, 'numel', [1])
    100111        md = checkfield(md, 'fieldname', 'smb.averaging', 'numel', [1], 'values', [0, 1, 2])
     
    105116    def marshall(self, prefix, md, fid):  # {{{
    106117        yts = md.constants.yts
     118
     119        templapserate_pos = np.copy(md.smb.lapserate_pos)
     120        templapserate_neg = np.copy(md.smb.lapserate_neg)
     121        temprefelevation  = np.copy(md.smb.lapserate_neg)
     122        if(np.any(np.isnan(md.smb.lapserate_pos))):
     123            templapserate_pos = np.zeros((md.smb.num_basins))
     124            print('      smb.lapserate_pos not specified: set to 0')
     125        if(np.any(np.isnan(md.smb.lapserate_neg))):
     126            templapserate_neg = np.zeros((md.smb.num_basins))
     127            print('      smb.lapserate_neg not specified: set to 0')
     128        if(np.any(np.isnan(md.smb.refelevation))):
     129            temprefelevation = np.zeros((md.smb.num_basins))
     130            areas = GetAreas(md.mesh.elements, md.mesh.x, md.mesh.y)
     131            for ii in range(int(md.smb.num_basins)):
     132                indices = np.where(md.smb.basin_id==ii)[0]
     133                elemsh  = np.zeros((len(indices)))
     134                for jj in range(len(indices)):
     135                    elemsh[jj] = np.mean(md.geometry.surface[md.mesh.elements[indices[jj,:]]])
     136                temprefelevation[ii] = np.sum(areas[indices]*elemsh)/np.sum(areas[indices])
     137            if(np.any(templapserate_pos!=0) or np.any(templapserate_neg!=0)):
     138                print('      smb.refelevation not specified: Reference elevations set to mean surface elevation of basins')
    107139
    108140        WriteData(fid, prefix, 'name', 'md.smb.model', 'data', 55, 'format', 'Integer')
     
    115147        WriteData(fid, prefix, 'object', self, 'class', 'smb', 'fieldname', 'beta1', 'format', 'DoubleMat', 'name', 'md.smb.beta1', 'scale', 1 / (yts ** 2), 'yts', yts)
    116148        WriteData(fid, prefix, 'object', self, 'class', 'smb', 'fieldname', 'phi', 'format', 'DoubleMat', 'name', 'md.smb.phi', 'yts', yts)
     149        WriteData(fid, prefix, 'data', templapserate_pos, 'name', 'md.smb.lapserate_pos', 'format', 'DoubleMat','scale',1/yts,'yts',yts)
     150        WriteData(fid, prefix, 'data', templapserate_neg, 'name', 'md.smb.lapserate_neg', 'format', 'DoubleMat','scale',1/yts,'yts',yts)
     151        WriteData(fid, prefix, 'data', temprefelevation, 'name', 'md.smb.refelevation', 'format', 'DoubleMat')
    117152        WriteData(fid, prefix, 'object', self, 'fieldname', 'steps_per_step', 'format', 'Integer')
    118153        WriteData(fid, prefix, 'object', self, 'fieldname', 'averaging', 'format', 'Integer')
  • issm/trunk-jpl/test/NightlyRun/test257.m

    r26615 r26810  
    4545md.smb.ar_timestep    = 2.0; %timestep of the autoregressive model [yr]
    4646md.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.lapserate_pos  = [0.01,0.0,0.0];
     48md.smb.lapserate_neg  = [0.01,0.0,0.0];
    4749
    4850%Stochastic forcing
  • issm/trunk-jpl/test/NightlyRun/test257.py

    r26639 r26810  
    5050md.smb.ar_timestep = 2.0  #timestep of the autoregressive model [yr]
    5151md.smb.phi = np.array([[0.2, 0.1, 0.05, 0.01], [0.4, 0.2, -0.2, 0.1], [0.4, -0.4, 0.1, -0.1]])
     52md.smb.lapserate_pos = np.array([[0.01,0,0]])
     53md.smb.lapserate_neg = np.array([[0.01,0,0]])
    5254
    5355# Stochastic forcing
Note: See TracChangeset for help on using the changeset viewer.