source: issm/trunk-jpl/src/m/classes/esa.m@ 21260

Last change on this file since 21260 was 21260, checked in by adhikari, 8 years ago

NEW: added new ESA capability to compute 3D elastostatic crustal deformation

File size: 3.8 KB
Line 
1%ESA class definition
2%
3% Usage:
4% esa=esa();
5
6classdef esa
7 properties (SetAccess=public)
8 deltathickness = NaN;
9 love_h = 0; %provided by PREM model
10 love_l = 0; %ideam
11 degacc = 0;
12 requested_outputs = {};
13 transitions = {};
14 end
15 methods
16 function self = esa(varargin) % {{{
17 switch nargin
18 case 0
19 self=setdefaultparameters(self);
20 otherwise
21 error('constructor not supported');
22 end
23 end % }}}
24 function self = setdefaultparameters(self) % {{{
25
26 %numerical discretization accuracy
27 self.degacc=.01;
28
29 %output default:
30 self.requested_outputs={'default'};
31
32 %transitions should be a cell array of vectors:
33 self.transitions={};
34
35 end % }}}
36 function md = checkconsistency(self,md,solution,analyses) % {{{
37
38 if ~ismember('EsaAnalysis',analyses), return; end
39 md = checkfield(md,'fieldname','esa.deltathickness','NaN',1,'Inf',1,'size',[md.mesh.numberofelements 1]);
40 md = checkfield(md,'fieldname','esa.love_h','NaN',1,'Inf',1);
41 md = checkfield(md,'fieldname','esa.love_l','NaN',1,'Inf',1);
42 md = checkfield(md,'fieldname','esa.degacc','size',[1 1],'>=',1e-10);
43 md = checkfield(md,'fieldname','esa.requested_outputs','stringrow',1);
44
45 %check that love numbers are provided at the same level of accuracy:
46 if (size(self.love_h,1)~=size(self.love_l,1)),
47 error('esa error message: love numbers should be provided at the same level of accuracy');
48 end
49
50 %cross check that whereever we have an ice load, the mask is <0 on each vertex:
51 pos=find(self.deltathickness);
52 maskpos=md.mask.ice_levelset(md.mesh.elements(pos,:));
53 [els,vertices]=find(maskpos>0);
54 if length(els),
55 error('esa checkconsistency fail: there are elements with ice loads where some vertices are not on the ice!');
56 end
57
58 end % }}}
59 function list=defaultoutputs(self,md) % {{{
60 list = {'EsaUmotion'};
61 end % }}}
62 function disp(self) % {{{
63 disp(sprintf(' esa parameters:'));
64
65 fielddisplay(self,'deltathickness','thickness change: ice height equivalent [m]');
66 fielddisplay(self,'love_h','load Love number for radial displacement');
67 fielddisplay(self,'love_l','load Love number for horizontal displacements');
68 fielddisplay(self,'degacc','accuracy (default .01 deg) for numerical discretization of the Green''s functions');
69 fielddisplay(self,'transitions','indices into parts of the mesh that will be icecaps');
70 fielddisplay(self,'requested_outputs','additional outputs requested (default: EsaUmotion)');
71
72 end % }}}
73 function marshall(self,prefix,md,fid) % {{{
74 WriteData(fid,prefix,'object',self,'fieldname','deltathickness','format','DoubleMat','mattype',2);
75 WriteData(fid,prefix,'object',self,'fieldname','love_h','format','DoubleMat','mattype',1);
76 WriteData(fid,prefix,'object',self,'fieldname','love_l','format','DoubleMat','mattype',1);
77 WriteData(fid,prefix,'object',self,'fieldname','degacc','format','Double');
78 WriteData(fid,prefix,'object',self,'fieldname','transitions','format','MatArray');
79
80 %process requested outputs
81 outputs = self.requested_outputs;
82 pos = find(ismember(outputs,'default'));
83 if ~isempty(pos),
84 outputs(pos) = []; %remove 'default' from outputs
85 outputs = [outputs defaultoutputs(self,md)]; %add defaults
86 end
87 WriteData(fid,prefix,'data',outputs,'name','md.esa.requested_outputs','format','StringArray');
88
89 end % }}}
90 function savemodeljs(self,fid,modelname) % {{{
91
92 writejs1Darray(fid,[modelname '.esa.deltathickness'],self.deltathickness);
93 writejs1Darray(fid,[modelname '.esa.love_h'],self.love_h);
94 writejs1Darray(fid,[modelname '.esa.love_l'],self.love_l);
95 writejsdouble(fid,[modelname '.esa.degacc'],self.degacc);
96 writejscellstring(fid,[modelname '.esa.requested_outputs'],self.requested_outputs);
97 writejscellarray(fid,[modelname '.esa.transitions'],self.transitions);
98 end % }}}
99 end
100end
Note: See TracBrowser for help on using the repository browser.