Source code for seapy.materials.materialsolid

import math
import cmath

import warnings


#import scipy.constants as physical_constants  # Container of physical constants which might be of use
import numpy as np
from .material import Material

from ..base import Base, Spectrum, LinkedList


class MaterialSolid(Material):
[docs] """ Solid material class """ description = 'A material in solid state.' young = 0.0 shear = 0.0 poisson = 0.0 #class ModulusDescriptor(object): def modulus(out, young=None, bulk=None, shear=None, poisson=None):
"""Calculate `out` using `given`. :param out: Desired elastic modulus. :param young: Young's modulus. :param bulk: Bulk modulus. :param shear: Shear modulus. :param poisson: Poisson ration. This function determines the desired elastic modulus using the given moduli. """ if out=='bulk': if young and shear: return (young * shear) / (9.0 * shear - 3.0 * young) elif young and poisson: return (young) / (3.0 - 6.0 * poisson) elif shear and poisson: return 2.0 * shear * (1.0 + poisson) / (3.0 - 6.0 * poisson) elif out=='young': if bulk and shear: return 9.0 * bulk * shear / (3.0 * bulk + shear) elif young and poisson: return 3.0 * bulk * (1.0 - 2.0 * poisson) elif shear and poisson: return 2.0 * shear * (1.0 + poisson) elif out=='shear': if bulk and young: return 3.0 * bulk * young / (9.0 * bulk - young) elif bulk and poisson: return 3.0 * bulk * (1.0 - 2.0 * poisson) / (2.0 + 2.0 * poisson) elif young and poisson: return young / (2.0 + 2.0 * poisson) elif out=='poisson': if bulk and young: return ( 3.0 * bulk - young) / (6.0 * bulk) elif bulk and shear: return (3.0 * bulk - 2.0 * shear) / (6.0 * bulk + 2.0 * shear) elif young and shear: return (young) / (2.0*shear) - 1.0 raise ValueError("Cannot determine {} with the given moduli.".format(out)) ###class MaterialSolid(Material): ###""" ###Solid material class ###""" #### Elastic moduli ###_young = None ###_bulk = None ###_shear = None ###_poisson = None ###_isotropic = True # Whether the material is isotropic or not. ####_tensile_strength_break = None ####_tensile_strength_yield = None ####_tensile_strength_ultimate = None ####_tensile_elongation_break = None ####_tensile_elongation_yield = None ####_tensile_elongation_ultimate = None ###def _get_isotropic(self): ###""" ###Return whether the solid is isotropic or not. ###""" ####if self._isotropic is not None: ###return self._isotropic ###def _set_isotropic(self, x): ###""" ###Set whether the solid is isotropic or not. ###:param x: is a boolean ###""" ###if type(x) is bool: # Perhaps use a try here? ###self._isotropic = x ###isotropic = property(fget=_get_isotropic, fset=_set_isotropic) ###""" ###Isotropic material or not. ###""" ###def elastic_moduli_given(self): ###""" ###Returns the amount of elastic module that were specified. ###""" ###return (bool(self._young) + bool(self._bulk) + bool(self._shear) + bool(self._poisson)) ###def _del_elastic_moduli(attr): ###def del_attr(self): ###setattr(self, attr, None) # Check first whether it can actually be deleted? E.g. when it has not been set at all. ###return del_attr ###def _set_elastic_moduli(attr): ###def set_attr(self, x): ###if self.elastic_moduli_given() < 2: #and isinstance(x, float): ###setattr(self, attr, x) ###else: ###warnings.warn('Two elastic moduli have already been set. Please delete one before adding a new one.') ###return set_attr ###def _get_elastic_moduli(attr): ###"""Retrieve the value of the elastic modulus. Check first whether the value is stored. If not, calculate it from two given moduli.""" ###def get_attr(self): ###if getattr(self, attr) is not None: ###return getattr(self, attr) # then we should return it instead of trying to calculate it. ###elif self.isotropic and self.elastic_moduli_given() >= 2: # But only when isotropic!!! #### Calculate Bulk ###if bool(attr =='_bulk' and self._young and self._shear): ###return (self.young * self.shear) / (9.0 * self.shear - 3.0 * self.young) ###elif bool(attr =='_bulk' and self._young and self._poisson): ###return (self.young) / (3.0 - 6.0 * self.poisson) ###elif bool(attr =='_bulk' and self._shear and self._poisson): ###return 2.0 * self.shear * (1.0 + self.poisson) / (3.0 - 6.0 * self.poisson) #### Calculate Young ###elif bool(attr =='_young' and self._bulk and self._shear): ###return 9.0 * self.bulk * self.shear / (3.0 * self.bulk + self.shear) ###elif bool(attr =='_young' and self._bulk and self._poisson): ###return 3.0 * self.bulk * (1.0 - 2.0 * self.poisson) ###elif bool(attr =='_young' and self._shear and self._poisson): ###return 2.0 * self.shear * (1.0 + self.poisson) #### Calculate Shear ###elif bool(attr =='_shear' and self._bulk and self._young): ###return 3.0 * self.bulk * self.young / (9 * self.bulk - self.young) ###elif bool(attr =='_shear' and self._bulk and self._poisson): ###return 3.0 * self.bulk * (1.0 - 2.0 * self.poisson) / (2.0 + 2.0 * self.poisson) ###elif bool(attr =='_shear' and self._young and self._poisson): ###return self.young / (2.0 + 2.0 * self.poisson) #### Calculate Poisson ###elif bool(attr =='_poisson' and self._bulk and self._young): ###return ( 3.0 * self.bulk - self.young) / (6.0 * self.bulk) ###elif bool(attr =='_poisson' and self._bulk and self._shear): ###return (3.0 * self.bulk - 2.0 * self.shear) / (6.0 * self.bulk + 2.0 * self.shear) ###elif bool(attr =='_poisson' and self._young and self._shear): ###return (self.young) / (2.0*self.shear) - 1.0 ###else: ###ValueError ###else: ###warnings.warn('The modulus was not given for this material and could not be calculated either.') ###return get_attr ###young = property(fget=_get_elastic_moduli('_young'), fset=_set_elastic_moduli('_young'), fdel=_del_elastic_moduli('_young')) # Young's modulus, or Tensile modulus ###""" ###Young's modulus :math:`E`. ###The value can be set or calculated when the material is isotropic and elastic_moduli_given equals two. ###""" ###bulk = property(fget=_get_elastic_moduli('_bulk'), fset=_set_elastic_moduli('_bulk'), fdel=_del_elastic_moduli('_bulk')) # Bulk modulus ###""" ###Bulk modulus :math:`K` ###The value can be set or calculated when the material is isotropic and elastic_moduli_given equals two. ###""" ###shear = property(fget=_get_elastic_moduli('_shear'), fset=_set_elastic_moduli('_shear'), fdel=_del_elastic_moduli('_shear')) # Shear modulus ###""" ###Shear modulus :math:`G` ###The value can be set or calculated when the material is isotropic and elastic_moduli_given equals two. ###""" ###poisson = property(fget=_get_elastic_moduli('_poisson'), fset=_set_elastic_moduli('_poisson'), fdel=_del_elastic_moduli('_poisson')) # Poisson modulus ###""" ###Poisson ratio :math:`\\nu` ###The value can be set or calculated when the material is isotropic and elastic_moduli_given equals two. ###"""