source: issm/trunk/src/m/classes/spatiallinearbasalforcings.py@ 27035

Last change on this file since 27035 was 27035, checked in by Mathieu Morlighem, 3 years ago

merged trunk-jpl and trunk for revision 27033

File size: 8.3 KB
Line 
1import numpy as np
2
3from checkfield import checkfield
4from fielddisplay import fielddisplay
5from project3d import project3d
6from structtoobj import structtoobj
7from WriteData import WriteData
8
9
10class spatiallinearbasalforcings(object):
11 """SPATIAL LINEAR BASAL FORCINGS class definition
12
13 Usage:
14 spatiallinearbasalforcings = spatiallinearbasalforcings()
15 """
16
17 def __init__(self, *args): #{{{
18 nargs = len(args)
19 if nargs == 0:
20 self.groundedice_melting_rate = np.nan
21 self.deepwater_melting_rate = np.nan
22 self.deepwater_elevation = np.nan
23 self.upperwater_melting_rate = np.nan
24 self.upperwater_elevation = np.nan
25 self.geothermalflux = np.nan
26 self.perturbation_melting_rate = np.nan
27
28 self.setdefaultparameters()
29 elif nargs == 1:
30 lb = args[0]
31 if lb.__module__ == 'linearbasalforcings':
32 nvertices = len(lb.groundedice_melting_rate)
33 self.groundedice_melting_rate = lb.groundedice_melting_rate
34 self.geothermalflux = lb.geothermalflux
35 self.deepwater_elevation = lb.deepwater_elevation * np.ones((nvertices, ))
36 self.deepwater_melting_rate = lb.deepwater_melting_rate * np.ones((nvertices, ))
37 self.upperwater_melting_rate = lb.upperwater_melting_rate * np.ones((nvertices, ))
38 self.upperwater_elevation = lb.upperwater_elevation * np.ones((nvertices, ))
39 self.perturbation_melting_rate = lb.perturbation_melting_rate * np.ones((nvertices, ))
40 else:
41 # TODO: This has not been tested
42 self = structtoobj(self, lb)
43 else:
44 raise Exception('constructor not supported')
45 #}}}
46
47 def __repr__(self): #{{{
48 s = ' spatial linear basal forcings parameters:\n'
49 s += '{}\n'.format(fielddisplay(self, 'groundedice_melting_rate', 'basal melting rate (positive if melting) [m/yr]'))
50 s += '{}\n'.format(fielddisplay(self, 'deepwater_melting_rate', 'basal melting rate (positive if melting applied for floating ice whith base < deepwater_elevation) [m/yr]'))
51 s += '{}\n'.format(fielddisplay(self, 'deepwater_elevation', 'elevation of ocean deepwater [m]'))
52 s += '{}\n'.format(fielddisplay(self, 'upperwater_melting_rate', 'basal melting rate (positive if melting applied for floating ice whith base >= upperwater_elevation) [m/yr]'))
53 s += '{}\n'.format(fielddisplay(self, 'upperwater_elevation', 'elevation of ocean upperwater [m]'))
54 s += '{}\n'.format(fielddisplay(self, 'perturbation_melting_rate', 'basal melting rate perturbation added to computed melting rate (positive if melting) [m/yr]'))
55 s += '{}\n'.format(fielddisplay(self, 'geothermalflux', 'geothermal heat flux [W/m^2]'))
56 return s
57 #}}}
58
59 def extrude(self, md): #{{{
60 self.groundedice_melting_rate = project3d(md, 'vector', self.groundedice_melting_rate, 'type', 'node', 'layer', 1)
61 self.deepwater_melting_rate = project3d(md, 'vector', self.deepwater_melting_rate, 'type', 'node', 'layer', 1)
62 self.deepwater_elevation = project3d(md, 'vector', self.deepwater_elevation, 'type', 'node', 'layer', 1)
63 self.upperwater_melting_rate = project3d(md, 'vector', self.upperwater_melting_rate, 'type', 'node', 'layer', 1)
64 self.upperwater_elevation = project3d(md, 'vector', self.upperwater_elevation, 'type', 'node', 'layer', 1)
65 self.geothermalflux = project3d(md, 'vector', self.geothermalflux, 'type', 'node', 'layer', 1) # Bedrock only gets geothermal flux
66 self.perturbation_melting_rate = project3d(md, 'vector', self.upperwater_melting_rate, 'type', 'node', 'layer', 1)
67 return self
68 #}}}
69
70 def initialize(self, md): #{{{
71 if np.all(np.isnan(self.groundedice_melting_rate)):
72 self.groundedice_melting_rate = np.zeros((md.mesh.numberofvertices))
73 print(' no basalforcings.groundedice_melting_rate specified: values set as zero')
74 return self
75 #}}}
76
77 def setdefaultparameters(self): #{{{
78 return self
79 #}}}
80
81 def checkconsistency(self, md, solution, analyses): #{{{
82 if not np.all(np.isnan(self.perturbation_melting_rate)):
83 md = checkfield(md, 'fieldname', 'basalforcings.perturbation_melting_rate', 'NaN', 1, 'Inf', 1, 'timeseries', 1)
84 if 'MasstransportAnalysis' in analyses and not solution == 'TransientSolution' and not md.transient.ismasstransport:
85 md = checkfield(md, 'fieldname', 'basalforcings.groundedice_melting_rate', 'NaN', 1, 'Inf', 1, 'timeseries', 1)
86 md = checkfield(md, 'fieldname', 'basalforcings.deepwater_melting_rate', 'NaN', 1, 'Inf', 1, 'timeseries', 1, '>=', 0)
87 md = checkfield(md, 'fieldname', 'basalforcings.deepwater_elevation', 'NaN', 1, 'Inf', 1, 'timeseries', 1)
88 md = checkfield(md, 'fieldname', 'basalforcings.upperwater_melting_rate', 'NaN', 1, 'Inf', 1, 'timeseries', 1, '>=', 0)
89 md = checkfield(md, 'fieldname', 'basalforcings.upperwater_elevation', 'NaN', 1, 'Inf', 1, 'timeseries', 1, '<', 0)
90 if 'BalancethicknessAnalysis' in analyses:
91 raise Exception('not implemented yet!')
92 md = checkfield(md, 'fieldname', 'basalforcings.groundedice_melting_rate', 'NaN', 1, 'Inf', 1, 'size', [md.mesh.numberofvertices])
93 md = checkfield(md, 'fieldname', 'basalforcings.deepwater_melting_rate', '>=', 0, 'numel', 1)
94 md = checkfield(md, 'fieldname', 'basalforcings.deepwater_elevation', '<', 'basalforcings.upperwater_elevation', 'numel', 1)
95 md = checkfield(md, 'fieldname', 'basalforcings.upperwater_melting_rate', '>=', 0, 'numel', 1)
96 md = checkfield(md, 'fieldname', 'basalforcings.upperwater_elevation', '<=', 0, 'numel', 1)
97 if 'ThermalAnalysis' in analyses and not solution == 'TransientSolution' and not md.transient.isthermal:
98 raise Exception('not implemented yet!')
99 md = checkfield(md, 'fieldname', 'basalforcings.groundedice_melting_rate', 'NaN', 1, 'Inf', 1, 'timeseries', 1)
100 md = checkfield(md, 'fieldname', 'basalforcings.deepwater_melting_rate', '>=', 0, 'numel', 1)
101 md = checkfield(md, 'fieldname', 'basalforcings.deepwater_elevation', '<', 'basalforcings.upperwater_elevation', 'numel', 1)
102 md = checkfield(md, 'fieldname', 'basalforcings.upperwater_elevation', '<', 0, 'numel', 1)
103 md = checkfield(md, 'fieldname', 'basalforcings.deepwater_melting_rate', '>=', 0, 'numel', 1)
104 md = checkfield(md, 'fieldname', 'basalforcings.geothermalflux', 'NaN', 1, 'Inf', 1, 'timeseries', 1, '>=', 0)
105 return md
106 # }}}
107
108 def marshall(self, prefix, md, fid): #{{{
109 yts = md.constants.yts
110
111 WriteData(fid, prefix, 'name', 'md.basalforcings.model', 'data', 6, 'format', 'Integer')
112 WriteData(fid, prefix, 'object', self, 'fieldname', 'groundedice_melting_rate', 'format', 'DoubleMat', 'name', 'md.basalforcings.groundedice_melting_rate', 'mattype', 1, 'scale', 1. / yts, 'timeserieslength', md.mesh.numberofvertices + 1,'yts', md.constants.yts)
113 WriteData(fid, prefix,'object', self, 'fieldname', 'geothermalflux', 'name', 'md.basalforcings.geothermalflux', 'format', 'DoubleMat', 'mattype', 1,'timeserieslength', md.mesh.numberofvertices + 1, 'yts', md.constants.yts)
114 WriteData(fid, prefix, 'object', self, 'fieldname', 'deepwater_melting_rate', 'format', 'DoubleMat', 'name', 'md.basalforcings.deepwater_melting_rate', 'scale', 1. / yts, 'mattype', 1)
115 WriteData(fid, prefix, 'object', self, 'fieldname', 'deepwater_elevation', 'format', 'DoubleMat', 'name', 'md.basalforcings.deepwater_elevation', 'mattype', 1)
116 WriteData(fid, prefix, 'object', self, 'fieldname', 'upperwater_melting_rate', 'format', 'DoubleMat', 'name', 'md.basalforcings.upperwater_melting_rate', 'scale', 1. / yts, 'mattype', 1)
117 WriteData(fid, prefix, 'object', self, 'fieldname', 'upperwater_elevation', 'format', 'DoubleMat', 'name', 'md.basalforcings.upperwater_elevation', 'mattype', 1)
118 WriteData(fid, prefix, 'object', self, 'fieldname', 'perturbation_melting_rate', 'format', 'DoubleMat', 'name', 'md.basalforcings.perturbation_melting_rate', 'scale', 1. / yts, 'mattype', 1)
119 #}}}
Note: See TracBrowser for help on using the repository browser.