source: issm/trunk-jpl/src/m/classes/SMBsemic.m@ 24240

Last change on this file since 24240 was 24240, checked in by bdef, 5 years ago

Adding a substeping framework in hydro and part of smb

File size: 7.6 KB
Line 
1%SMBsemic Class definition
2%
3% Usage:
4% SMBsemic=SMBsemic();
5
6classdef SMBsemic
7 properties (SetAccess=public)
8 dailysnowfall = NaN;
9 dailyrainfall = NaN;
10 dailydsradiation = NaN;
11 dailydlradiation = NaN;
12 dailywindspeed = NaN;
13 dailypressure = NaN;
14 dailyairdensity = NaN;
15 dailyairhumidity = NaN;
16 dailytemperature = NaN;
17 desfac = 0;
18 rlaps = 0;
19 rdl = 0;
20 s0gcm = NaN;
21 steps_per_step = 1;
22 requested_outputs = {};
23 end
24 methods
25 function self = SMBsemic(varargin) % {{{
26 switch nargin
27 case 0
28 self=setdefaultparameters(self);
29 otherwise
30 error('constructor not supported');
31 end
32 end % }}}
33 function self = extrude(self,md) % {{{
34 self.dailysnowfall=project3d(md,'vector',self.dailysnowfall,'type','node');
35 self.dailyrainfall=project3d(md,'vector',self.dailyrainfall,'type','node');
36 self.dailydsradiation=project3d(md,'vector',self.dailydsradiation,'type','node');
37 self.dailydlradiation=project3d(md,'vector',self.dailydlradiation,'type','node');
38 self.dailywindspeed=project3d(md,'vector',self.dailywindspeed,'type','node');
39 self.dailypressure=project3d(md,'vector',self.dailypressure,'type','node');
40 self.dailyairdensity=project3d(md,'vector',self.dailyairdensity,'type','node');
41 self.dailyairhumidity=project3d(md,'vector',self.dailyairhumidity,'type','node');
42 self.dailytemperature=project3d(md,'vector',self.dailytemperature,'type','node');
43 self.s0gcm=project3d(md,'vector',self.s0gcm,'type','node');
44
45 end % }}}
46 function list = defaultoutputs(self,md) % {{{
47 list = {''};
48 end % }}}
49 function self = initialize(self,md) % {{{
50
51 if isnan(self.s0gcm),
52 self.s0gcm=zeros(md.mesh.numberofvertices,1);
53 disp(' no SMBsemic.s0gcm specified: values set as zero');
54 end
55
56 end % }}}
57 function self = setdefaultparameters(self) % {{{
58
59 self.desfac = -log(2.0)/1000;
60 self.rlaps = 7.4;
61 self.rdl = 0.29;
62
63 end % }}}zo
64 function md = checkconsistency(self,md,solution,analyses) % {{{
65
66 if ismember('MasstransportAnalysis',analyses),
67 md = checkfield(md,'fieldname','smb.desfac','<=',1,'numel',1);
68 md = checkfield(md,'fieldname','smb.s0gcm','>=',0,'NaN',1,'Inf',1,'size',[md.mesh.numberofvertices 1]);
69 md = checkfield(md,'fieldname','smb.rlaps','>=',0,'numel',1);
70 md = checkfield(md,'fieldname','smb.rdl','>=',0,'numel',1);
71 md = checkfield(md,'fieldname','smb.dailysnowfall','timeseries',1,'NaN',1,'Inf',1);
72 md = checkfield(md,'fieldname','smb.dailyrainfall','timeseries',1,'NaN',1,'Inf',1);
73 md = checkfield(md,'fieldname','smb.dailydsradiation','timeseries',1,'NaN',1,'Inf',1);
74 md = checkfield(md,'fieldname','smb.dailydlradiation','timeseries',1,'NaN',1,'Inf',1);
75 md = checkfield(md,'fieldname','smb.dailywindspeed','timeseries',1,'NaN',1,'Inf',1);
76 md = checkfield(md,'fieldname','smb.dailypressure','timeseries',1,'NaN',1,'Inf',1);
77 md = checkfield(md,'fieldname','smb.dailyairdensity','timeseries',1,'NaN',1,'Inf',1);
78 md = checkfield(md,'fieldname','smb.dailyairhumidity','timeseries',1,'NaN',1,'Inf',1);
79 md = checkfield(md,'fieldname','smb.dailytemperature','timeseries',1,'NaN',1,'Inf',1);
80 end
81 md = checkfield(md,'fieldname','smb.steps_per_step','>=',1,'numel',[1]);
82 md = checkfield(md,'fieldname','smb.requested_outputs','stringrow',1);
83
84 end % }}}
85 function disp(self) % {{{
86 disp(sprintf(' surface forcings parameters:'));
87
88 disp(sprintf(' Interface for coupling GCM data to the energy balance model SEMIC (Krapp et al (2017) https://doi.org/10.5194/tc-11-1519-2017).'));
89 disp(sprintf(' The implemented coupling uses daily mean GCM input to calculate yearly mean smb, accumulation, ablation, and surface temperature.'));
90 disp(sprintf(' smb and temperatures are updated every year'));
91 disp(sprintf('\n SEMIC parameters:'));
92 fielddisplay(self,'dailysnowfall','daily surface dailysnowfall [m/s]');
93 fielddisplay(self,'dailyrainfall','daily surface dailyrainfall [m/s]');
94 fielddisplay(self,'dailydsradiation','daily downwelling shortwave radiation [W/m2]');
95 fielddisplay(self,'dailydlradiation','daily downwelling longwave radiation [W/m2]');
96 fielddisplay(self,'dailywindspeed','daily surface wind speed [m/s]');
97 fielddisplay(self,'dailypressure','daily surface pressure [Pa]');
98 fielddisplay(self,'dailyairdensity','daily air density [kg/m3]');
99 fielddisplay(self,'dailyairhumidity','daily air specific humidity [kg/kg]');
100 fielddisplay(self,'dailytemperature','daily surface air temperature [K]');
101 fielddisplay(self,'rlaps','present day lapse rate (default is 7.4 [degree/km]; )Erokhina et al. 2017)');
102 fielddisplay(self,'desfac','desertification elevation factor (default is -log(2.0)/1000 [1/km]; Vizcaino et al. 2010)');
103 fielddisplay(self,'rdl','longwave downward radiation decrease (default is 0.29 [W/m^2/km]; Marty et al. 2002)');
104 fielddisplay(self,'s0gcm','GCM reference elevation; (default is 0) [m]');
105 fielddisplay(self, 'steps_per_step', 'number of smb steps per time step');
106 fielddisplay(self,'requested_outputs','additional outputs requested');
107 end % }}}
108 function marshall(self,prefix,md,fid) % {{{
109
110 WriteData(fid,prefix,'name','md.smb.model','data',12,'format','Integer');
111
112 WriteData(fid,prefix,'object',self,'class','smb','fieldname','desfac','format','Double');
113 WriteData(fid,prefix,'object',self,'class','smb','fieldname','s0gcm','format','DoubleMat','mattype',1);
114 WriteData(fid,prefix,'object',self,'class','smb','fieldname','rlaps','format','Double');
115 WriteData(fid,prefix,'object',self,'class','smb','fieldname','rdl','format','Double');
116 WriteData(fid,prefix,'object',self,'class','smb','fieldname','dailysnowfall','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1,'yts',md.constants.yts);
117 WriteData(fid,prefix,'object',self,'class','smb','fieldname','dailyrainfall','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1,'yts',md.constants.yts);
118 WriteData(fid,prefix,'object',self,'class','smb','fieldname','dailydsradiation','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1,'yts',md.constants.yts);
119 WriteData(fid,prefix,'object',self,'class','smb','fieldname','dailydlradiation','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1,'yts',md.constants.yts);
120 WriteData(fid,prefix,'object',self,'class','smb','fieldname','dailywindspeed','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1,'yts',md.constants.yts);
121 WriteData(fid,prefix,'object',self,'class','smb','fieldname','dailypressure','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1,'yts',md.constants.yts);
122 WriteData(fid,prefix,'object',self,'class','smb','fieldname','dailyairdensity','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1,'yts',md.constants.yts);
123 WriteData(fid,prefix,'object',self,'class','smb','fieldname','dailyairhumidity','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1,'yts',md.constants.yts);
124 WriteData(fid,prefix,'object',self,'class','smb','fieldname','dailytemperature','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1,'yts',md.constants.yts);
125 WriteData(fid, prefix, 'object', self, 'fieldname', 'steps_per_step', 'format', 'Integer');
126 %process requested outputs
127 outputs = self.requested_outputs;
128 pos = find(ismember(outputs,'default'));
129 if ~isempty(pos),
130 outputs(pos) = []; %remove 'default' from outputs
131 outputs = [outputs defaultoutputs(self,md)]; %add defaults
132 end
133 WriteData(fid,prefix,'data',outputs,'name','md.smb.requested_outputs','format','StringArray');
134
135 end % }}}
136 end
137end
Note: See TracBrowser for help on using the repository browser.