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

Last change on this file was 28013, checked in by Mathieu Morlighem, 16 months ago

merged trunk-jpl and trunk for revision 28011

File size: 8.3 KB
RevLine 
[25688]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
[28013]17 def __init__(self, *args): # {{{
[25762]18 nargs = len(args)
[25688]19 if nargs == 0:
20 self.groundedice_melting_rate = np.nan
21 self.deepwater_melting_rate = np.nan
22 self.deepwater_elevation = np.nan
[27035]23 self.upperwater_melting_rate = np.nan
[25688]24 self.upperwater_elevation = np.nan
25 self.geothermalflux = np.nan
[27035]26 self.perturbation_melting_rate = np.nan
[25688]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
[27035]34 self.geothermalflux = lb.geothermalflux
[25688]35 self.deepwater_elevation = lb.deepwater_elevation * np.ones((nvertices, ))
[27035]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, ))
[25688]40 else:
41 # TODO: This has not been tested
42 self = structtoobj(self, lb)
43 else:
44 raise Exception('constructor not supported')
[28013]45 # }}}
[25688]46
[28013]47 def __repr__(self): # {{{
[25688]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]'))
[27035]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]'))
[25688]53 s += '{}\n'.format(fielddisplay(self, 'upperwater_elevation', 'elevation of ocean upperwater [m]'))
[27035]54 s += '{}\n'.format(fielddisplay(self, 'perturbation_melting_rate', 'basal melting rate perturbation added to computed melting rate (positive if melting) [m/yr]'))
[25688]55 s += '{}\n'.format(fielddisplay(self, 'geothermalflux', 'geothermal heat flux [W/m^2]'))
56 return s
[28013]57 # }}}
[25688]58
[28013]59 def extrude(self, md): # {{{
[25688]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)
[27035]63 self.upperwater_melting_rate = project3d(md, 'vector', self.upperwater_melting_rate, 'type', 'node', 'layer', 1)
[25688]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
[27035]66 self.perturbation_melting_rate = project3d(md, 'vector', self.upperwater_melting_rate, 'type', 'node', 'layer', 1)
[25688]67 return self
[28013]68 # }}}
[25688]69
[28013]70 def initialize(self, md): # {{{
[25688]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
[28013]75 # }}}
[25688]76
[28013]77 def setdefaultparameters(self): # {{{
[25688]78 return self
[28013]79 # }}}
[25688]80
[28013]81 def checkconsistency(self, md, solution, analyses): # {{{
[27035]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)
[25688]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)
[27035]88 md = checkfield(md, 'fieldname', 'basalforcings.upperwater_melting_rate', 'NaN', 1, 'Inf', 1, 'timeseries', 1, '>=', 0)
[25688]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])
[25762]93 md = checkfield(md, 'fieldname', 'basalforcings.deepwater_melting_rate', '>=', 0, 'numel', 1)
[25688]94 md = checkfield(md, 'fieldname', 'basalforcings.deepwater_elevation', '<', 'basalforcings.upperwater_elevation', 'numel', 1)
[27035]95 md = checkfield(md, 'fieldname', 'basalforcings.upperwater_melting_rate', '>=', 0, 'numel', 1)
[25688]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)
[27035]103 md = checkfield(md, 'fieldname', 'basalforcings.deepwater_melting_rate', '>=', 0, 'numel', 1)
[25688]104 md = checkfield(md, 'fieldname', 'basalforcings.geothermalflux', 'NaN', 1, 'Inf', 1, 'timeseries', 1, '>=', 0)
105 return md
106 # }}}
107
[28013]108 def marshall(self, prefix, md, fid): # {{{
[25688]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)
[27035]116 WriteData(fid, prefix, 'object', self, 'fieldname', 'upperwater_melting_rate', 'format', 'DoubleMat', 'name', 'md.basalforcings.upperwater_melting_rate', 'scale', 1. / yts, 'mattype', 1)
[25688]117 WriteData(fid, prefix, 'object', self, 'fieldname', 'upperwater_elevation', 'format', 'DoubleMat', 'name', 'md.basalforcings.upperwater_elevation', 'mattype', 1)
[27035]118 WriteData(fid, prefix, 'object', self, 'fieldname', 'perturbation_melting_rate', 'format', 'DoubleMat', 'name', 'md.basalforcings.perturbation_melting_rate', 'scale', 1. / yts, 'mattype', 1)
[28013]119 # }}}
Note: See TracBrowser for help on using the repository browser.