1 | import numpy as np
|
---|
2 |
|
---|
3 | from checkfield import checkfield
|
---|
4 | from fielddisplay import fielddisplay
|
---|
5 | from project3d import project3d
|
---|
6 | from WriteData import WriteData
|
---|
7 |
|
---|
8 |
|
---|
9 | class matenhancedice(object):
|
---|
10 | """MATICE class definition
|
---|
11 |
|
---|
12 | Usage:
|
---|
13 | matenhancedice = matenhancedice()
|
---|
14 | """
|
---|
15 |
|
---|
16 | def __init__(self): # {{{
|
---|
17 | self.rho_ice = 0
|
---|
18 | self.rho_water = 0
|
---|
19 | self.rho_freshwater = 0
|
---|
20 | self.mu_water = 0
|
---|
21 | self.heatcapacity = 0
|
---|
22 | self.latentheat = 0
|
---|
23 | self.thermalconductivity = 0
|
---|
24 | self.temperateiceconductivity = 0
|
---|
25 | self.effectiveconductivity_averaging = 0
|
---|
26 | self.meltingpoint = 0
|
---|
27 | self.beta = 0
|
---|
28 | self.mixed_layer_capacity = 0
|
---|
29 | self.thermal_exchange_velocity = 0
|
---|
30 | self.rheology_E = np.nan
|
---|
31 | self.rheology_B = np.nan
|
---|
32 | self.rheology_n = np.nan
|
---|
33 | self.rheology_law = ''
|
---|
34 |
|
---|
35 | #SLC
|
---|
36 | self.earth_density = 0
|
---|
37 |
|
---|
38 | self.setdefaultparameters()
|
---|
39 | # }}}
|
---|
40 |
|
---|
41 | def __repr__(self): # {{{
|
---|
42 | s = ' Materials:\n'
|
---|
43 | s += '{}\n'.format(fielddisplay(self, 'rho_ice', 'ice density [kg/m^3]'))
|
---|
44 | s += '{}\n'.format(fielddisplay(self, 'rho_water', 'water density [kg/m^3]'))
|
---|
45 | s += '{}\n'.format(fielddisplay(self, 'rho_freshwater', 'fresh water density [kg/m^3]'))
|
---|
46 | s += '{}\n'.format(fielddisplay(self, 'mu_water', 'water viscosity [N s/m^2]'))
|
---|
47 | s += '{}\n'.format(fielddisplay(self, 'heatcapacity', 'heat capacity [J/kg/K]'))
|
---|
48 | s += '{}\n'.format(fielddisplay(self, 'thermalconductivity', 'ice thermal conductivity [W/m/K]'))
|
---|
49 | s += '{}\n'.format(fielddisplay(self, 'temperateiceconductivity', 'temperate ice thermal conductivity [W/m/K]'))
|
---|
50 | s += '{}\n'.format(fielddisplay(self, 'effectiveconductivity_averaging', 'computation of effectiveconductivity: (0) arithmetic mean, (1) harmonic mean, (2) geometric mean (default)'))
|
---|
51 | s += '{}\n'.format(fielddisplay(self, 'meltingpoint', 'melting point of ice at 1atm in K'))
|
---|
52 | s += '{}\n'.format(fielddisplay(self, 'latentheat', 'latent heat of fusion [J/m^3]'))
|
---|
53 | s += '{}\n'.format(fielddisplay(self, 'beta', 'rate of change of melting point with pressure [K/Pa]'))
|
---|
54 | s += '{}\n'.format(fielddisplay(self, 'mixed_layer_capacity', 'mixed layer capacity [W/kg/K]'))
|
---|
55 | s += '{}\n'.format(fielddisplay(self, 'thermal_exchange_velocity', 'thermal exchange velocity [m/s]'))
|
---|
56 | s += '{}\n'.format(fielddisplay(self, 'rheology_E', 'enhancement factor'))
|
---|
57 | s += '{}\n'.format(fielddisplay(self, 'rheology_B', 'flow law parameter [Pa s^(1/n)]'))
|
---|
58 | s += '{}\n'.format(fielddisplay(self, 'rheology_n', 'Glen\'s flow law exponent'))
|
---|
59 | s += '{}\n'.format(fielddisplay(self, 'rheology_law', 'law for the temperature dependance of the rheology: \'None\', \'BuddJacka\', \'Cuffey\', \'CuffeyTemperate\', \'Paterson\', \'Arrhenius\' or \'LliboutryDuval\''))
|
---|
60 | s += '{}\n'.format(fielddisplay(self, 'earth_density', 'Mantle density [kg/m^-3]'))
|
---|
61 |
|
---|
62 | return s
|
---|
63 | # }}}
|
---|
64 |
|
---|
65 | def extrude(self, md): # {{{
|
---|
66 | self.rheology_E = project3d(md, 'vector', self.rheology_E, 'type', 'node')
|
---|
67 | self.rheology_B = project3d(md, 'vector', self.rheology_B, 'type', 'node')
|
---|
68 | self.rheology_n = project3d(md, 'vector', self.rheology_n, 'type', 'element')
|
---|
69 | return self
|
---|
70 | # }}}
|
---|
71 |
|
---|
72 | def setdefaultparameters(self): # {{{
|
---|
73 | # Ice density (kg/m^3)
|
---|
74 | self.rho_ice = 917.0
|
---|
75 | # Ocean water density (kg/m^3)
|
---|
76 | self.rho_water = 1023.0
|
---|
77 | # Fresh water density (kg/m^3)
|
---|
78 | self.rho_freshwater = 1000.0
|
---|
79 | # Water viscosity (N.s/m^2)
|
---|
80 | self.mu_water = 0.001787
|
---|
81 | # Ice heat capacity cp (J/kg/K)
|
---|
82 | self.heatcapacity = 2093.0
|
---|
83 | # Ice latent heat of fusion L (J/kg)
|
---|
84 | self.latentheat = 3.34 * pow(10, 5)
|
---|
85 | # Ice thermal conductivity (W/m/K)
|
---|
86 | self.thermalconductivity = 2.4
|
---|
87 | # Temperate ice thermal conductivity (W/m/K)
|
---|
88 | self.temperateiceconductivity = 0.24
|
---|
89 | # Computation of effective conductivity
|
---|
90 | self.effectiveconductivity_averaging = 1
|
---|
91 | # The melting point of ice at 1 atmosphere of pressure in K
|
---|
92 | self.meltingpoint = 273.15
|
---|
93 | # Rate of change of melting point with pressure (K/Pa)
|
---|
94 | self.beta = 9.8 * pow(10, -8)
|
---|
95 | # Mixed layer (ice-water interface) heat capacity (J/kg/K)
|
---|
96 | self.mixed_layer_capacity = 3974.0
|
---|
97 | # Thermal exchange velocity (ice-water interface) (m/s)
|
---|
98 | self.thermal_exchange_velocity = 1.00 * pow(10, -4)
|
---|
99 | # Rheology law: what is the temperature dependence of B with T
|
---|
100 | # available: none, paterson and arrhenius
|
---|
101 | self.rheology_law = 'Paterson'
|
---|
102 |
|
---|
103 | # SLC
|
---|
104 | self.earth_density = 5512 # average density of the Earth, (kg/m^3)
|
---|
105 |
|
---|
106 | return self
|
---|
107 | # }}}
|
---|
108 |
|
---|
109 | def checkconsistency(self, md, solution, analyses): # {{{
|
---|
110 | md = checkfield(md, 'fieldname', 'materials.rho_ice', '>', 0)
|
---|
111 | md = checkfield(md, 'fieldname', 'materials.rho_water', '>', 0)
|
---|
112 | md = checkfield(md, 'fieldname', 'materials.rho_freshwater', '>', 0)
|
---|
113 | md = checkfield(md, 'fieldname', 'materials.mu_water', '>', 0)
|
---|
114 | md = checkfield(md, 'fieldname', 'materials.rheology_E', '>', 0, 'timeseries', 1, 'NaN', 1, 'Inf', 1)
|
---|
115 | md = checkfield(md, 'fieldname', 'materials.rheology_B', '>', 0, 'timeseries', 1, 'NaN', 1, 'Inf', 1)
|
---|
116 | md = checkfield(md, 'fieldname', 'materials.rheology_n', '>', 0, 'size', [md.mesh.numberofelements])
|
---|
117 | md = checkfield(md, 'fieldname', 'materials.rheology_law', 'values', ['None', 'BuddJacka', 'Cuffey', 'CuffeyTemperate', 'Paterson', 'Arrhenius', 'LliboutryDuval'])
|
---|
118 | md = checkfield(md, 'fieldname', 'materials.effectiveconductivity_averaging', 'numel', [1], 'values', [0, 1, 2])
|
---|
119 |
|
---|
120 | if 'SealevelchangeAnalysis' in analyses:
|
---|
121 | md = checkfield(md, 'fieldname', 'materials.earth_density', '>', 0, 'numel', 1)
|
---|
122 | return md
|
---|
123 | # }}}
|
---|
124 |
|
---|
125 | def marshall(self, prefix, md, fid): # {{{
|
---|
126 | WriteData(fid, prefix, 'name', 'md.materials.type', 'data', 4, 'format', 'Integer')
|
---|
127 | WriteData(fid, prefix, 'object', self, 'class', 'materials', 'fieldname', 'rho_ice', 'format', 'Double')
|
---|
128 | WriteData(fid, prefix, 'object', self, 'class', 'materials', 'fieldname', 'rho_water', 'format', 'Double')
|
---|
129 | WriteData(fid, prefix, 'object', self, 'class', 'materials', 'fieldname', 'rho_freshwater', 'format', 'Double')
|
---|
130 | WriteData(fid, prefix, 'object', self, 'class', 'materials', 'fieldname', 'mu_water', 'format', 'Double')
|
---|
131 | WriteData(fid, prefix, 'object', self, 'class', 'materials', 'fieldname', 'heatcapacity', 'format', 'Double')
|
---|
132 | WriteData(fid, prefix, 'object', self, 'class', 'materials', 'fieldname', 'latentheat', 'format', 'Double')
|
---|
133 | WriteData(fid, prefix, 'object', self, 'class', 'materials', 'fieldname', 'thermalconductivity', 'format', 'Double')
|
---|
134 | WriteData(fid, prefix, 'object', self, 'class', 'materials', 'fieldname', 'temperateiceconductivity', 'format', 'Double')
|
---|
135 | WriteData(fid, prefix, 'object', self, 'class', 'materials', 'fieldname', 'effectiveconductivity_averaging', 'format', 'Integer')
|
---|
136 | WriteData(fid, prefix, 'object', self, 'class', 'materials', 'fieldname', 'meltingpoint', 'format', 'Double')
|
---|
137 | WriteData(fid, prefix, 'object', self, 'class', 'materials', 'fieldname', 'beta', 'format', 'Double')
|
---|
138 | WriteData(fid, prefix, 'object', self, 'class', 'materials', 'fieldname', 'mixed_layer_capacity', 'format', 'Double')
|
---|
139 | WriteData(fid, prefix, 'object', self, 'class', 'materials', 'fieldname', 'thermal_exchange_velocity', 'format', 'Double')
|
---|
140 | WriteData(fid, prefix, 'object', self, 'class', 'materials', 'fieldname', 'rheology_E', 'format', 'DoubleMat', 'mattype', 1, 'timeserieslength', md.mesh.numberofvertices + 1, 'yts', md.constants.yts)
|
---|
141 | WriteData(fid, prefix, 'object', self, 'class', 'materials', 'fieldname', 'rheology_B', 'format', 'DoubleMat', 'mattype', 1, 'timeserieslength', md.mesh.numberofvertices + 1, 'yts', md.constants.yts)
|
---|
142 | WriteData(fid, prefix, 'object', self, 'class', 'materials', 'fieldname', 'rheology_n', 'format', 'DoubleMat', 'mattype', 2)
|
---|
143 | WriteData(fid, prefix, 'data', self.rheology_law, 'name', 'md.materials.rheology_law', 'format', 'String')
|
---|
144 | WriteData(fid, prefix, 'object', self, 'class', 'materials', 'fieldname', 'earth_density', 'format', 'Double')
|
---|
145 | # }}}
|
---|