[docs]class MaterialPropertyMap:
def __init__(self):
self._lowCutoffs = []
self._highCutoffs = []
self._properties = []
[docs] def error_check(self, cutoff, conductivity):
if not isinstance(cutoff, tuple) or len(cutoff) != 2:
raise Exception("Cutoff has to be a tuple(int,int) specifying the low and high cutoffs")
for i in range(len(self._lowCutoffs)):
if (self._highCutoffs[i] >= cutoff[0] >= self._lowCutoffs[i]) \
or (self._highCutoffs[i] >= cutoff[1] >= self._lowCutoffs[i]):
raise Exception("Invalid material range. The range overlaps an existing material range")
check = False
if isinstance(conductivity, tuple):
if any(i < 0 for i in conductivity):
check = True
else:
if conductivity < 0:
check = True
if check:
raise Exception("Invalid conductivity. Must be positive")
return conductivity
def _append_inputs(self, cutoff, conductivity):
self._lowCutoffs.append(cutoff[0])
self._highCutoffs.append(cutoff[1])
self._properties.append(conductivity)
[docs] def get_size(self):
return len(self._lowCutoffs)
[docs] def get_material(self, i):
if i >= len(self._lowCutoffs):
raise Exception("Invalid index. Maximum size: " + str(self.get_size()))
if i < 0:
raise Exception("Invalid index. Must be >= 0")
return self._lowCutoffs[i], self._highCutoffs[i], self._properties[i]
[docs] def show(self):
print("Material conductivity as [low-high cutoffs] = conductivity:")
for i in range(len(self._lowCutoffs)):
print('[{} - {}] = {}'.format(self._lowCutoffs[i], self._highCutoffs[i], self._properties[i]))
[docs]class IsotropicConductivityMap(MaterialPropertyMap):
def __init__(self):
super().__init__()
[docs] def add_material(self, cutoff, conductivity):
conductivity = self.error_check(cutoff, conductivity)
if isinstance(conductivity, bool):
return
self._append_inputs(cutoff, conductivity)
[docs]class AnisotropicConductivityMap(MaterialPropertyMap):
def __init__(self):
super().__init__()
[docs] def add_material(self, cutoff, kxx, kyy, kzz, kxy, kxz, kyz):
conductivity = (kxx, kyy, kzz, kxy, kxz, kyz)
conductivity = self.error_check(cutoff, conductivity)
if isinstance(conductivity, bool):
return
self._append_inputs(cutoff, conductivity)
[docs] def add_isotropic_material(self, cutoff, k):
conductivity = (k, k, k, 0., 0., 0.)
conductivity = self.error_check(cutoff, conductivity)
if isinstance(conductivity, bool):
return
self._append_inputs(cutoff, conductivity)
[docs] def add_orthotropic_material(self, cutoff, kxx, kyy, kzz):
conductivity = (kxx, kyy, kzz, 0., 0., 0.)
conductivity = self.error_check(cutoff, conductivity)
if isinstance(conductivity, bool):
return
self._append_inputs(cutoff, conductivity)
[docs] def add_material_to_orient(self, cutoff, k_axial, k_radial):
conductivity = (k_axial, k_radial)
conductivity = self.error_check(cutoff, conductivity)
if isinstance(conductivity, bool):
return
self._append_inputs(cutoff, conductivity)
[docs]class ElasticityMap(MaterialPropertyMap):
def __init__(self):
super().__init__()
[docs] def add_material(self, cutoff, C11, C12, C13, C14, C15, C16, C22, C23, C24, C25, C26,
C33, C34, C35, C36, C44, C45, C46, C55, C56, C66):
elasticity = (C11, C12, C13, C14, C15, C16,
C22, C23, C24, C25, C26,
C33, C34, C35, C36,
C44, C45, C46,
C55, C56,
C66)
elasticity = self.error_check(cutoff, elasticity)
if isinstance(elasticity, bool):
return
self._append_inputs(cutoff, elasticity)
[docs] def add_isotropic_material(self, cutoff, E_youngmod, nu_poissrat):
Lambda = (nu_poissrat * E_youngmod) / ((1 + nu_poissrat) * (1 - 2 * nu_poissrat))
mu = E_youngmod / (2 * (1 + nu_poissrat))
elasticity = (Lambda + 2 * mu, Lambda, Lambda, 0., 0., 0.,
Lambda + 2 * mu, Lambda, 0., 0., 0.,
Lambda + 2 * mu, 0., 0., 0.,
2 * mu, 0., 0.,
2 * mu, 0.,
2 * mu)
elasticity = self.error_check(cutoff, elasticity)
if isinstance(elasticity, bool):
return
self._append_inputs(cutoff, elasticity)
[docs] def add_material_to_orient(self, cutoff, E_axial, E_radial, nu_poissrat_12, nu_poissrat_23, G12):
elasticity = (E_axial, E_radial, nu_poissrat_12, nu_poissrat_23, G12)
elasticity = self.error_check(cutoff, elasticity)
if isinstance(elasticity, bool):
return
self._append_inputs(cutoff, elasticity)
[docs] def show(self):
print("Material elasticity as [low-high cutoffs] = elasticity:")
for i in range(len(self._lowCutoffs)):
print('[{} - {}] = '.format(self._lowCutoffs[i], self._highCutoffs[i], self._properties[i]))
if len(self._properties[i]) == 5:
print('{}'.format(self._properties[i]))
else:
first_elast, last_elast = (0, 6)
for i2 in range(6):
print('{}'.format(self._properties[i][first_elast:last_elast]))
first_elast = last_elast
last_elast += 5 - i2