Changeset 26810
- Timestamp:
- 01/25/22 05:41:26 (3 years ago)
- Location:
- issm/trunk-jpl
- Files:
-
- 13 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/classes/Elements/Element.cpp
r26789 r26810 2256 2256 xDelete<IssmDouble>(depths); 2257 2257 2258 }/*}}}*/ 2259 void 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); 2258 2295 }/*}}}*/ 2259 2296 void Element::LinearFloatingiceMeltingRate(){/*{{{*/ -
issm/trunk-jpl/src/c/classes/Elements/Element.h
r26800 r26810 153 153 bool IsLandInElement(); 154 154 void Ismip6FloatingiceMeltingRate(); 155 void LapseRateBasinSMB(IssmDouble* lapseratepos, IssmDouble* lapserateneg,IssmDouble* refelevation); 155 156 void LinearFloatingiceMeltingRate(); 156 157 void SpatialLinearFloatingiceMeltingRate(); -
issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp
r26800 r26810 412 412 parameters->AddObject(new DoubleMatParam(SmbPhiEnum,transparam,M,N)); 413 413 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; 415 424 case SMBgembEnum: 416 425 parameters->AddObject(iomodel->CopyConstantObject("md.smb.aIce",SmbAIceEnum)); -
issm/trunk-jpl/src/c/modules/SurfaceMassBalancex/SurfaceMassBalancex.cpp
r26751 r26810 202 202 femmodel->parameters->FindParam(&arorder,SmbAutoregressiveOrderEnum); 203 203 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; 207 210 208 211 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); 212 218 213 219 femmodel->parameters->FindParam(&isstochastic,StochasticForcingIsStochasticForcingEnum); … … 228 234 for(Object* &object:femmodel->elements->objects){ 229 235 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 } 232 241 233 242 /*Cleanup*/ … … 235 244 xDelete<IssmDouble>(beta1); 236 245 xDelete<IssmDouble>(phi); 246 xDelete<IssmDouble>(lapseratepos); 247 xDelete<IssmDouble>(lapserateneg); 248 xDelete<IssmDouble>(refelevation); 237 249 }/*}}}*/ 238 250 void Delta18oParameterizationx(FemModel* femmodel){/*{{{*/ -
issm/trunk-jpl/src/c/shared/Enum/Enum.vim
r26800 r26810 421 421 syn keyword cConstant StochasticForcingNumFieldsEnum 422 422 syn keyword cConstant StochasticForcingRandomflagEnum 423 syn keyword cConstant RotationalPolarMoiEnum424 423 syn keyword cConstant SolidearthSettingsReltolEnum 425 424 syn keyword cConstant SolidearthSettingsSelfAttractionEnum … … 477 476 syn keyword cConstant SmbIsturbulentfluxEnum 478 477 syn keyword cConstant SmbKEnum 478 syn keyword cConstant SmbLapseRateNegEnum 479 syn keyword cConstant SmbLapseRatePosEnum 479 480 syn keyword cConstant SmbNumBasinsEnum 480 481 syn keyword cConstant SmbNumRequestedOutputsEnum … … 482 483 syn keyword cConstant SmbPhiEnum 483 484 syn keyword cConstant SmbRdlEnum 485 syn keyword cConstant SmbRefElevationEnum 484 486 syn keyword cConstant SmbRequestedOutputsEnum 485 487 syn keyword cConstant SmbRlapsEnum -
issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
r26800 r26810 470 470 SmbIsturbulentfluxEnum, 471 471 SmbKEnum, 472 SmbLapseRateNegEnum, 473 SmbLapseRatePosEnum, 472 474 SmbNumBasinsEnum, 473 475 SmbNumRequestedOutputsEnum, … … 475 477 SmbPhiEnum, 476 478 SmbRdlEnum, 479 SmbRefElevationEnum, 477 480 SmbRequestedOutputsEnum, 478 481 SmbRlapsEnum, -
issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
r26800 r26810 478 478 case SmbIsturbulentfluxEnum : return "SmbIsturbulentflux"; 479 479 case SmbKEnum : return "SmbK"; 480 case SmbLapseRateNegEnum : return "SmbLapseRateNeg"; 481 case SmbLapseRatePosEnum : return "SmbLapseRatePos"; 480 482 case SmbNumBasinsEnum : return "SmbNumBasins"; 481 483 case SmbNumRequestedOutputsEnum : return "SmbNumRequestedOutputs"; … … 483 485 case SmbPhiEnum : return "SmbPhi"; 484 486 case SmbRdlEnum : return "SmbRdl"; 487 case SmbRefElevationEnum : return "SmbRefElevation"; 485 488 case SmbRequestedOutputsEnum : return "SmbRequestedOutputs"; 486 489 case SmbRlapsEnum : return "SmbRlaps"; -
issm/trunk-jpl/src/c/shared/Enum/Enumjl.vim
r26800 r26810 469 469 syn keyword juliaConstC SmbIsturbulentfluxEnum 470 470 syn keyword juliaConstC SmbKEnum 471 syn keyword juliaConstC SmbLapseRateNegEnum 472 syn keyword juliaConstC SmbLapseRatePosEnum 471 473 syn keyword juliaConstC SmbNumBasinsEnum 472 474 syn keyword juliaConstC SmbNumRequestedOutputsEnum … … 474 476 syn keyword juliaConstC SmbPhiEnum 475 477 syn keyword juliaConstC SmbRdlEnum 478 syn keyword juliaConstC SmbRefElevationEnum 476 479 syn keyword juliaConstC SmbRequestedOutputsEnum 477 480 syn keyword juliaConstC SmbRlapsEnum -
issm/trunk-jpl/src/m/classes/SMBautoregression.m
r26751 r26810 14 14 phi = NaN; 15 15 basin_id = NaN; 16 lapserate_pos = NaN; 17 lapserate_neg = NaN; 18 refelevation = NaN; 16 19 steps_per_step = 1; 17 20 averaging = 0; … … 70 73 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 71 74 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 72 86 end 73 87 md = checkfield(md,'fieldname','smb.steps_per_step','>=',1,'numel',[1]); … … 85 99 fielddisplay(self,'ar_timestep','time resolution of the autoregressive model [yr]'); 86 100 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]'); 87 104 fielddisplay(self, 'steps_per_step', 'number of smb steps per time step'); 88 105 fielddisplay(self, 'averaging', 'averaging methods from short to long steps'); … … 97 114 yts=md.constants.yts; 98 115 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 99 143 WriteData(fid,prefix,'name','md.smb.model','data',55,'format','Integer'); 100 144 WriteData(fid,prefix,'object',self,'class','smb','fieldname','num_basins','format','Integer'); … … 106 150 WriteData(fid,prefix,'object',self,'class','smb','fieldname','beta1','format','DoubleMat','name','md.smb.beta1','scale',1./(yts^2),'yts',yts); 107 151 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'); 108 155 WriteData(fid,prefix,'object',self,'fieldname','steps_per_step','format','Integer'); 109 156 WriteData(fid,prefix,'object',self,'fieldname','averaging','format','Integer'); -
issm/trunk-jpl/src/m/classes/SMBautoregression.py
r26751 r26810 5 5 from project3d import * 6 6 from WriteData import * 7 7 from GetAreas import * 8 8 9 9 class SMBautoregression(object): … … 23 23 self.phi = np.nan 24 24 self.basin_id = np.nan 25 self.lapserate_pos = np.nan 26 self.lapserate_neg = np.nan 27 self.refelevation = np.nan 25 28 self.steps_per_step = 1 26 29 self.averaging = 0 … … 44 47 s += '{}\n'.format(fielddisplay(self, 'ar_timestep', 'time resolution of the autoregressive model [yr]')) 45 48 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]')) 48 52 s += '{}\n'.format(fielddisplay(self, 'steps_per_step', 'number of smb steps per time step')) 49 53 s += '{}\n'.format(fielddisplay(self, 'averaging', 'averaging methods from short to long steps')) … … 97 101 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 98 102 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 99 110 md = checkfield(md, 'fieldname', 'smb.steps_per_step', '>=', 1, 'numel', [1]) 100 111 md = checkfield(md, 'fieldname', 'smb.averaging', 'numel', [1], 'values', [0, 1, 2]) … … 105 116 def marshall(self, prefix, md, fid): # {{{ 106 117 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') 107 139 108 140 WriteData(fid, prefix, 'name', 'md.smb.model', 'data', 55, 'format', 'Integer') … … 115 147 WriteData(fid, prefix, 'object', self, 'class', 'smb', 'fieldname', 'beta1', 'format', 'DoubleMat', 'name', 'md.smb.beta1', 'scale', 1 / (yts ** 2), 'yts', yts) 116 148 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') 117 152 WriteData(fid, prefix, 'object', self, 'fieldname', 'steps_per_step', 'format', 'Integer') 118 153 WriteData(fid, prefix, 'object', self, 'fieldname', 'averaging', 'format', 'Integer') -
issm/trunk-jpl/test/NightlyRun/test257.m
r26615 r26810 45 45 md.smb.ar_timestep = 2.0; %timestep of the autoregressive model [yr] 46 46 md.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]]; 47 md.smb.lapserate_pos = [0.01,0.0,0.0]; 48 md.smb.lapserate_neg = [0.01,0.0,0.0]; 47 49 48 50 %Stochastic forcing -
issm/trunk-jpl/test/NightlyRun/test257.py
r26639 r26810 50 50 md.smb.ar_timestep = 2.0 #timestep of the autoregressive model [yr] 51 51 md.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]]) 52 md.smb.lapserate_pos = np.array([[0.01,0,0]]) 53 md.smb.lapserate_neg = np.array([[0.01,0,0]]) 52 54 53 55 # Stochastic forcing
Note:
See TracChangeset
for help on using the changeset viewer.