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

Last change on this file since 26358 was 26358, checked in by jdquinn, 4 years ago

CHG: Completed MATLAB -> Python updates for SE; archive updates now that GMSH can be used on macOS and Linux; various minor bug fixes; formatting; cleanup

File size: 5.9 KB
RevLine 
[25118]1%SOLIDEARTH class definition
2%
3% Usage:
4% solidearth=solidearth();
[26307]5% solidearth=solidearth('earth');
[25118]6
7classdef solidearth
8 properties (SetAccess=public)
9 settings = solidearthsettings();
[25763]10 external = [];
[25144]11 lovenumbers = lovenumbers();
[25118]12 rotational = rotational();
13 planetradius = planetradius('earth');
14 requested_outputs = {};
15 transitions = {};
[25758]16 partitionice = [];
17 partitionhydro = [];
[26099]18 partitionocean = [];
[25118]19 end
[25969]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
[25118]37 methods
38 function self = solidearth(varargin) % {{{
39 switch nargin
40 case 0
[25767]41 self=setdefaultparameters(self,'earth');
42 case 1
43 self=setdefaultparameters(self,varargin{:});
[25118]44 otherwise
[25767]45 error('solidearth constructor error message: zero or one argument only!');
[25118]46 end
47 end % }}}
[26301]48 function disp(self) % {{{
49 disp(sprintf(' solidearth inputs, forcings and settings:'));
50
51 fielddisplay(self,'planetradius','planet radius [m]');
52 fielddisplay(self,'transitions','indices into parts of the mesh that will be icecaps');
53 fielddisplay(self,'requested_outputs','additional outputs requested');
54 fielddisplay(self,'partitionice','ice partition vector for barystatic contribution');
55 fielddisplay(self,'partitionhydro','hydro partition vector for barystatic contribution');
56 fielddisplay(self,'partitionocean','ocean partition vector for barystatic contribution');
57 if isempty(self.external), fielddisplay(self,'external','external solution, of the type solidearthsolution'); end
58 self.settings.disp();
59 self.lovenumbers.disp();
60 self.rotational.disp();
61 if ~isempty(self.external),
62 self.external.disp();
63 end
64
65 end % }}}
[25767]66 function self = setdefaultparameters(self,planet) % {{{
[25118]67
[25767]68 %output default:
69 self.requested_outputs={'default'};
[25751]70
[26358]71 %transitions should be a cell array of vectors:
[25767]72 self.transitions={};
[26358]73
74 %no partitions requested for barystatic contribution:
[25767]75 self.partitionice=[];
76 self.partitionhydro=[];
[26099]77 self.partitionocean=[];
[25763]78
[26358]79 %no external solutions by default:
[25767]80 self.external=[];
81
[26307]82 %planet radius
[25767]83 self.planetradius= planetradius(planet);
[26358]84
[25118]85 end % }}}
86 function md = checkconsistency(self,md,solution,analyses) % {{{
87
[25956]88 if ~ismember('SealevelchangeAnalysis',analyses) | (strcmp(solution,'TransientSolution') & md.transient.isslc==0),
[25118]89 return;
90 end
91
92 md = checkfield(md,'fieldname','solidearth.requested_outputs','stringrow',1);
93
94 self.settings.checkconsistency(md,solution,analyses);
[25144]95 self.lovenumbers.checkconsistency(md,solution,analyses);
[25118]96 self.rotational.checkconsistency(md,solution,analyses);
[25763]97 if ~isempty(self.external),
98 if ~isa(self.external,'solidearthsolution'),
99 error('solidearth consistency check: external field should be a solidearthsolution');
100 end
101 self.external.checkconsistency(md,solution,analyses);
102 end
[25118]103
104 end % }}}
105 function list=defaultoutputs(self,md) % {{{
106 list = {'Sealevel'};
107 end % }}}
108 function marshall(self,prefix,md,fid) % {{{
[26299]109
[25118]110 WriteData(fid,prefix,'object',self,'fieldname','planetradius','format','Double');
111 WriteData(fid,prefix,'object',self,'fieldname','transitions','format','MatArray');
[26299]112
[25751]113 if ~isempty(self.partitionice),
114 npartice=max(self.partitionice)+2;
115 else
116 npartice=0;
117 end
[26358]118
[25751]119 if ~isempty(self.partitionhydro),
120 nparthydro=max(self.partitionhydro)+2;
121 else
122 nparthydro=0;
123 end
[26099]124 if ~isempty(self.partitionocean),
125 npartocean=max(self.partitionocean)+2;
126 else
127 npartocean=0;
128 end
[25118]129
[25751]130 WriteData(fid,prefix,'object',self,'fieldname','partitionice','mattype',1,'format','DoubleMat');
131 WriteData(fid,prefix,'data',npartice,'format','Integer','name','md.solidearth.npartice');
132 WriteData(fid,prefix,'object',self,'fieldname','partitionhydro','mattype',1,'format','DoubleMat');
133 WriteData(fid,prefix,'data',nparthydro,'format','Integer','name','md.solidearth.nparthydro');
[26099]134 WriteData(fid,prefix,'object',self,'fieldname','partitionocean','mattype',1,'format','DoubleMat');
135 WriteData(fid,prefix,'data',npartocean,'format','Integer','name','md.solidearth.npartocean');
[26299]136
[25118]137 self.settings.marshall(prefix,md,fid);
[25144]138 self.lovenumbers.marshall(prefix,md,fid);
[25118]139 self.rotational.marshall(prefix,md,fid);
[25763]140 if ~isempty(self.external),
[25947]141 WriteData(fid,prefix,'data',1,'format','Integer','name','md.solidearth.isexternal');
[25763]142 self.external.marshall(prefix,md,fid);
[25947]143 else
144 WriteData(fid,prefix,'data',0,'format','Integer','name','md.solidearth.isexternal');
[25763]145 end
[26299]146
[25118]147 %process requested outputs
148 outputs = self.requested_outputs;
[26299]149 pos = find(ismember(outputs,'default'));
[25118]150 if ~isempty(pos),
151 outputs(pos) = []; %remove 'default' from outputs
152 outputs = [outputs defaultoutputs(self,md)]; %add defaults
153 end
154 WriteData(fid,prefix,'data',outputs,'name','md.solidearth.requested_outputs','format','StringArray');
155
156 end % }}}
[26299]157 function self = extrude(self,md) % {{{
158 end % }}}
[25118]159 function savemodeljs(self,fid,modelname) % {{{
160
161 self.settings.savemodeljs(fid,modelname);
[25144]162 self.lovenumbers.savemodeljs(fid,modelname);
[25118]163 self.rotational.savemodeljs(fid,modelname);
[25763]164 if ~isempty(self.external),
165 self.external.savemodeljs(fid,modelname);
166 end
[25118]167 writejscellstring(fid,[modelname '.solidearth.requested_outputs'],self.requested_outputs);
168 writejscellarray(fid,[modelname '.solidearth.transitions'],self.transitions);
[25751]169 writejscellarray(fid,[modelname '.solidearth.partition'],self.partition);
[25118]170 end % }}}
171 end
172end
Note: See TracBrowser for help on using the repository browser.