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

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

CHG: fixing issues with elastic vs rigid vs rotation.

File size: 5.4 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
21 function self = solidearth(varargin) % {{{
22 switch nargin
23 case 0
24 self=setdefaultparameters(self);
25 otherwise
26 error('constructor not supported');
27 end
28 end % }}}
29 function self = setdefaultparameters(self) % {{{
30
31 %output default:
32 self.requested_outputs={'default'};
33
34 %transitions should be a cell array of vectors:
35 self.transitions={};
36
37 %no partitions requested for barystatic contribution:
38 self.partitionice=[];
39 self.partitionhydro=[];
40
41 %no external solutions by defalt:
42 self.external=[];
43
44 %earth radius
45 self.planetradius= planetradius('earth');
46
47 end % }}}
48 function md = checkconsistency(self,md,solution,analyses) % {{{
49
50 if ~ismember('SealevelriseAnalysis',analyses) | (strcmp(solution,'TransientSolution') & md.transient.isslr==0),
51 return;
52 end
53
54 md = checkfield(md,'fieldname','solidearth.initialsealevel','NaN',1,'Inf',1,'size',[md.mesh.numberofvertices 1]);
55 md = checkfield(md,'fieldname','solidearth.requested_outputs','stringrow',1);
56
57 self.settings.checkconsistency(md,solution,analyses);
58 self.surfaceload.checkconsistency(md,solution,analyses);
59 self.lovenumbers.checkconsistency(md,solution,analyses);
60 self.rotational.checkconsistency(md,solution,analyses);
61 if ~isempty(self.external),
62 if ~isa(self.external,'solidearthsolution'),
63 error('solidearth consistency check: external field should be a solidearthsolution');
64 end
65 self.external.checkconsistency(md,solution,analyses);
66 end
67
68
69 end % }}}
70 function list=defaultoutputs(self,md) % {{{
71 list = {'Sealevel'};
72 end % }}}
73 function disp(self) % {{{
74 disp(sprintf(' solidearth inputs, forcings and settings:'));
75
76 fielddisplay(self,'initialsealevel','sea level at the start of computation) [m]');
77 fielddisplay(self,'planetradius','planet radius [m]');
78 fielddisplay(self,'transitions','indices into parts of the mesh that will be icecaps');
79 fielddisplay(self,'requested_outputs','additional outputs requested');
80 fielddisplay(self,'partitionice','ice partition vector for barystatic contribution');
81 fielddisplay(self,'partitionhydro','hydro partition vector for barystatic contribution');
82 if isempty(self.external), fielddisplay(self,'external','external solution, of the type solidearthsolution'); end
83 self.settings.disp();
84 self.surfaceload.disp();
85 self.lovenumbers.disp();
86 self.rotational.disp();
87 if ~isempty(self.external),
88 self.external.disp();
89 end
90
91 end % }}}
92 function marshall(self,prefix,md,fid) % {{{
93
94 WriteData(fid,prefix,'object',self,'fieldname','initialsealevel','mattype',1,'format','DoubleMat','timeserieslength',md.mesh.numberofvertices+1,'yts',md.constants.yts);
95 WriteData(fid,prefix,'object',self,'fieldname','planetradius','format','Double');
96 WriteData(fid,prefix,'object',self,'fieldname','transitions','format','MatArray');
97
98 if ~isempty(self.partitionice),
99 npartice=max(self.partitionice)+2;
100 else
101 npartice=0;
102 end
103 if ~isempty(self.partitionhydro),
104 nparthydro=max(self.partitionhydro)+2;
105 else
106 nparthydro=0;
107 end
108
109
110 WriteData(fid,prefix,'object',self,'fieldname','partitionice','mattype',1,'format','DoubleMat');
111 WriteData(fid,prefix,'data',npartice,'format','Integer','name','md.solidearth.npartice');
112 WriteData(fid,prefix,'object',self,'fieldname','partitionhydro','mattype',1,'format','DoubleMat');
113 WriteData(fid,prefix,'data',nparthydro,'format','Integer','name','md.solidearth.nparthydro');
114
115 self.settings.marshall(prefix,md,fid);
116 self.surfaceload.marshall(prefix,md,fid);
117 self.lovenumbers.marshall(prefix,md,fid);
118 self.rotational.marshall(prefix,md,fid);
119 if ~isempty(self.external),
120 self.external.marshall(prefix,md,fid);
121 end
122
123 %process requested outputs
124 outputs = self.requested_outputs;
125 pos = find(ismember(outputs,'default'));
126 if ~isempty(pos),
127 outputs(pos) = []; %remove 'default' from outputs
128 outputs = [outputs defaultoutputs(self,md)]; %add defaults
129 end
130 WriteData(fid,prefix,'data',outputs,'name','md.solidearth.requested_outputs','format','StringArray');
131
132 end % }}}
133 function savemodeljs(self,fid,modelname) % {{{
134
135 writejs1Darray(fid,[modelname '.solidearth.initialsealevel'],self.initialsealevel);
136 self.settings.savemodeljs(fid,modelname);
137 self.surfaceload.savemodeljs(fid,modelname);
138 self.lovenumbers.savemodeljs(fid,modelname);
139 self.rotational.savemodeljs(fid,modelname);
140 if ~isempty(self.external),
141 self.external.savemodeljs(fid,modelname);
142 end
143 writejscellstring(fid,[modelname '.solidearth.requested_outputs'],self.requested_outputs);
144 writejscellarray(fid,[modelname '.solidearth.transitions'],self.transitions);
145 writejscellarray(fid,[modelname '.solidearth.partition'],self.partition);
146 end % }}}
147 function self = extrude(self,md) % {{{
148 self.initialsealevel=project3d(md,'vector',self.initialsealevel,'type','node');
149 end % }}}
150 end
151end
Note: See TracBrowser for help on using the repository browser.