source: issm/trunk-jpl/src/m/classes/solidearth.m@ 25969

Last change on this file since 25969 was 25969, checked in by Mathieu Morlighem, 4 years ago

CHG: minor

File size: 6.2 KB
Line 
1%SOLIDEARTH class definition
2%
3% Usage:
4% solidearth=solidearth();
5
6classdef solidearth
7 properties (SetAccess=public)
8 initialsealevel = NaN;
9 settings = solidearthsettings();
10 external = [];
11 surfaceload = surfaceload();
12 lovenumbers = lovenumbers();
13 rotational = rotational();
14 planetradius = planetradius('earth');
15 requested_outputs = {};
16 transitions = {};
17 partitionice = [];
18 partitionhydro = [];
19 end
20 methods (Static)
21 function self = loadobj(self) % {{{
22 % This function is directly called by matlab when a model object is
23 % loaded. If the input is a struct it is an old version of this class and
24 % old fields must be recovered (make sure they are in the deprecated
25 % model properties)
26
27 if isstruct(self)
28 % 2021, Jan 10
29 if isfield(self,'sealevel')
30 self.initialsealevel = self.sealevel;
31 end
32 self = structtoobj(solidearth(),self);
33
34 end
35 end% }}}
36 end
37 methods
38 function self = solidearth(varargin) % {{{
39 switch nargin
40 case 0
41 self=setdefaultparameters(self,'earth');
42 case 1
43 self=setdefaultparameters(self,varargin{:});
44 otherwise
45 error('solidearth constructor error message: zero or one argument only!');
46 end
47 end % }}}
48 function self = setdefaultparameters(self,planet) % {{{
49
50 %output default:
51 self.requested_outputs={'default'};
52
53 %transitions should be a cell array of vectors:
54 self.transitions={};
55
56 %no partitions requested for barystatic contribution:
57 self.partitionice=[];
58 self.partitionhydro=[];
59
60 %no external solutions by default:
61 self.external=[];
62
63 %earth radius
64 self.planetradius= planetradius(planet);
65
66 end % }}}
67 function md = checkconsistency(self,md,solution,analyses) % {{{
68
69 if ~ismember('SealevelchangeAnalysis',analyses) | (strcmp(solution,'TransientSolution') & md.transient.isslc==0),
70 return;
71 end
72
73 md = checkfield(md,'fieldname','solidearth.initialsealevel','NaN',1,'Inf',1,'size',[md.mesh.numberofvertices 1]);
74 md = checkfield(md,'fieldname','solidearth.requested_outputs','stringrow',1);
75
76 self.settings.checkconsistency(md,solution,analyses);
77 self.surfaceload.checkconsistency(md,solution,analyses);
78 self.lovenumbers.checkconsistency(md,solution,analyses);
79 self.rotational.checkconsistency(md,solution,analyses);
80 if ~isempty(self.external),
81 if ~isa(self.external,'solidearthsolution'),
82 error('solidearth consistency check: external field should be a solidearthsolution');
83 end
84 self.external.checkconsistency(md,solution,analyses);
85 end
86
87
88 end % }}}
89 function list=defaultoutputs(self,md) % {{{
90 list = {'Sealevel'};
91 end % }}}
92 function disp(self) % {{{
93 disp(sprintf(' solidearth inputs, forcings and settings:'));
94
95 fielddisplay(self,'initialsealevel','sea level at the start of computation [m]');
96 fielddisplay(self,'planetradius','planet radius [m]');
97 fielddisplay(self,'transitions','indices into parts of the mesh that will be icecaps');
98 fielddisplay(self,'requested_outputs','additional outputs requested');
99 fielddisplay(self,'partitionice','ice partition vector for barystatic contribution');
100 fielddisplay(self,'partitionhydro','hydro partition vector for barystatic contribution');
101 if isempty(self.external), fielddisplay(self,'external','external solution, of the type solidearthsolution'); end
102 self.settings.disp();
103 self.surfaceload.disp();
104 self.lovenumbers.disp();
105 self.rotational.disp();
106 if ~isempty(self.external),
107 self.external.disp();
108 end
109
110 end % }}}
111 function marshall(self,prefix,md,fid) % {{{
112
113 WriteData(fid,prefix,'object',self,'fieldname','initialsealevel','mattype',1,'format','DoubleMat','timeserieslength',md.mesh.numberofvertices+1,'yts',md.constants.yts);
114 WriteData(fid,prefix,'object',self,'fieldname','planetradius','format','Double');
115 WriteData(fid,prefix,'object',self,'fieldname','transitions','format','MatArray');
116
117 if ~isempty(self.partitionice),
118 npartice=max(self.partitionice)+2;
119 else
120 npartice=0;
121 end
122 if ~isempty(self.partitionhydro),
123 nparthydro=max(self.partitionhydro)+2;
124 else
125 nparthydro=0;
126 end
127
128
129 WriteData(fid,prefix,'object',self,'fieldname','partitionice','mattype',1,'format','DoubleMat');
130 WriteData(fid,prefix,'data',npartice,'format','Integer','name','md.solidearth.npartice');
131 WriteData(fid,prefix,'object',self,'fieldname','partitionhydro','mattype',1,'format','DoubleMat');
132 WriteData(fid,prefix,'data',nparthydro,'format','Integer','name','md.solidearth.nparthydro');
133
134 self.settings.marshall(prefix,md,fid);
135 self.surfaceload.marshall(prefix,md,fid);
136 self.lovenumbers.marshall(prefix,md,fid);
137 self.rotational.marshall(prefix,md,fid);
138 if ~isempty(self.external),
139 WriteData(fid,prefix,'data',1,'format','Integer','name','md.solidearth.isexternal');
140 self.external.marshall(prefix,md,fid);
141 else
142 WriteData(fid,prefix,'data',0,'format','Integer','name','md.solidearth.isexternal');
143 end
144
145 %process requested outputs
146 outputs = self.requested_outputs;
147 pos = find(ismember(outputs,'default'));
148 if ~isempty(pos),
149 outputs(pos) = []; %remove 'default' from outputs
150 outputs = [outputs defaultoutputs(self,md)]; %add defaults
151 end
152 WriteData(fid,prefix,'data',outputs,'name','md.solidearth.requested_outputs','format','StringArray');
153
154 end % }}}
155 function savemodeljs(self,fid,modelname) % {{{
156
157 writejs1Darray(fid,[modelname '.solidearth.initialsealevel'],self.initialsealevel);
158 self.settings.savemodeljs(fid,modelname);
159 self.surfaceload.savemodeljs(fid,modelname);
160 self.lovenumbers.savemodeljs(fid,modelname);
161 self.rotational.savemodeljs(fid,modelname);
162 if ~isempty(self.external),
163 self.external.savemodeljs(fid,modelname);
164 end
165 writejscellstring(fid,[modelname '.solidearth.requested_outputs'],self.requested_outputs);
166 writejscellarray(fid,[modelname '.solidearth.transitions'],self.transitions);
167 writejscellarray(fid,[modelname '.solidearth.partition'],self.partition);
168 end % }}}
169 function self = extrude(self,md) % {{{
170 self.initialsealevel=project3d(md,'vector',self.initialsealevel,'type','node');
171 end % }}}
172 end
173end
Note: See TracBrowser for help on using the repository browser.