source: issm/trunk-jpl/src/m/classes/snowpack.m@ 15914

Last change on this file since 15914 was 15914, checked in by Eric.Larour, 12 years ago

NEW: new class for snowpack configuration and initialization

File size: 15.2 KB
Line 
1%SNOWPACK class definition
2%
3% Usage:
4% snowpack=snowpack();
5
6classdef snowpack
7 properties (SetAccess=public)
8
9 %first, the configuration fields, by category:
10 %snowpack: %{{{
11 snowpack_meas_tss = 0;
12 snowpack_enforce_measured_snow_heights = 0;
13 snowpack_sw_mode = 0;
14 snowpack_incoming_longwave = 0;
15 snowpack_height_of_wind_value = 0;
16 snowpack_height_of_meteo_values = 0;
17 snowpack_neutral = 0;
18 snowpack_roughness_length = 0;
19 snowpack_number_slopes = 0;
20 snowpack_snow_redistribution = 0;
21 snowpack_calculation_step_length = 0;
22 snowpack_change_bc = 0;
23 snowpack_thresh_change_bc = 0;
24 snowpack_snp_soil = 0;
25 snowpack_soil_flux = 0;
26 snowpack_geo_heat = 0;
27 snowpack_canopy = 0;
28 %}}}
29 %snowpackadvanced: %{{{
30 snowpackadvanced_variant = ''; % use 320 kg m-3 for fixed density
31 snowpackadvanced_hn_density = '';
32 %}}}
33 %general: %{{{
34 general_pluginpath = '';
35 general_buff_chunk_size = 0;
36 general_buff_before = 0;
37 %}}}
38 %input {{{
39 input_coordsys = '';
40 input_coordparam = '';
41 input_time_zone = 0;
42 input_meteo = '';
43 input_meteopath = '';
44 input_station1 = '';
45 input_snowfile1 = '';
46 %}}}
47 %output {{{
48 output_coordsys = '';
49 output_coordparam = '';
50 output_time_zone = 0;
51 output_meteopath = '';
52 output_experiment = '';
53 output_ts_write = 0;
54 output_ts_start = 0;
55 output_ts_days_between = 0;
56 output_profile = '';
57 output_prof_write = 0;
58 output_prof_start = 0;
59 output_prof_days_between = 0;
60 %}}}
61 %interpolations1d %{{{
62 interpolations1d_window_size = 0; %that is 5 d and 2 h; 1 d = 86400
63 interpolations1d_hnw_resample = '';
64 interpolations1d_hs_resample = '';
65 interpolations1d_tsg_resample = '';
66 interpolations1d_rho_hn_resample = '';
67 interpolations1d_vw_resample = '';
68 interpolations1d_vw_args = '';
69 %}}}
70 %filters {{{
71 filters_ta_filter1 = '';
72 filters_ta_arg1 = NaN;
73 filters_rh_filter1 = '';
74 filters_rh_arg1 = NaN;
75 filters_rh_filter2 = '';
76 filters_rh_arg2 = NaN;
77 filters_iswr_filter1 = '';
78 filters_iswr_arg1 = NaN;
79 filters_iswr_filter2 = '';
80 filters_iswr_arg2 = NaN;
81 filters_rswr_filter1 = '';
82 filters_rswr_arg1 = NaN;
83 filters_rswr_filter2 = '';
84 filters_rswr_arg2 = NaN;
85
86 %for ta between 190 and 280 k;
87 filters_ilwr_filter1 = '';
88 filters_ilwr_arg1 = NaN;
89 filters_ilwr_filter2 = '';
90 filters_ilwr_arg2 = NaN;
91 filters_tss_filter1 = '';
92 filters_tss_arg1 = NaN;
93 filters_tsg_filter1 = '';
94 filters_tsg_arg1 = NaN;
95 filters_vw_filter1 = '';
96 filters_vw_arg1 = NaN;
97 filters_vw_filter2 = '';
98 filters_vw_arg2 = NaN;
99 %}}}
100
101 end
102 methods
103 function obj = snowpack(varargin) % {{{
104 switch nargin
105 case 0
106 obj=setdefaultparameters(obj);
107 case 1
108 inputstruct=varargin{1};
109 list1 = properties('snowpack');
110 list2 = fieldnames(inputstruct);
111 for i=1:length(list1)
112 fieldname = list1{i};
113 if ismember(fieldname,list2),
114 obj.(fieldname) = inputstruct.(fieldname);
115 end
116 end
117 otherwise
118 error('constructor not supported');
119 end
120 end % }}}
121 function obj = setdefaultparameters(obj) % {{{
122
123 %snowpack: %{{{
124 obj.snowpack_meas_tss = 1;
125 obj.snowpack_enforce_measured_snow_heights = 0;
126 obj.snowpack_sw_mode = 0;
127 obj.snowpack_incoming_longwave = 1;
128 obj.snowpack_height_of_wind_value = 12.;
129 obj.snowpack_height_of_meteo_values = 12.;
130 obj.snowpack_neutral = 0;
131 obj.snowpack_roughness_length = 0.002;
132 obj.snowpack_number_slopes = 1;
133 obj.snowpack_snow_redistribution = 1;
134 obj.snowpack_calculation_step_length = 15.0;
135 obj.snowpack_change_bc = 0;
136 obj.snowpack_thresh_change_bc = -1.0;
137 obj.snowpack_snp_soil = 0;
138 obj.snowpack_soil_flux = 0;
139 obj.snowpack_geo_heat = 0.06;
140 obj.snowpack_canopy = 0;
141 %}}}
142 %snowpackadvanced: %{{{
143 obj.snowpackadvanced_variant = 'ANTARCTICA'; % use 320 kg m-3 for fixed density
144 obj.snowpackadvanced_hn_density = 'EVENT';
145 %}}}
146 %general: %{{{
147 obj.general_pluginpath = '/usr/local/lib/meteoio/plugins/';
148 obj.general_buff_chunk_size = 90;
149 obj.general_buff_before = 1.5;
150 %}}}
151 %input {{{
152 obj.input_coordsys = 'ch1903';
153 obj.input_coordparam = 'null';
154 obj.input_time_zone = 8;
155 obj.input_meteo = 'smet';
156 obj.input_meteopath = './input';
157 obj.input_station1 = 'domec.smet';
158 obj.input_snowfile1 = 'domec.sno';
159 %}}}
160 %output {{{
161 obj.output_coordsys = 'ch1903';
162 obj.output_coordparam = 'null';
163 obj.output_time_zone = 8;
164 obj.output_meteopath = './output';
165 obj.output_experiment = 'smet';
166 obj.output_ts_write = 1;
167 obj.output_ts_start = 0.0;
168 obj.output_ts_days_between = 0.04166667;
169 obj.output_profile = 'ascii';
170 obj.output_prof_write = 1;
171 obj.output_prof_start = 0.0;
172 obj.output_prof_days_between = 0.04166667;
173 %}}}
174 %interpolations1d %{{{
175 obj.interpolations1d_window_size = 439200 %that is 5 d and 2 h; 1 d = 86400
176 obj.interpolations1d_hnw_resample = 'none';
177 obj.interpolations1d_hs_resample = 'linear';
178 obj.interpolations1d_tsg_resample = 'linear';
179 obj.interpolations1d_rho_hn_resample = 'none';
180 obj.interpolations1d_vw_resample = 'nearest_neighbour';
181 obj.interpolations1d_vw_args = 'extrapolate';
182 %}}}
183 %filters {{{
184 obj.filters_ta_filter1 = 'min_max';
185 obj.filters_ta_arg1 = [190 280];
186 obj.filters_rh_filter1 = 'min_max';
187 obj.filters_rh_arg1 = [0.01 1.2];
188 obj.filters_rh_filter2 = 'min_max';
189 obj.filters_rh_arg2 = {'soft' 0.01 1.0};
190 obj.filters_iswr_filter1 = 'min_max';
191 obj.filters_iswr_arg1 = [-10 1500];
192 obj.filters_iswr_filter2 = 'min_max';
193 obj.filters_iswr_arg2 = {'soft' 0 1500};
194 obj.filters_rswr_filter1 = 'min_max';
195 obj.filters_rswr_arg1 = [-10 1500];
196 obj.filters_rswr_filter2 = 'min_max';
197 obj.filters_rswr_arg2 = {'soft' 0 1500};
198
199 %for ta between 190 and 280 k;
200 obj.filters_ilwr_filter1 = 'min_max';
201 obj.filters_ilwr_arg1 = [30 355];
202 obj.filters_ilwr_filter2 = 'min_max';
203 obj.filters_ilwr_arg2 = {'soft' 35 350};
204 obj.filters_tss_filter1 = 'min_max';
205 obj.filters_tss_arg1 = [180 275];
206 obj.filters_tsg_filter1 = 'min_max';
207 obj.filters_tsg_arg1 = [200 275];
208 obj.filters_vw_filter1 = 'min_max';
209 obj.filters_vw_arg1 = [-2 70];
210 obj.filters_vw_filter2 = 'min_max';
211 obj.filters_vw_arg2 = {'soft' 0 50};
212 %}}}
213
214 end % }}}
215 function md = checkconsistency(obj,md,solution,analyses) % {{{
216 %snowpack: %{{{
217 md=checkfield(md,'snowpack.snowpack_meas_tss','values',[0 1]);
218 md=checkfield(md,'snowpack.snowpack_enforce_measured_snow_heights','values',[0 1]);
219 md=checkfield(md,'snowpack.snowpack_sw_mode','values',[0 1 2]);
220 md=checkfield(md,'snowpack.snowpack_incoming_longwave','values',[0 1]);
221 md=checkfield(md,'snowpack.snowpack_height_of_wind_value,'>=',0);
222 md=checkfield(md,'snowpack.snowpack_height_of_meteo_values','>=',0);
223 md=checkfield(md,'snowpack.snowpack_neutral','values',[-1 0 1]);
224 md=checkfield(md,'snowpack.snowpack_roughness_length','>=',0);
225 md=checkfield(md,'snowpack.snowpack_number_slopes','values',[1 3 5 9]);
226 md=checkfield(md,'snowpack.snowpack_snow_redistribution','values',[0 1]);
227 md=checkfield(md,'snowpack.snowpack_calculation_step_length','>',0);
228 md=checkfield(md,'snowpack.snowpack_change_bc','values',[0 1]);
229 md=checkfield(md,'snowpack.snowpack_thresh_change_bc','<=',0);
230 md=checkfield(md,'snowpack.snowpack_snp_soil','values',[0 1]);
231 md=checkfield(md,'snowpack.snowpack_soil_flux,'values',[0 1]);
232 md=checkfield(md,'snowpack.snowpack_geo_heat,'>=',0);
233 md=checkfield(md,'snowpack.snowpack_canopy,'values',[0 1]);
234 %}}}
235 %snowpackadvanced: %{{{
236 md=checkfield(md,'snowpack.snowpackadvanced_variant = 'ANTARCTICA'; % use 320 kg m-3 for fixed density
237 md=checkfield(md,'snowpack.snowpackadvanced_hn_density = 'EVENT';
238 %}}}
239 %general: %{{{
240 md=checkfield(md,'snowpack.general_pluginpath = '/usr/local/lib/meteoio/plugins/';
241 md=checkfield(md,'snowpack.general_buff_chunk_size = 90;
242 md=checkfield(md,'snowpack.general_buff_before = 1.5;
243 %}}}
244 %input {{{
245 md=checkfield(md,'snowpack.input_coordsys = 'ch1903';
246 md=checkfield(md,'snowpack.input_coordparam = 'null';
247 md=checkfield(md,'snowpack.input_time_zone = 8;
248 md=checkfield(md,'snowpack.input_meteo = 'smet';
249 md=checkfield(md,'snowpack.input_meteopath = './input';
250 md=checkfield(md,'snowpack.input_station1 = 'domec.smet';
251 md=checkfield(md,'snowpack.input_snowfile1 = 'domec.sno';
252 %}}}
253 %output {{{
254 md=checkfield(md,'snowpack.output_coordsys = 'ch1903';
255 md=checkfield(md,'snowpack.output_coordparam = 'null';
256 md=checkfield(md,'snowpack.output_time_zone = 8;
257 md=checkfield(md,'snowpack.output_meteopath = './output';
258 md=checkfield(md,'snowpack.output_experiment = 'smet';
259 md=checkfield(md,'snowpack.output_ts_write = 1;
260 md=checkfield(md,'snowpack.output_ts_start = 0.0;
261 md=checkfield(md,'snowpack.output_ts_days_between = 0.04166667;
262 md=checkfield(md,'snowpack.output_profile = 'ascii';
263 md=checkfield(md,'snowpack.output_prof_write = 1;
264 md=checkfield(md,'snowpack.output_prof_start = 0.0;
265 md=checkfield(md,'snowpack.output_prof_days_between = 0.04166667;
266 %}}}
267 %interpolations1d %{{{
268 md=checkfield(md,'snowpack.interpolations1d_window_size = 439200 %that is 5 d and 2 h; 1 d = 86400
269 md=checkfield(md,'snowpack.interpolations1d_hnw_resample = 'none';
270 md=checkfield(md,'snowpack.interpolations1d_hs_resample = 'linear';
271 md=checkfield(md,'snowpack.interpolations1d_tsg_resample = 'linear';
272 md=checkfield(md,'snowpack.interpolations1d_rho_hn_resample = 'none';
273 md=checkfield(md,'snowpack.interpolations1d_vw_resample = 'nearest_neighbour';
274 md=checkfield(md,'snowpack.interpolations1d_vw_args = 'extrapolate';
275 %}}}
276 %filters {{{
277 md=checkfield(md,'snowpack.filters_ta_filter1 = 'min_max';
278 md=checkfield(md,'snowpack.filters_ta_arg1 = [190 280];
279 md=checkfield(md,'snowpack.filters_rh_filter1 = 'min_max';
280 md=checkfield(md,'snowpack.filters_rh_arg1 = [0.01 1.2];
281 md=checkfield(md,'snowpack.filters_rh_filter2 = 'min_max';
282 md=checkfield(md,'snowpack.filters_rh_arg2 = {'soft' 0.01 1.0};
283 md=checkfield(md,'snowpack.filters_iswr_filter1 = 'min_max';
284 md=checkfield(md,'snowpack.filters_iswr_arg1 = [-10 1500];
285 md=checkfield(md,'snowpack.filters_iswr_filter2 = 'min_max';
286 md=checkfield(md,'snowpack.filters_iswr_arg2 = {'soft' 0 1500};
287 md=checkfield(md,'snowpack.filters_rswr_filter1 = 'min_max';
288 md=checkfield(md,'snowpack.filters_rswr_arg1 = [-10 1500];
289 md=checkfield(md,'snowpack.filters_rswr_filter2 = 'min_max';
290 md=checkfield(md,'snowpack.filters_rswr_arg2 = {'soft' 0 1500};
291
292 %for ta between 190 and 280 k;
293 md=checkfield(md,'snowpack.filters_ilwr_filter1 = 'min_max';
294 md=checkfield(md,'snowpack.filters_ilwr_arg1 = [30 355];
295 md=checkfield(md,'snowpack.filters_ilwr_filter2 = 'min_max';
296 md=checkfield(md,'snowpack.filters_ilwr_arg2 = {'soft' 35 350};
297 md=checkfield(md,'snowpack.filters_tss_filter1 = 'min_max';
298 md=checkfield(md,'snowpack.filters_tss_arg1 = [180 275];
299 md=checkfield(md,'snowpack.filters_tsg_filter1 = 'min_max';
300 md=checkfield(md,'snowpack.filters_tsg_arg1 = [200 275];
301 md=checkfield(md,'snowpack.filters_vw_filter1 = 'min_max';
302 md=checkfield(md,'snowpack.filters_vw_arg1 = [-2 70];
303 md=checkfield(md,'snowpack.filters_vw_filter2 = 'min_max';
304 md=checkfield(md,'snowpack.filters_vw_arg2 = {'soft' 0 50};
305 %}}}
306
307 end % }}}
308 function disp(obj) % {{{
309
310 disp(sprintf(' StressBalance solution parameters:'));
311
312 disp(sprintf('\n %s','Convergence criteria:'));
313 fielddisplay(obj,'restol','mechanical equilibrium residual convergence criterion');
314 fielddisplay(obj,'reltol','velocity relative convergence criterion, NaN: not applied');
315 fielddisplay(obj,'abstol','velocity absolute convergence criterion, NaN: not applied');
316 fielddisplay(obj,'isnewton','0: Picard''s fixed point, 1: Newton''s method, 2: hybrid');
317 fielddisplay(obj,'maxiter','maximum number of nonlinear iterations');
318 fielddisplay(obj,'viscosity_overshoot','over-shooting constant new=new+C*(new-old)');
319
320 disp(sprintf('\n %s','boundary conditions:'));
321 fielddisplay(obj,'spcvx','x-axis velocity constraint (NaN means no constraint) [m/yr]');
322 fielddisplay(obj,'spcvy','y-axis velocity constraint (NaN means no constraint) [m/yr]');
323 fielddisplay(obj,'spcvz','z-axis velocity constraint (NaN means no constraint) [m/yr]');
324
325 disp(sprintf('\n %s','Rift options:'));
326 fielddisplay(obj,'rift_penalty_threshold','threshold for instability of mechanical constraints');
327 fielddisplay(obj,'rift_penalty_lock','number of iterations before rift penalties are locked');
328
329 disp(sprintf('\n %s','Penalty options:'));
330 fielddisplay(obj,'penalty_factor','offset used by penalties: penalty = Kmax*10^offset');
331 fielddisplay(obj,'vertex_pairing','pairs of vertices that are penalized');
332
333 disp(sprintf('\n %s','Other:'));
334 fielddisplay(obj,'shelf_dampening','use dampening for floating ice ? Only for FS model');
335 fielddisplay(obj,'FSreconditioning','multiplier for incompressibility equation. Only for FS model');
336 fielddisplay(obj,'referential','local referential');
337 fielddisplay(obj,'loadingforce','loading force applied on each point [N/m^3]');
338 fielddisplay(obj,'requested_outputs','additional outputs requested');
339
340 end % }}}
341 function marshall(obj,md,fid) % {{{
342
343 yts=365.0*24.0*3600.0;
344
345 WriteData(fid,'object',obj,'class','snowpack','fieldname','spcvx','format','DoubleMat','mattype',1,'scale',1./yts,'forcinglength',md.mesh.numberofvertices+1);
346 WriteData(fid,'object',obj,'class','snowpack','fieldname','spcvy','format','DoubleMat','mattype',1,'scale',1./yts,'forcinglength',md.mesh.numberofvertices+1);
347 WriteData(fid,'object',obj,'class','snowpack','fieldname','spcvz','format','DoubleMat','mattype',1,'scale',1./yts,'forcinglength',md.mesh.numberofvertices+1);
348 WriteData(fid,'object',obj,'class','snowpack','fieldname','restol','format','Double');
349 WriteData(fid,'object',obj,'class','snowpack','fieldname','reltol','format','Double');
350 WriteData(fid,'object',obj,'class','snowpack','fieldname','abstol','format','Double');
351 WriteData(fid,'object',obj,'class','snowpack','fieldname','isnewton','format','Integer');
352 WriteData(fid,'object',obj,'class','snowpack','fieldname','FSreconditioning','format','Double');
353 WriteData(fid,'object',obj,'class','snowpack','fieldname','viscosity_overshoot','format','Double');
354 WriteData(fid,'object',obj,'class','snowpack','fieldname','maxiter','format','Integer');
355 WriteData(fid,'object',obj,'class','snowpack','fieldname','shelf_dampening','format','Integer');
356 WriteData(fid,'object',obj,'class','snowpack','fieldname','vertex_pairing','format','DoubleMat','mattype',3);
357 WriteData(fid,'object',obj,'class','snowpack','fieldname','penalty_factor','format','Double');
358 WriteData(fid,'object',obj,'class','snowpack','fieldname','rift_penalty_lock','format','Integer');
359 WriteData(fid,'object',obj,'class','snowpack','fieldname','rift_penalty_threshold','format','Integer');
360 WriteData(fid,'object',obj,'class','snowpack','fieldname','referential','format','DoubleMat','mattype',1);
361 WriteData(fid,'object',obj,'class','snowpack','fieldname','requested_outputs','format','DoubleMat','mattype',3);
362 WriteData(fid,'data',obj.loadingforce(:,1),'format','DoubleMat','mattype',1,'enum',LoadingforceXEnum);
363 WriteData(fid,'data',obj.loadingforce(:,2),'format','DoubleMat','mattype',1,'enum',LoadingforceYEnum);
364 WriteData(fid,'data',obj.loadingforce(:,3),'format','DoubleMat','mattype',1,'enum',LoadingforceZEnum);
365 end % }}}
366 end
367end
Note: See TracBrowser for help on using the repository browser.