[25834] | 1 | Index: ../trunk-jpl/src/m/classes/materials.py
|
---|
| 2 | ===================================================================
|
---|
| 3 | --- ../trunk-jpl/src/m/classes/materials.py (revision 24755)
|
---|
| 4 | +++ ../trunk-jpl/src/m/classes/materials.py (revision 24756)
|
---|
| 5 | @@ -4,30 +4,6 @@
|
---|
| 6 | from checkfield import checkfield
|
---|
| 7 | from WriteData import WriteData
|
---|
| 8 |
|
---|
| 9 | -
|
---|
| 10 | -def naturetointeger(strnat): #{{{
|
---|
| 11 | -
|
---|
| 12 | - intnat = np.zeros(len(strnat))
|
---|
| 13 | - for i in range(len(intnat)):
|
---|
| 14 | - if strnat[i] == 'damageice':
|
---|
| 15 | - intnat[i] = 1
|
---|
| 16 | - elif strnat[i] == 'estar':
|
---|
| 17 | - intnat[i] = 2
|
---|
| 18 | - elif strnat[i] == 'ice':
|
---|
| 19 | - intnat[i] = 3
|
---|
| 20 | - elif strnat[i] == 'enhancedice':
|
---|
| 21 | - intnat[i] = 4
|
---|
| 22 | - elif strnat[i] == 'litho':
|
---|
| 23 | - intnat[i] = 6
|
---|
| 24 | - elif strnat[i] == 'hydro':
|
---|
| 25 | - intnat[i] = 7
|
---|
| 26 | - else:
|
---|
| 27 | - raise RuntimeError("materials constructor error message: nature of the material not supported yet! (''ice'' or ''litho'')")
|
---|
| 28 | -
|
---|
| 29 | - return intnat
|
---|
| 30 | - # }}}
|
---|
| 31 | -
|
---|
| 32 | -
|
---|
| 33 | class materials(object):
|
---|
| 34 | """
|
---|
| 35 | MATERIALS class definition
|
---|
| 36 | @@ -44,8 +20,8 @@
|
---|
| 37 | self.nature = args
|
---|
| 38 |
|
---|
| 39 | for i in range(len(self.nature)):
|
---|
| 40 | - if not(self.nature[i] == 'litho' or self.nature[i] == 'ice'):
|
---|
| 41 | - raise RuntimeError("materials constructor error message: nature of the material not supported yet! ('ice' or 'litho')")
|
---|
| 42 | + if not(self.nature[i] == 'litho' or self.nature[i] == 'ice' or self.nature[i] == 'hydro'):
|
---|
| 43 | + raise RuntimeError("materials constructor error message: nature of the material not supported yet! ('ice' or 'litho' or 'hydro')")
|
---|
| 44 |
|
---|
| 45 | #start filling in the dynamic fields:
|
---|
| 46 | for i in range(len(self.nature)):
|
---|
| 47 | @@ -52,7 +28,6 @@
|
---|
| 48 | nat = self.nature[i]
|
---|
| 49 | if nat == 'ice':
|
---|
| 50 | setattr(self, 'rho_ice', 0)
|
---|
| 51 | - setattr(self, 'rho_ice', 0)
|
---|
| 52 | setattr(self, 'rho_water', 0)
|
---|
| 53 | setattr(self, 'rho_freshwater', 0)
|
---|
| 54 | setattr(self, 'mu_water', 0)
|
---|
| 55 | @@ -78,61 +53,17 @@
|
---|
| 56 | setattr(self, 'isburgers', 0)
|
---|
| 57 | setattr(self, 'density', 0)
|
---|
| 58 | setattr(self, 'issolid', 0)
|
---|
| 59 | + elif nat == 'hydro':
|
---|
| 60 | + setattr(self, 'rho_ice', 0)
|
---|
| 61 | + setattr(self, 'rho_water', 0)
|
---|
| 62 | + setattr(self, 'earth_density', 0)
|
---|
| 63 | else:
|
---|
| 64 | - raise RuntimeError("materials constructor error message: nature of the material not supported yet! ('ice' or 'litho')")
|
---|
| 65 | - #set default parameters:
|
---|
| 66 | + raise RuntimeError("materials constructor error message: nature of the material not supported yet! ('ice' or 'litho' or 'hydro')")
|
---|
| 67 | +
|
---|
| 68 | + #set default parameters:
|
---|
| 69 | self.setdefaultparameters()
|
---|
| 70 | #}}}
|
---|
| 71 |
|
---|
| 72 | - def __repr__(self): # {{{
|
---|
| 73 | - string = " Materials:"
|
---|
| 74 | - for i in range(len(self.nature)):
|
---|
| 75 | - nat = self.nature[i]
|
---|
| 76 | - if nat == 'ice':
|
---|
| 77 | - string = "%s\n%s" % (string, 'Ice:')
|
---|
| 78 | - string = "%s\n%s" % (string, fielddisplay(self, "rho_ice", "ice density [kg / m^3]"))
|
---|
| 79 | - string = "%s\n%s" % (string, fielddisplay(self, "rho_water", "water density [kg / m^3]"))
|
---|
| 80 | - string = "%s\n%s" % (string, fielddisplay(self, "rho_freshwater", "fresh water density [kg / m^3]"))
|
---|
| 81 | - string = "%s\n%s" % (string, fielddisplay(self, "mu_water", "water viscosity [N s / m^2]"))
|
---|
| 82 | - string = "%s\n%s" % (string, fielddisplay(self, "heatcapacity", "heat capacity [J / kg / K]"))
|
---|
| 83 | - string = "%s\n%s" % (string, fielddisplay(self, "thermalconductivity", "ice thermal conductivity [W / m / K]"))
|
---|
| 84 | - string = "%s\n%s" % (string, fielddisplay(self, "temperateiceconductivity", "temperate ice thermal conductivity [W / m / K]"))
|
---|
| 85 | - string = "%s\n%s" % (string, fielddisplay(self, "meltingpoint", "melting point of ice at 1atm in K"))
|
---|
| 86 | - string = "%s\n%s" % (string, fielddisplay(self, "latentheat", "latent heat of fusion [J / m^3]"))
|
---|
| 87 | - string = "%s\n%s" % (string, fielddisplay(self, "beta", "rate of change of melting point with pressure [K / Pa]"))
|
---|
| 88 | - string = "%s\n%s" % (string, fielddisplay(self, "mixed_layer_capacity", "mixed layer capacity [W / kg / K]"))
|
---|
| 89 | - string = "%s\n%s" % (string, fielddisplay(self, "thermal_exchange_velocity", "thermal exchange velocity [m / s]"))
|
---|
| 90 | - string = "%s\n%s" % (string, fielddisplay(self, "rheology_B", "flow law parameter [Pa s^(1 / n)]"))
|
---|
| 91 | - string = "%s\n%s" % (string, fielddisplay(self, "rheology_n", "Glen's flow law exponent"))
|
---|
| 92 | - string = "%s\n%s" % (string, fielddisplay(self, "rheology_law", "law for the temperature dependance of the rheology: 'None', 'BuddJacka', 'Cuffey', 'CuffeyTemperate', 'Paterson', 'Arrhenius', 'LliboutryDuval', 'NyeCO2', or 'NyeH2O'"))
|
---|
| 93 | - elif nat == 'litho':
|
---|
| 94 | - string = "%s\n%s" % (string, 'Litho:')
|
---|
| 95 | - string = "%s\n%s" % (string, fielddisplay(self, 'numlayers', 'number of layers (default 2)'))
|
---|
| 96 | - string = "%s\n%s" % (string, fielddisplay(self, 'radius', 'array describing the radius for each interface (numlayers + 1) [m]'))
|
---|
| 97 | - string = "%s\n%s" % (string, fielddisplay(self, 'viscosity', 'array describing each layer''s viscosity (numlayers) [Pa.s]'))
|
---|
| 98 | - string = "%s\n%s" % (string, fielddisplay(self, 'lame_lambda', 'array describing the lame lambda parameter (numlayers) [Pa]'))
|
---|
| 99 | - string = "%s\n%s" % (string, fielddisplay(self, 'lame_mu', 'array describing the shear modulus for each layers (numlayers) [Pa]'))
|
---|
| 100 | - string = "%s\n%s" % (string, fielddisplay(self, 'burgers_viscosity', 'array describing each layer''s transient viscosity, only for Burgers rheologies (numlayers) [Pa.s]'))
|
---|
| 101 | - string = "%s\n%s" % (string, fielddisplay(self, 'burgers_mu', 'array describing each layer''s transient shear modulus, only for Burgers rheologies (numlayers) [Pa]'))
|
---|
| 102 | - string = "%s\n%s" % (string, fielddisplay(self, 'isburgers', 'array describing whether we adopt a MaxWell (0) or Burgers (1) rheology (default 0)'))
|
---|
| 103 | - string = "%s\n%s" % (string, fielddisplay(self, 'density', 'array describing each layer''s density (numlayers) [kg / m^3]'))
|
---|
| 104 | - string = "%s\n%s" % (string, fielddisplay(self, 'issolid', 'array describing whether the layer is solid or liquid (default 1) (numlayers)'))
|
---|
| 105 | -
|
---|
| 106 | - else:
|
---|
| 107 | - raise RuntimeError("materials constructor error message: nature of the material not supported yet! ('ice' or 'litho')")
|
---|
| 108 | -
|
---|
| 109 | - return string
|
---|
| 110 | - #}}}
|
---|
| 111 | -
|
---|
| 112 | - def extrude(self, md): # {{{
|
---|
| 113 | - for i in range(len(self.nature)):
|
---|
| 114 | - nat = self.nature[i]
|
---|
| 115 | - if nat == 'ice':
|
---|
| 116 | - self.rheology_B = project3d(md, 'vector', self.rheology_B, 'type', 'node')
|
---|
| 117 | - self.rheology_n = project3d(md, 'vector', self.rheology_n, 'type', 'element')
|
---|
| 118 | - return self
|
---|
| 119 | - #}}}
|
---|
| 120 | -
|
---|
| 121 | def setdefaultparameters(self): # {{{
|
---|
| 122 | for i in range(len(self.nature)):
|
---|
| 123 | nat = self.nature[i]
|
---|
| 124 | @@ -164,7 +95,6 @@
|
---|
| 125 | #Rheology law: what is the temperature dependence of B with T
|
---|
| 126 | #available: none, paterson and arrhenius
|
---|
| 127 | self.rheology_law = 'Paterson'
|
---|
| 128 | -
|
---|
| 129 | elif nat == 'litho':
|
---|
| 130 | #we default to a configuration that enables running GIA solutions using giacaron and / or giaivins.
|
---|
| 131 | self.numlayers = 2
|
---|
| 132 | @@ -179,13 +109,63 @@
|
---|
| 133 | self.isburgers = [0, 0]
|
---|
| 134 | self.density = [5.51 * 1e3, 5.50 * 1e3] # (Pa) #mantle and lithosphere density [kg / m^3]
|
---|
| 135 | self.issolid = [1, 1] # is layer solid or liquid.
|
---|
| 136 | -
|
---|
| 137 | + elif nat == 'hydro':
|
---|
| 138 | + #ice density (kg / m^3)
|
---|
| 139 | + self.rho_ice = 917.
|
---|
| 140 | + #ocean water density (kg / m^3)
|
---|
| 141 | + self.rho_water = 1023.
|
---|
| 142 | + #average density of the Earth (kg / m^3)
|
---|
| 143 | + self.earth_density = 5512
|
---|
| 144 | else:
|
---|
| 145 | - raise RuntimeError("materials setdefaultparameters error message: nature of the material not supported yet! ('ice' or 'litho')")
|
---|
| 146 | + raise RuntimeError("materials setdefaultparameters error message: nature of the material not supported yet! ('ice' or 'litho' or 'hydro')")
|
---|
| 147 |
|
---|
| 148 | return self
|
---|
| 149 | #}}}
|
---|
| 150 |
|
---|
| 151 | + def __repr__(self): # {{{
|
---|
| 152 | + string = " Materials:"
|
---|
| 153 | + for i in range(len(self.nature)):
|
---|
| 154 | + nat = self.nature[i]
|
---|
| 155 | + if nat == 'ice':
|
---|
| 156 | + string = "%s\n%s" % (string, 'Ice:')
|
---|
| 157 | + string = "%s\n%s" % (string, fielddisplay(self, "rho_ice", "ice density [kg / m^3]"))
|
---|
| 158 | + string = "%s\n%s" % (string, fielddisplay(self, "rho_water", "ocean water density [kg / m^3]"))
|
---|
| 159 | + string = "%s\n%s" % (string, fielddisplay(self, "rho_freshwater", "fresh water density [kg / m^3]"))
|
---|
| 160 | + string = "%s\n%s" % (string, fielddisplay(self, "mu_water", "water viscosity [N s / m^2]"))
|
---|
| 161 | + string = "%s\n%s" % (string, fielddisplay(self, "heatcapacity", "heat capacity [J / kg / K]"))
|
---|
| 162 | + string = "%s\n%s" % (string, fielddisplay(self, "thermalconductivity", "ice thermal conductivity [W / m / K]"))
|
---|
| 163 | + string = "%s\n%s" % (string, fielddisplay(self, "temperateiceconductivity", "temperate ice thermal conductivity [W / m / K]"))
|
---|
| 164 | + string = "%s\n%s" % (string, fielddisplay(self, "meltingpoint", "melting point of ice at 1atm in K"))
|
---|
| 165 | + string = "%s\n%s" % (string, fielddisplay(self, "latentheat", "latent heat of fusion [J / m^3]"))
|
---|
| 166 | + string = "%s\n%s" % (string, fielddisplay(self, "beta", "rate of change of melting point with pressure [K / Pa]"))
|
---|
| 167 | + string = "%s\n%s" % (string, fielddisplay(self, "mixed_layer_capacity", "mixed layer capacity [W / kg / K]"))
|
---|
| 168 | + string = "%s\n%s" % (string, fielddisplay(self, "thermal_exchange_velocity", "thermal exchange velocity [m / s]"))
|
---|
| 169 | + string = "%s\n%s" % (string, fielddisplay(self, "rheology_B", "flow law parameter [Pa s^(1 / n)]"))
|
---|
| 170 | + string = "%s\n%s" % (string, fielddisplay(self, "rheology_n", "Glen's flow law exponent"))
|
---|
| 171 | + string = "%s\n%s" % (string, fielddisplay(self, "rheology_law", "law for the temperature dependance of the rheology: 'None', 'BuddJacka', 'Cuffey', 'CuffeyTemperate', 'Paterson', 'Arrhenius', 'LliboutryDuval', 'NyeCO2', or 'NyeH2O'"))
|
---|
| 172 | + elif nat == 'litho':
|
---|
| 173 | + string = "%s\n%s" % (string, 'Litho:')
|
---|
| 174 | + string = "%s\n%s" % (string, fielddisplay(self, 'numlayers', 'number of layers (default 2)'))
|
---|
| 175 | + string = "%s\n%s" % (string, fielddisplay(self, 'radius', 'array describing the radius for each interface (numlayers + 1) [m]'))
|
---|
| 176 | + string = "%s\n%s" % (string, fielddisplay(self, 'viscosity', 'array describing each layer''s viscosity (numlayers) [Pa.s]'))
|
---|
| 177 | + string = "%s\n%s" % (string, fielddisplay(self, 'lame_lambda', 'array describing the lame lambda parameter (numlayers) [Pa]'))
|
---|
| 178 | + string = "%s\n%s" % (string, fielddisplay(self, 'lame_mu', 'array describing the shear modulus for each layers (numlayers) [Pa]'))
|
---|
| 179 | + string = "%s\n%s" % (string, fielddisplay(self, 'burgers_viscosity', 'array describing each layer''s transient viscosity, only for Burgers rheologies (numlayers) [Pa.s]'))
|
---|
| 180 | + string = "%s\n%s" % (string, fielddisplay(self, 'burgers_mu', 'array describing each layer''s transient shear modulus, only for Burgers rheologies (numlayers) [Pa]'))
|
---|
| 181 | + string = "%s\n%s" % (string, fielddisplay(self, 'isburgers', 'array describing whether we adopt a MaxWell (0) or Burgers (1) rheology (default 0)'))
|
---|
| 182 | + string = "%s\n%s" % (string, fielddisplay(self, 'density', 'array describing each layer''s density (numlayers) [kg / m^3]'))
|
---|
| 183 | + string = "%s\n%s" % (string, fielddisplay(self, 'issolid', 'array describing whether the layer is solid or liquid (default 1) (numlayers)'))
|
---|
| 184 | + elif nat == 'hydro':
|
---|
| 185 | + string = "%s\n%s" % (string, 'Hydro:')
|
---|
| 186 | + string = "%s\n%s" % (string, fielddisplay(self, "rho_ice", "ice density [kg / m^3]"))
|
---|
| 187 | + string = "%s\n%s" % (string, fielddisplay(self, "rho_water", "ocean water density [kg / m^3]"))
|
---|
| 188 | + string = "%s\n%s" % (string, fielddisplay(self, "earth_density", "mantle density [kg / m^3]"))
|
---|
| 189 | + else:
|
---|
| 190 | + raise RuntimeError("materials constructor error message: nature of the material not supported yet! ('ice' or 'litho' or 'hydro')")
|
---|
| 191 | +
|
---|
| 192 | + return string
|
---|
| 193 | + #}}}
|
---|
| 194 | +
|
---|
| 195 | def checkconsistency(self, md, solution, analyses): # {{{
|
---|
| 196 | for i in range(len(self.nature)):
|
---|
| 197 | nat = self.nature[i]
|
---|
| 198 | @@ -197,7 +177,6 @@
|
---|
| 199 | md = checkfield(md, 'fieldname', 'materials.rheology_B', '>', 0, 'timeseries', 1, 'NaN', 1, 'Inf', 1)
|
---|
| 200 | md = checkfield(md, 'fieldname', 'materials.rheology_n', '>', 0, 'size', [md.mesh.numberofelements])
|
---|
| 201 | md = checkfield(md, 'fieldname', 'materials.rheology_law', 'values', ['None', 'BuddJacka', 'Cuffey', 'CuffeyTemperate', 'Paterson', 'Arrhenius', 'LliboutryDuval', 'NyeCO2', 'NyeH2O'])
|
---|
| 202 | -
|
---|
| 203 | elif nat == 'litho':
|
---|
| 204 | if 'LoveAnalysis' not in analyses:
|
---|
| 205 | return md
|
---|
| 206 | @@ -223,9 +202,12 @@
|
---|
| 207 | for i in range(md.materials.numlayers - 1):
|
---|
| 208 | if (not md.materials.issolid[i]) and (not md.materials.issolid[i + 1]): #if there are at least two consecutive indices that contain issolid = 0
|
---|
| 209 | raise RuntimeError("%s%i%s" % ('2 or more adjacent fluid layers detected starting at layer ', i, '. This is not supported yet. Consider merging them.'))
|
---|
| 210 | -
|
---|
| 211 | + elif nat == 'hydro':
|
---|
| 212 | + md = checkfield(md, 'fieldname', 'materials.rho_ice', '>', 0)
|
---|
| 213 | + md = checkfield(md, 'fieldname', 'materials.rho_water', '>', 0)
|
---|
| 214 | + md = checkfield(md, 'fieldname', 'materials.earth_density', '>', 0, 'numel', [1])
|
---|
| 215 | else:
|
---|
| 216 | - raise RuntimeError("materials checkconsistency error message: nature of the material not supported yet! ('ice' or 'litho')")
|
---|
| 217 | + raise RuntimeError("materials checkconsistency error message: nature of the material not supported yet! ('ice' or 'litho' or 'hydro')")
|
---|
| 218 |
|
---|
| 219 | return md
|
---|
| 220 | # }}}
|
---|
| 221 | @@ -232,8 +214,8 @@
|
---|
| 222 |
|
---|
| 223 | def marshall(self, prefix, md, fid): # {{{
|
---|
| 224 | #1: MatdamageiceEnum 2: MatestarEnum 3: MaticeEnum 4: MatenhancediceEnum 5: MaterialsEnum
|
---|
| 225 | - WriteData(fid, prefix, 'name', 'md.materials.type', 'data', 6, 'format', 'Integer')
|
---|
| 226 | WriteData(fid, prefix, 'name', 'md.materials.nature', 'data', naturetointeger(self.nature), 'format', 'IntMat', 'mattype', 3)
|
---|
| 227 | + WriteData(fid, prefix, 'name', 'md.materials.type', 'data', 5, 'format', 'Integer') #DANGER, this can evolve if you have classes
|
---|
| 228 |
|
---|
| 229 | for i in range(len(self.nature)):
|
---|
| 230 | nat = self.nature[i]
|
---|
| 231 | @@ -254,7 +236,6 @@
|
---|
| 232 | WriteData(fid, prefix, 'object', self, 'class', 'materials', 'fieldname', 'rheology_B', 'format', 'DoubleMat', 'mattype', 1, 'timeserieslength', md.mesh.numberofvertices + 1, 'yts', md.constants.yts)
|
---|
| 233 | WriteData(fid, prefix, 'object', self, 'class', 'materials', 'fieldname', 'rheology_n', 'format', 'DoubleMat', 'mattype', 2)
|
---|
| 234 | WriteData(fid, prefix, 'data', self.rheology_law, 'name', 'md.materials.rheology_law', 'format', 'String')
|
---|
| 235 | -
|
---|
| 236 | elif nat == 'litho':
|
---|
| 237 | WriteData(fid, prefix, 'object', self, 'class', 'materials', 'fieldname', 'numlayers', 'format', 'Integer')
|
---|
| 238 | WriteData(fid, prefix, 'object', self, 'class', 'materials', 'fieldname', 'radius', 'format', 'DoubleMat', 'mattype', 3)
|
---|
| 239 | @@ -266,7 +247,43 @@
|
---|
| 240 | WriteData(fid, prefix, 'object', self, 'class', 'materials', 'fieldname', 'isburgers', 'format', 'DoubleMat', 'mattype', 3)
|
---|
| 241 | WriteData(fid, prefix, 'object', self, 'class', 'materials', 'fieldname', 'burgers_viscosity', 'format', 'DoubleMat', 'mattype', 3)
|
---|
| 242 | WriteData(fid, prefix, 'object', self, 'class', 'materials', 'fieldname', 'burgers_mu', 'format', 'DoubleMat', 'mattype', 3)
|
---|
| 243 | -
|
---|
| 244 | + elif nat == 'hydro':
|
---|
| 245 | + WriteData(fid, prefix, 'object', self, 'class', 'materials', 'fieldname', 'rho_ice', 'format', 'Double')
|
---|
| 246 | + WriteData(fid, prefix, 'object', self, 'class', 'materials', 'fieldname', 'rho_water', 'format', 'Double')
|
---|
| 247 | + WriteData(fid, prefix, 'object', self, 'class', 'materials', 'fieldname', 'earth_density', 'format', 'Double')
|
---|
| 248 | else:
|
---|
| 249 | - raise RuntimeError("materials constructor error message: nature of the material not supported yet! (''ice'' or ''litho'')")
|
---|
| 250 | + raise RuntimeError("materials constructor error message: nature of the material not supported yet! ('ice' or 'litho' or 'hydro')")
|
---|
| 251 | # }}}
|
---|
| 252 | +
|
---|
| 253 | + def extrude(self, md): # {{{
|
---|
| 254 | + for i in range(len(self.nature)):
|
---|
| 255 | + nat = self.nature[i]
|
---|
| 256 | + if nat == 'ice':
|
---|
| 257 | + self.rheology_B = project3d(md, 'vector', self.rheology_B, 'type', 'node')
|
---|
| 258 | + self.rheology_n = project3d(md, 'vector', self.rheology_n, 'type', 'element')
|
---|
| 259 | + return self
|
---|
| 260 | + #}}}
|
---|
| 261 | +
|
---|
| 262 | +def naturetointeger(strnat): #{{{
|
---|
| 263 | + intnat = np.zeros(len(strnat))
|
---|
| 264 | +
|
---|
| 265 | + for i in range(len(intnat)):
|
---|
| 266 | + if strnat[i] == 'damageice':
|
---|
| 267 | + intnat[i] = 1
|
---|
| 268 | + elif strnat[i] == 'estar':
|
---|
| 269 | + intnat[i] = 2
|
---|
| 270 | + elif strnat[i] == 'ice':
|
---|
| 271 | + intnat[i] = 3
|
---|
| 272 | + elif strnat[i] == 'enhancedice':
|
---|
| 273 | + intnat[i] = 4
|
---|
| 274 | + # elif strnat[i] == 'materials':
|
---|
| 275 | + # intnat[i] = 5 #this case will never happen, kept to ensure equivalent of codes between IoCodeToMeterialsEnum and IoCodeToNatureEnum
|
---|
| 276 | + elif strnat[i] == 'litho':
|
---|
| 277 | + intnat[i] = 6
|
---|
| 278 | + elif strnat[i] == 'hydro':
|
---|
| 279 | + intnat[i] = 7
|
---|
| 280 | + else:
|
---|
| 281 | + raise RuntimeError("materials constructor error message: nature of the material not supported yet! ('ice' or 'litho' or 'hydro')")
|
---|
| 282 | +
|
---|
| 283 | + return intnat
|
---|
| 284 | +# }}}
|
---|
| 285 | Index: ../trunk-jpl/src/m/classes/materials.m
|
---|
| 286 | ===================================================================
|
---|
| 287 | --- ../trunk-jpl/src/m/classes/materials.m (revision 24755)
|
---|
| 288 | +++ ../trunk-jpl/src/m/classes/materials.m (revision 24756)
|
---|
| 289 | @@ -4,7 +4,7 @@
|
---|
| 290 | % materials=materials();
|
---|
| 291 |
|
---|
| 292 | classdef materials < dynamicprops
|
---|
| 293 | - properties (SetAccess=public)
|
---|
| 294 | + properties (SetAccess=public)
|
---|
| 295 | nature={};
|
---|
| 296 | %all properties are dynamic.
|
---|
| 297 | end
|
---|
| 298 | @@ -12,20 +12,20 @@
|
---|
| 299 | function self = materials(varargin) % {{{
|
---|
| 300 | if nargin==0
|
---|
| 301 | self.nature={'ice'};
|
---|
| 302 | - else
|
---|
| 303 | + else
|
---|
| 304 | self.nature=varargin;
|
---|
| 305 | end
|
---|
| 306 | -
|
---|
| 307 | - %check this is acceptable:
|
---|
| 308 | +
|
---|
| 309 | + %check this is acceptable:
|
---|
| 310 | for i=1:length(self.nature),
|
---|
| 311 | - if ~(strcmpi(self.nature{i},'litho') | strcmpi(self.nature{i},'ice') | strcmpi(self.nature{i},'hydro')),
|
---|
| 312 | + if ~(strcmpi(self.nature{i},'litho') | strcmpi(self.nature{i},'ice') | strcmpi(self.nature{i},'hydro')),
|
---|
| 313 | error('materials constructor error message: nature of the material not supported yet! (''ice'' or ''litho'' or ''hydro'')');
|
---|
| 314 | end
|
---|
| 315 | end
|
---|
| 316 | -
|
---|
| 317 | - %start filling in the dynamic fields:
|
---|
| 318 | +
|
---|
| 319 | + %start filling in the dynamic fields:
|
---|
| 320 | for i=1:length(self.nature),
|
---|
| 321 | - nat=self.nature{i};
|
---|
| 322 | + nat=self.nature{i};
|
---|
| 323 | switch nat
|
---|
| 324 | case 'ice'
|
---|
| 325 | self.addprop('rho_ice');
|
---|
| 326 | @@ -36,7 +36,7 @@
|
---|
| 327 | self.addprop('latentheat');
|
---|
| 328 | self.addprop('thermalconductivity');
|
---|
| 329 | self.addprop('temperateiceconductivity');
|
---|
| 330 | - self.addprop('meltingpoint');
|
---|
| 331 | + self.addprop('meltingpoint');
|
---|
| 332 | self.addprop('beta');
|
---|
| 333 | self.addprop('mixed_layer_capacity');
|
---|
| 334 | self.addprop('thermal_exchange_velocity');
|
---|
| 335 | @@ -45,7 +45,7 @@
|
---|
| 336 | self.addprop('rheology_law');
|
---|
| 337 | case 'litho'
|
---|
| 338 | self.addprop('numlayers');
|
---|
| 339 | - self.addprop('radius');
|
---|
| 340 | + self.addprop('radius');
|
---|
| 341 | self.addprop('viscosity');
|
---|
| 342 | self.addprop('lame_lambda');
|
---|
| 343 | self.addprop('lame_mu');
|
---|
| 344 | @@ -69,7 +69,7 @@
|
---|
| 345 | function self = setdefaultparameters(self) % {{{
|
---|
| 346 |
|
---|
| 347 | for i=1:length(self.nature),
|
---|
| 348 | - nat=self.nature{i};
|
---|
| 349 | + nat=self.nature{i};
|
---|
| 350 | switch nat
|
---|
| 351 | case 'ice'
|
---|
| 352 | %ice density (kg/m^3)
|
---|
| 353 | @@ -82,7 +82,7 @@
|
---|
| 354 | self.rho_freshwater=1000.;
|
---|
| 355 |
|
---|
| 356 | %water viscosity (N.s/m^2)
|
---|
| 357 | - self.mu_water=0.001787;
|
---|
| 358 | + self.mu_water=0.001787;
|
---|
| 359 |
|
---|
| 360 | %ice heat capacity cp (J/kg/K)
|
---|
| 361 | self.heatcapacity=2093.;
|
---|
| 362 | @@ -92,7 +92,7 @@
|
---|
| 363 |
|
---|
| 364 | %ice thermal conductivity (W/m/K)
|
---|
| 365 | self.thermalconductivity=2.4;
|
---|
| 366 | -
|
---|
| 367 | +
|
---|
| 368 | %wet ice thermal conductivity (W/m/K)
|
---|
| 369 | self.temperateiceconductivity=.24;
|
---|
| 370 |
|
---|
| 371 | @@ -113,11 +113,11 @@
|
---|
| 372 | self.rheology_law='Paterson';
|
---|
| 373 |
|
---|
| 374 | case 'litho'
|
---|
| 375 | - %we default to a configuration that enables running GIA solutions using giacaron and/or giaivins.
|
---|
| 376 | + %we default to a configuration that enables running GIA solutions using giacaron and/or giaivins.
|
---|
| 377 | self.numlayers=2;
|
---|
| 378 |
|
---|
| 379 | %center of the earth (approximation, must not be 0), then the lab (lithosphere/asthenosphere boundary) then the surface
|
---|
| 380 | - %(with 1d3 to avoid numerical singularities)
|
---|
| 381 | + %(with 1d3 to avoid numerical singularities)
|
---|
| 382 | self.radius=[1e3;6278*1e3;6378*1e3];
|
---|
| 383 |
|
---|
| 384 | self.viscosity=[1e21;1e40]; %mantle and lithosphere viscosity (respectively) [Pa.s]
|
---|
| 385 | @@ -135,8 +135,8 @@
|
---|
| 386 |
|
---|
| 387 | %ocean water density (kg/m^3)
|
---|
| 388 | self.rho_water=1023.;
|
---|
| 389 | - %SLR
|
---|
| 390 | - self.earth_density= 5512; % average density of the Earth, (kg/m^3)
|
---|
| 391 | + % average density of the Earth (kg/m^3)
|
---|
| 392 | + self.earth_density=5512;
|
---|
| 393 |
|
---|
| 394 | otherwise
|
---|
| 395 | error('materials constructor error message: nature of the material not supported yet! (''ice'' or ''litho'' or ''hydro'')');
|
---|
| 396 | @@ -147,7 +147,7 @@
|
---|
| 397 | disp(sprintf(' Materials:'));
|
---|
| 398 |
|
---|
| 399 | for i=1:length(self.nature),
|
---|
| 400 | - nat=self.nature{i};
|
---|
| 401 | + nat=self.nature{i};
|
---|
| 402 | switch nat
|
---|
| 403 | case 'ice'
|
---|
| 404 | disp(sprintf(' \nIce:'));
|
---|
| 405 | @@ -182,7 +182,7 @@
|
---|
| 406 | disp(sprintf(' \nHydro:'));
|
---|
| 407 | fielddisplay(self,'rho_ice','ice density [kg/m^3]');
|
---|
| 408 | fielddisplay(self,'rho_water','ocean water density [kg/m^3]');
|
---|
| 409 | - fielddisplay(self,'earth_density','Mantle density [kg/m^-3]');
|
---|
| 410 | + fielddisplay(self,'earth_density','mantle density [kg/m^3]');
|
---|
| 411 |
|
---|
| 412 | otherwise
|
---|
| 413 | error('materials constructor error message: nature of the material not supported yet! (''ice'' or ''litho'' or ''hydro'')');
|
---|
| 414 | @@ -192,7 +192,7 @@
|
---|
| 415 | function md = checkconsistency(self,md,solution,analyses) % {{{
|
---|
| 416 |
|
---|
| 417 | for i=1:length(self.nature),
|
---|
| 418 | - nat=self.nature{i};
|
---|
| 419 | + nat=self.nature{i};
|
---|
| 420 | switch nat
|
---|
| 421 | case 'ice'
|
---|
| 422 | md = checkfield(md,'fieldname','materials.rho_ice','>',0);
|
---|
| 423 | @@ -216,11 +216,11 @@
|
---|
| 424 | md = checkfield(md,'fieldname','materials.burgers_mu','Inf',1,'size',[md.materials.numlayers 1],'>=',0);
|
---|
| 425 |
|
---|
| 426 | for i=1:md.materials.numlayers,
|
---|
| 427 | - if md.materials.isburgers(i) & (isnan(md.materials.burgers_viscosity(i) | isnan(md.materials.burgers_mu(i)))),
|
---|
| 428 | + if md.materials.isburgers(i) & (isnan(md.materials.burgers_viscosity(i) | isnan(md.materials.burgers_mu(i)))),
|
---|
| 429 | error('materials checkconsistency error message: Litho burgers_viscosity or burgers_mu has NaN values, inconsistent with isburgers choice');
|
---|
| 430 | end
|
---|
| 431 | end
|
---|
| 432 | - if md.materials.issolid(1)==0 | md.materials.lame_mu(1)==0
|
---|
| 433 | + if md.materials.issolid(1)==0 | md.materials.lame_mu(1)==0
|
---|
| 434 | error('First layer must be solid (issolid(1) > 0 AND lame_mu(1) > 0). Add a weak inner core if necessary.');
|
---|
| 435 | end
|
---|
| 436 | ind=find(md.materials.issolid==0);
|
---|
| 437 | @@ -241,12 +241,12 @@
|
---|
| 438 | end % }}}
|
---|
| 439 | function marshall(self,prefix,md,fid) % {{{
|
---|
| 440 |
|
---|
| 441 | - %1: MatdamageiceEnum 2: MatestarEnum 3: MaticeEnum 4: MatenhancediceEnum 5: MaterialsEnum
|
---|
| 442 | + %1: MatdamageiceEnum 2: MatestarEnum 3: MaticeEnum 4: MatenhancediceEnum 5: MaterialsEnum
|
---|
| 443 | WriteData(fid,prefix,'name','md.materials.nature','data',naturetointeger(self.nature),'format','IntMat','mattype',3);
|
---|
| 444 | - WriteData(fid,prefix,'name','md.materials.type','data',5,'format','Integer'); %DANGER, this can evolve if you have classes.
|
---|
| 445 | + WriteData(fid,prefix,'name','md.materials.type','data',5,'format','Integer'); %DANGER, this can evolve if you have classes.
|
---|
| 446 |
|
---|
| 447 | for i=1:length(self.nature),
|
---|
| 448 | - nat=self.nature{i};
|
---|
| 449 | + nat=self.nature{i};
|
---|
| 450 | switch nat
|
---|
| 451 | case 'ice'
|
---|
| 452 | WriteData(fid,prefix,'object',self,'class','materials','fieldname','rho_ice','format','Double');
|
---|
| 453 | @@ -270,11 +270,11 @@
|
---|
| 454 | WriteData(fid,prefix,'object',self,'class','materials','fieldname','lame_mu','format','DoubleMat','mattype',3);
|
---|
| 455 | WriteData(fid,prefix,'object',self,'class','materials','fieldname','lame_lambda','format','DoubleMat','mattype',3);
|
---|
| 456 | WriteData(fid,prefix,'object',self,'class','materials','fieldname','issolid','format','DoubleMat','mattype',3);
|
---|
| 457 | - WriteData(fid,prefix,'object',self,'class','materials','fieldname','density','format','DoubleMat','mattype',3);
|
---|
| 458 | - WriteData(fid,prefix,'object',self,'class','materials','fieldname','viscosity','format','DoubleMat','mattype',3);
|
---|
| 459 | - WriteData(fid,prefix,'object',self,'class','materials','fieldname','isburgers','format','DoubleMat','mattype',3);
|
---|
| 460 | - WriteData(fid,prefix,'object',self,'class','materials','fieldname','burgers_viscosity','format','DoubleMat','mattype',3);
|
---|
| 461 | - WriteData(fid,prefix,'object',self,'class','materials','fieldname','burgers_mu','format','DoubleMat','mattype',3);
|
---|
| 462 | + WriteData(fid,prefix,'object',self,'class','materials','fieldname','density','format','DoubleMat','mattype',3);
|
---|
| 463 | + WriteData(fid,prefix,'object',self,'class','materials','fieldname','viscosity','format','DoubleMat','mattype',3);
|
---|
| 464 | + WriteData(fid,prefix,'object',self,'class','materials','fieldname','isburgers','format','DoubleMat','mattype',3);
|
---|
| 465 | + WriteData(fid,prefix,'object',self,'class','materials','fieldname','burgers_viscosity','format','DoubleMat','mattype',3);
|
---|
| 466 | + WriteData(fid,prefix,'object',self,'class','materials','fieldname','burgers_mu','format','DoubleMat','mattype',3);
|
---|
| 467 | case 'hydro'
|
---|
| 468 | WriteData(fid,prefix,'object',self,'class','materials','fieldname','rho_ice','format','Double');
|
---|
| 469 | WriteData(fid,prefix,'object',self,'class','materials','fieldname','rho_water','format','Double');
|
---|
| 470 | @@ -287,7 +287,7 @@
|
---|
| 471 | end % }}}
|
---|
| 472 | function self = extrude(self,md) % {{{
|
---|
| 473 | for i=1:length(self.nature),
|
---|
| 474 | - nat=self.nature{i};
|
---|
| 475 | + nat=self.nature{i};
|
---|
| 476 | switch nat
|
---|
| 477 | case 'ice'
|
---|
| 478 | self.rheology_B=project3d(md,'vector',self.rheology_B,'type','node');
|
---|
| 479 | @@ -296,9 +296,9 @@
|
---|
| 480 | end
|
---|
| 481 | end % }}}
|
---|
| 482 | function savemodeljs(self,fid,modelname) % {{{
|
---|
| 483 | -
|
---|
| 484 | +
|
---|
| 485 | for i=1:length(self.nature),
|
---|
| 486 | - nat=self.nature{i};
|
---|
| 487 | + nat=self.nature{i};
|
---|
| 488 | switch nat
|
---|
| 489 | case 'ice'
|
---|
| 490 | writejsdouble(fid,[modelname '.materials.rho_ice'],self.rho_ice);
|
---|
| 491 | @@ -323,11 +323,11 @@
|
---|
| 492 | writejsdouble(fid,[modelname '.materials.lame_mu'],self.lame_mu);
|
---|
| 493 | writejsdouble(fid,[modelname '.materials.lame_lambda'],self.lame_lambda);
|
---|
| 494 | writejsdouble(fid,[modelname '.materials.issolid'],self.issolid);
|
---|
| 495 | - writejsdouble(fid,[modelname '.materials.density'],self.density);
|
---|
| 496 | - writejsdouble(fid,[modelname '.materials.viscosity'],self.viscosity);
|
---|
| 497 | - writejsdouble(fid,[modelname '.materials.isburgers'],self.isburgers);
|
---|
| 498 | - writejsdouble(fid,[modelname '.materials.burgers_viscosity'],self.burgers_viscosity);
|
---|
| 499 | - writejsdouble(fid,[modelname '.materials.burgers_mu'],self.burgers_mu);
|
---|
| 500 | + writejsdouble(fid,[modelname '.materials.density'],self.density);
|
---|
| 501 | + writejsdouble(fid,[modelname '.materials.viscosity'],self.viscosity);
|
---|
| 502 | + writejsdouble(fid,[modelname '.materials.isburgers'],self.isburgers);
|
---|
| 503 | + writejsdouble(fid,[modelname '.materials.burgers_viscosity'],self.burgers_viscosity);
|
---|
| 504 | + writejsdouble(fid,[modelname '.materials.burgers_mu'],self.burgers_mu);
|
---|
| 505 |
|
---|
| 506 | case 'hydro'
|
---|
| 507 | writejsdouble(fid,[modelname '.materials.rho_ice'],self.rho_ice);
|
---|
| 508 | @@ -344,26 +344,27 @@
|
---|
| 509 | end % }}}
|
---|
| 510 | end
|
---|
| 511 | end
|
---|
| 512 | - function intnat = naturetointeger(strnat) % {{{
|
---|
| 513 | - intnat=zeros(length(strnat),1);
|
---|
| 514 | - for i=1:length(strnat),
|
---|
| 515 | - switch strnat{i},
|
---|
| 516 | - case 'damageice'
|
---|
| 517 | - intnat(i)=1;
|
---|
| 518 | - case 'estar'
|
---|
| 519 | - intnat(i)=2;
|
---|
| 520 | - case 'ice'
|
---|
| 521 | - intnat(i)=3;
|
---|
| 522 | - case 'enhancedice'
|
---|
| 523 | - intnat(i)=4;
|
---|
| 524 | - %case 'materials' %this case will never happen, kept to ensure equivalent of codes between IoCodeToMaterialsEnumm and IoCodeToNatureEnum
|
---|
| 525 | - % intnat(i)=5;
|
---|
| 526 | - case 'litho'
|
---|
| 527 | - intnat(i)=6;
|
---|
| 528 | - case 'hydro'
|
---|
| 529 | - intnat(i)=7;
|
---|
| 530 | - otherwise
|
---|
| 531 | - error('materials constructor error message: nature of the material not supported yet! (''ice'' or ''litho'' or ''hydro'')');
|
---|
| 532 | - end
|
---|
| 533 | - end
|
---|
| 534 | - end % }}}
|
---|
| 535 | +
|
---|
| 536 | +function intnat = naturetointeger(strnat) % {{{
|
---|
| 537 | + intnat=zeros(length(strnat),1);
|
---|
| 538 | + for i=1:length(strnat),
|
---|
| 539 | + switch strnat{i},
|
---|
| 540 | + case 'damageice'
|
---|
| 541 | + intnat(i)=1;
|
---|
| 542 | + case 'estar'
|
---|
| 543 | + intnat(i)=2;
|
---|
| 544 | + case 'ice'
|
---|
| 545 | + intnat(i)=3;
|
---|
| 546 | + case 'enhancedice'
|
---|
| 547 | + intnat(i)=4;
|
---|
| 548 | + %case 'materials' %this case will never happen, kept to ensure equivalent of codes between IoCodeToMaterialsEnum and IoCodeToNatureEnum
|
---|
| 549 | + % intnat(i)=5;
|
---|
| 550 | + case 'litho'
|
---|
| 551 | + intnat(i)=6;
|
---|
| 552 | + case 'hydro'
|
---|
| 553 | + intnat(i)=7;
|
---|
| 554 | + otherwise
|
---|
| 555 | + error('materials constructor error message: nature of the material not supported yet! (''ice'' or ''litho'' or ''hydro'')');
|
---|
| 556 | + end
|
---|
| 557 | + end
|
---|
| 558 | +end % }}}
|
---|