Changeset 27513
- Timestamp:
- 01/12/23 14:28:07 (2 years ago)
- Location:
- issm/trunk-jpl/src/m/classes
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/m/classes/SMBsemic.m
r27511 r27513 32 32 33 33 % albedo 34 albedo = 0; % required for first energy balance calculation of SEMIC .35 albedo_snow = 0; % required for ISBA method .34 albedo = 0; % required for first energy balance calculation of SEMIC 35 albedo_snow = 0; % required for ISBA method 36 36 albedo_scheme = 0; 37 37 alb_smax = NaN; … … 138 138 self.ismethod = 0; 139 139 self.requested_outputs={'default'}; 140 end % }}} zo140 end % }}} 141 141 function md = checkconsistency(self,md,solution,analyses) % {{{ 142 142 … … 159 159 160 160 md = checkfield(md,'fieldname','smb.ismethod','numel',1,'values',[0,1]); 161 if self.ismethod == 1 % transient mode .161 if self.ismethod == 1 % transient mode 162 162 md = checkfield(md,'fieldname','smb.desfacElevation','>=',0,'numel',1); 163 163 … … 204 204 205 205 fielddisplay(self,'ismethod','method for calculating SMB with SEMIC. Default version of SEMIC is really slow. 0: steady, 1: transient (default: 0)'); 206 if self.ismethod == 1 % tran isent mode206 if self.ismethod == 1 % transient mode 207 207 fielddisplay(self,'desfacElevation','desertification elevation (default is 2000 m; Vizcaino et al. 2010)'); 208 208 fielddisplay(self,'Tamp','amplitude of diurnal cycle [K]'); … … 219 219 fielddisplay(self,'alb_smax','maximum snow albedo (default: 0.79)'); 220 220 fielddisplay(self,'alb_smin','minimum snow albedo (default: 0.6)'); 221 fielddisplay(self,'albi','background albe odfor bare ice (default: 0.41)');222 fielddisplay(self,'albl','background albe odfor bare land (default: 0.07)');223 end 224 % albe od_scheme - 0: none, 1: slater, 2: isba, 3: denby, 4: alex.221 fielddisplay(self,'albi','background albedo for bare ice (default: 0.41)'); 222 fielddisplay(self,'albl','background albedo for bare land (default: 0.07)'); 223 end 224 % albedo_scheme - 0: none, 1: slater, 2: isba, 3: denby, 4: alex. 225 225 if self.albedo_scheme == 1 226 226 disp(sprintf('\n\tSEMIC snow albedo parameters for Slater et al, (1998).')); … … 234 234 elseif self.albedo_scheme == 2, 235 235 disp(sprintf('\n\tSEMIC snow albedo parameters for ISBA.? where is citation?')); 236 fielddisplay(self,'mcrit','critical melt rate (defau t: 6e-8) [unit: m/sec]');237 fielddisplay(self,'wcrit','critical liquid water content (defau t: 15) [unit: kg/m2]');236 fielddisplay(self,'mcrit','critical melt rate (default: 6e-8) [unit: m/sec]'); 237 fielddisplay(self,'wcrit','critical liquid water content (default: 15) [unit: kg/m2]'); 238 238 fielddisplay(self,'tau_a','dry albedo decline [unit: 1/day]'); 239 239 fielddisplay(self,'tau_f','wet albedo decline [unit: 1/day]'); 240 240 elseif self.albedo_scheme == 3, 241 241 disp(sprintf('\n\tSEMIC snow albedo parameters for Denby et al. (2002 Tellus)')); 242 fielddisplay(self,'mcrit','critical melt rate (defau t: 6e-8) [unit: m/sec]');242 fielddisplay(self,'mcrit','critical melt rate (default: 6e-8) [unit: m/sec]'); 243 243 elseif self.albedo_scheme == 4, 244 244 disp(sprintf('\n\tSEMIC snow albedo parameters for Alex.?')); … … 278 278 WriteData(fid,prefix,'object',self,'class','smb','fieldname','dailytemperature','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1,'yts',yts); 279 279 % TODO: transient mode should be merged with SEMIC developed by Ruckamp et al. (2018). 280 if self.ismethod == 1% transient mode .280 if self.ismethod == 1% transient mode 281 281 WriteData(fid,prefix,'object',self,'class','smb','fieldname','Tamp','format','DoubleMat','mattype',1); 282 282 WriteData(fid,prefix,'object',self,'class','smb','fieldname','mask','format','DoubleMat','mattype',1); … … 287 287 WriteData(fid,prefix,'object',self,'class','smb','fieldname','rcrit','format','Double'); 288 288 289 %albedo ...289 %albedo 290 290 WriteData(fid,prefix,'object',self,'class','smb','fieldname','albedo','format','DoubleMat','mattype',1); 291 291 WriteData(fid,prefix,'object',self,'class','smb','fieldname','albedo_snow','format','DoubleMat','mattype',1); … … 296 296 WriteData(fid,prefix,'object',self,'class','smb','fieldname','alb_smax','format','Double'); 297 297 298 %a bledo parameters for ?298 %albedo parameters for ? 299 299 %for slater 300 300 WriteData(fid,prefix,'object',self,'class','smb','fieldname','tmin','format','Double'); -
issm/trunk-jpl/src/m/classes/SMBsemic.py
r27458 r27513 25 25 self.dailyairhumidity = np.nan 26 26 self.dailytemperature = np.nan 27 self.Tamp = np.nan 28 self.mask = np.nan 29 self.hice = np.nan 30 self.hsnow = np.nan 27 31 self.desfac = 0 32 self.desfacElevation = 0 28 33 self.rlaps = 0 29 34 self.rdl = 0 … … 32 37 self.averaging = 0 33 38 self.requested_outputs = [] 39 40 self.hcrit = 0 41 self.rcrit = 0 42 43 # albedo 44 self.albedo = 0 # required for first energy balance calculation of SEMIC 45 self.albedo_snow = 0 # required for ISBA method 46 self.albedo_scheme = 0 47 self.alb_smax = np.nan 48 self.alb_smin = np.nan 49 self.albi = np.nan 50 self.albl = np.nan 51 52 # albedo parameters depending on albedo_scheme 53 # for slater 54 self.tmin = np.nan 55 self.tmax = np.nan 56 57 # for isba & denby method 58 self.mcrit = np.nan 59 60 # for isba 61 self.tau_a = np.nan 62 self.tau_f = np.nan 63 self.wcrit = np.nan 64 65 # for alex 66 self.tmid = np.nan 67 self.afac = np.nan 68 69 # method 70 self.ismethod = 0 34 71 35 72 if len(args) == 0: … … 57 94 s += '{}\n'.format(fielddisplay(self, 'rdl', 'longwave downward radiation decrease (default is 0.29 [W/m^2/km]; Marty et al. 2002)')) 58 95 s += '{}\n'.format(fielddisplay(self, 's0gcm', 'GCM reference elevation; (default is 0) [m]')) 96 s += '{}\n'.format(fielddisplay(self,'ismethod','method for calculating SMB with SEMIC. Default version of SEMIC is really slow. 0: steady, 1: transient (default: 0)')) 97 if self.ismethod: # transient mode 98 s += '{}\n'.format(fielddisplay(self,'desfacElevation','desertification elevation (default is 2000 m; Vizcaino et al. 2010)')) 99 s += '{}\n'.format(fielddisplay(self,'Tamp','amplitude of diurnal cycle [K]')) 100 s += '{}\n'.format(fielddisplay(self,'albedo','initial albedo [no unit]')) 101 s += '{}\n'.format(fielddisplay(self,'albedo_snow','initial albedo for snow [no unit]')) 102 s += '{}\n'.format(fielddisplay(self,'hice','initial thickness of ice [unit: m]')) 103 s += '{}\n'.format(fielddisplay(self,'hsnow','initial thickness of snow [unit: m]')) 104 s += '{}\n'.format(fielddisplay(self,'mask','masking for albedo. 0: ocean, 1: land, 2: ice (default: 2)')) 105 s += '{}\n'.format(fielddisplay(self,'hcrit','critical snow height for albedo [unit: m]')) 106 s += '{}\n'.format(fielddisplay(self,'rcrit','critical refreezing height for albedo [no unit]')) 107 108 s += '\nSEMIC albedo parameters.\n' 109 s += '{}\n'.format(fielddisplay(self,'albedo_scheme','albedo scheme for SEMIC. 0: none, 1: slater, 2: isba, 3: denby, 4: alex (default is 0)')) 110 s += '{}\n'.format(fielddisplay(self,'alb_smax','maximum snow albedo (default: 0.79)')) 111 s += '{}\n'.format(fielddisplay(self,'alb_smin','minimum snow albedo (default: 0.6)')) 112 s += '{}\n'.format(fielddisplay(self,'albi','background albedo for bare ice (default: 0.41)')) 113 s += '{}\n'.format(fielddisplay(self,'albl','background albedo for bare land (default: 0.07)')) 114 # albedo_scheme - 0: none, 1: slater, 2: isba, 3: denby, 4: alex. 115 if self.albedo_scheme == 1: 116 s += '\n\tSEMIC snow albedo parameters for Slater et al, (1998).\n' 117 s += '\t alb = alb_smax - (alb_smax - alb_smin)*tm^(3.0)\n' 118 s += '\t tm = 1 (tsurf > 273.15 K)\n' 119 s += '\t tm = f*(tsurf-tmin) (tmin <= tsurf < 273.15)\n' 120 s += '\t 0 (tsurf < tmin)\n' 121 s += '\t f = 1/(273.15-tmin)\n' 122 s += '{}\n'.format(fielddisplay(self, 'tmin', 'minimum temperature for which albedo decline become effective. (default: 263.15 K)[unit: K])')) 123 s += '{}\n'.format(fielddisplay(self, 'tmax', 'maxmium temperature for which albedo decline become effective. This value should be fixed. (default: 273.15 K)[unit: K])')) 124 elif self.albedo_scheme == 2: 125 s += '\n\tSEMIC snow albedo parameters for ISBA.? where is citation?\n' 126 s += '{}\n'.format(fielddisplay(self, 'mcrit', 'critical melt rate (default: 6e-8) [unit: m/sec]')) 127 s += '{}\n'.format(fielddisplay(self, 'wcrit', 'critical liquid water content (default: 15) [unit: kg/m2]')) 128 s += '{}\n'.format(fielddisplay(self, 'tau_a', 'dry albedo decline [unit: 1/day]')) 129 s += '{}\n'.format(fielddisplay(self, 'tau_f', 'wet albedo decline [unit: 1/day]')) 130 elif self.albedo_scheme == 3: 131 s += '\n\tSEMIC snow albedo parameters for Denby et al. (2002 Tellus)\n' 132 s += '{}\n'.format(fielddisplay(self,'mcrit','critical melt rate (defaut: 6e-8) [unit: m/sec]')) 133 elif self.albedo_scheme == 4: 134 s += '\n\tSEMIC snow albedo parameters for Alex.?\n' 135 s += '{}\n'.format(fielddisplay(self,'afac','[unit: ?]')) 136 s += '{}\n'.format(fielddisplay(self,'tmid','[unit: ?]')) 137 else: 138 raise Exception('ERROR: {} is not supported albedo scheme.'.format(self.albedo_scheme)) 139 59 140 s += '{}\n'.format(fielddisplay(self, 'steps_per_step', 'number of smb steps per time step')) 60 141 s += '{}\n'.format(fielddisplay(self, 'averaging', 'averaging methods from short to long steps')) … … 84 165 # }}} 85 166 167 def outputlists(self, md): # {{{ 168 if self.ismethod: 169 list = ['SmbMassBalance', 'SmbMassBalanceSnow', 'SmbMelt', 'SmbAccumulation', 'SmbHIce', 'SmbHSnow', 'SmbAlbedo', 'SmbAlbedoSnow', 'TemperatureSEMIC'] 170 else: 171 list = ['SmbMassBalance'] 172 return list 173 # }}} 174 86 175 def initialize(self, md): # {{{ 87 176 if np.all(np.isnan(self.s0gcm)): 88 177 self.s0gcm = np.zeros((md.mesh.numberofvertices)) 89 print(" no SMBsemic.s0gcm specified: values set as zero") 178 print(' no SMBsemic.s0gcm specified: values set as zero') 179 180 self.Tamp = 3 * np.ones((md.mesh.numberofvertices,)) 181 #self.albedo = 0.8 * np.ones((md.mesh.numberofvertices,)) 182 #self.albedo_snow = 0.5 * np.ones((md.mesh.numberofvertices,)) 183 self.hice = np.zeros((md.mesh.numberofvertices,)) 184 self.hsnow = 5 * np.ones((md.mesh.numberofvertices,)) 185 90 186 return self 91 187 # }}} 92 188 93 189 def setdefaultparameters(self): #{{{ 190 # albedo parameters 191 self.albedo_scheme = 0 192 self.alb_smax = 0.79 193 self.alb_smin = 0.6 194 self.albi = 0.41 195 self.albl = 0.07 196 197 # albedo parameters for? 198 # for slater 199 self.tmin = 263.15 200 self.tmax = 273.15 201 202 # for isba & denby 203 self.mcrit = 6e-8 204 205 # for isba 206 self.tau_a = 0.008 207 self.tau_f = 0.24 208 self.wcrit = 15.0 209 210 # for alex 211 self.tmid = 273.35 212 self.afac = -0.18 213 214 self.hcrit = 0.028 # from Krapp et al. (2017) 215 self.rcrit = 0.85 # from Krapp et al. (2017) 216 94 217 self.desfac = -log(2.0) / 1000 218 self.desfacElevation = 2000 95 219 self.rlaps = 7.4 96 220 self.rdl = 0.29 221 222 self.ismethod = 0 97 223 self.requested_outputs = ['default'] 98 224 return self … … 114 240 md = checkfield(md, 'fieldname', 'smb.dailyairhumidity', 'timeseries', 1, 'NaN', 1, 'Inf', 1) 115 241 md = checkfield(md, 'fieldname', 'smb.dailytemperature', 'timeseries', 1, 'NaN', 1, 'Inf', 1) 242 243 # TODO: transient model should be merged with SEMIC developed by Ruckamp et al. (2018) 244 md = checkfield(md, 'fieldname', 'smb.ismethod', 'numel', 1, 'values', [0, 1]) 245 if self.ismethod: # transient mode 246 md = checkfield(md, 'fieldname', 'smb.desfacElevation', '>=', 0, 'numel', 1) 247 md = checkfield(md, 'fieldname', 'smb.albedo_scheme', 'NaN', 1, 'Inf', 1, 'numel', 1, 'values', [0, 1, 2, 3, 4]) 248 md = checkfield(md, 'fieldname', 'smb.alb_smax', '>=', 0, 'NaN', 1, 'Inf', 1, 'numel', 1) 249 md = checkfield(md, 'fieldname', 'smb.mask', 'NaN', 1, 'Inf', 1, 'size', [md.mesh.numberofvertices, 1], 'values', [0, 1, 2]) 250 251 # initial values 252 md = checkfield(md, 'fieldname', 'smb.albedo', 'NaN', 1, 'Inf', 1, 'size', [md.mesh.numberofvertices, 1]) 253 md = checkfield(md, 'fieldname', 'smb.albedo_snow', 'NaN', 1, 'Inf', 1, 'size', [md.mesh.numberofvertices, 1]) 254 md = checkfield(md, 'fieldname', 'smb.alb_smax', '>=', 0, '<=', 1, 'NaN', 1, 'Inf', 1, 'numel', 1) 255 md = checkfield(md, 'fieldname', 'smb.alb_smin', '>=', 0, '<=', 1, 'NaN', 1, 'Inf', 1, 'numel', 1) 256 md = checkfield(md, 'fieldname', 'smb.albi', '>=', 0, '<=', 1, 'NaN', 1, 'Inf', 1, 'numel', 1) 257 md = checkfield(md, 'fieldname', 'smb.albl', '>=', 0, '<=', 1, 'NaN', 1, 'Inf', 1, 'numel', 1) 258 md = checkfield(md, 'fieldname', 'smb.hice', 'NaN', 1, 'Inf', 1, 'size', [md.mesh.numberofvertices, 1]) 259 md = checkfield(md, 'fieldname', 'smb.hsnow', 'NaN', 1, 'Inf', 1, 'size', [md.mesh.numberofvertices, 1]) 116 260 md = checkfield(md, 'fieldname', 'smb.steps_per_step', '>=', 1, 'numel', [1]) 117 261 md = checkfield(md, 'fieldname', 'smb.averaging', 'numel', [1], 'values', [0, 1, 2]) … … 123 267 yts = md.constants.yts 124 268 WriteData(fid, prefix, 'name', 'md.smb.model', 'data', 12, 'format', 'Integer') 269 WriteData(fid, prefix, 'object', self, 'class', 'smb', 'fieldname', 'ismethod', 'format', 'Integer', 'values', [0, 1]) 125 270 WriteData(fid, prefix, 'object', self, 'class' ,'smb', 'fieldname', 'desfac', 'format', 'Double') 271 WriteData(fid, prefix, 'object', self, 'class', 'smb', 'fieldname', 'desfacElevation', 'format', 'Double') 126 272 WriteData(fid, prefix, 'object', self, 'class' ,'smb', 'fieldname', 's0gcm', 'format', 'DoubleMat', 'mattype', 1) 127 273 WriteData(fid, prefix, 'object', self, 'class' ,'smb', 'fieldname', 'rlaps', 'format', 'Double') … … 136 282 WriteData(fid, prefix, 'object', self, 'class' ,'smb', 'fieldname', 'dailyairhumidity', 'format', 'DoubleMat', 'mattype', 1, 'timeserieslength', md.mesh.numberofvertices + 1, 'yts', yts) 137 283 WriteData(fid, prefix, 'object', self, 'class' ,'smb', 'fieldname', 'dailytemperature', 'format', 'DoubleMat', 'mattype', 1, 'timeserieslength', md.mesh.numberofvertices + 1, 'yts', yts) 284 # TODO: transient mode should be merged with SEMIC developed by Ruckamp et al. (2018). 285 if self.ismethod: # transient mode 286 WriteData(fid, prefix, 'object', self, 'class', 'smb', 'fieldname', 'Tamp', 'format', 'DoubleMat', 'mattype', 1) 287 WriteData(fid, prefix, 'object', self, 'class', 'smb', 'fieldname', 'mask', 'format', 'DoubleMat', 'mattype', 1) 288 WriteData(fid, prefix, 'object', self, 'class', 'smb', 'fieldname', 'hice', 'format', 'DoubleMat', 'mattype', 1) 289 WriteData(fid, prefix, 'object', self, 'class', 'smb', 'fieldname', 'hsnow', 'format', 'DoubleMat', 'mattype', 1) 290 291 WriteData(fid, prefix, 'object', self, 'class', 'smb', 'fieldname', 'hcrit', 'format', 'Double') 292 WriteData(fid, prefix, 'object', self, 'class', 'smb', 'fieldname', 'rcrit', 'format', 'Double') 293 294 # albedo 295 WriteData(fid, prefix, 'object', self, 'class', 'smb', 'fieldname', 'albedo', 'format', 'DoubleMat', 'mattype', 1) 296 WriteData(fid, prefix, 'object', self, 'class', 'smb', 'fieldname', 'albedo_snow', 'format', 'DoubleMat', 'mattype', 1) 297 WriteData(fid, prefix, 'object', self, 'class', 'smb', 'fieldname', 'albedo_scheme', 'format', 'Integer') 298 WriteData(fid, prefix, 'object', self, 'class', 'smb', 'fieldname', 'albi', 'format', 'Double') 299 WriteData(fid, prefix, 'object', self, 'class', 'smb', 'fieldname', 'albl', 'format', 'Double') 300 WriteData(fid, prefix, 'object', self, 'class', 'smb', 'fieldname', 'alb_smin', 'format', 'Double') 301 WriteData(fid, prefix, 'object', self, 'class', 'smb', 'fieldname', 'alb_smax', 'format', 'Double') 302 303 # albedo parameters for ? 304 # for slater 305 WriteData(fid, prefix, 'object', self, 'class', 'smb', 'fieldname', 'tmin', 'format', 'Double') 306 WriteData(fid, prefix, 'object', self, 'class', 'smb', 'fieldname', 'tmax', 'format', 'Double') 307 # for isba & denby 308 WriteData(fid, prefix, 'object', self, 'class', 'smb', 'fieldname', 'mcrit', 'format', 'Double') 309 # for isba 310 WriteData(fid, prefix, 'object', self, 'class', 'smb', 'fieldname', 'wcrit', 'format', 'Double') 311 WriteData(fid, prefix, 'object', self, 'class', 'smb', 'fieldname', 'tau_a', 'format', 'Double') 312 WriteData(fid, prefix, 'object', self, 'class', 'smb', 'fieldname', 'tau_f', 'format', 'Double') 313 # for alex 314 WriteData(fid, prefix, 'object', self, 'class', 'smb', 'fieldname', 'tmid', 'format', 'Double') 315 WriteData(fid, prefix, 'object', self, 'class', 'smb', 'fieldname', 'afac', 'format', 'Double') 138 316 WriteData(fid, prefix, 'object', self, 'fieldname', 'steps_per_step', 'format', 'Integer') 139 317 WriteData(fid, prefix, 'object', self, 'fieldname', 'averaging', 'format', 'Integer')
Note:
See TracChangeset
for help on using the changeset viewer.