Source code for mechmat.material
from mechmat.properties.geometry import Geometry
from mechmat.properties.mass import Mass
from mechmat.properties.thermal import Thermal
from mechmat.properties.pressure import Pressure
from mechmat.properties.viscosity import Viscosity
from mechmat.properties.shearing import Shearing
from mechmat.properties.flow import Flow
from mechmat.core.chainable import Chainable
import dill as _dill
__all__ = ['material_factory']
[docs]def material_factory(*args, flow=False, **kwargs):
r"""
Material instance facotry
Args:
*args: Chainable sub-propperties
flow: is the material a continium flowing :math:`\frac{\text{d}m}{}`
**kwargs:
Returns:
"""
Material = material_type_factory(*args, flow=flow)
return Material()(**kwargs)
def material_type_factory(*args, flow=False):
if flow:
class FlowMaterial(Material, Thermal, Pressure, Flow, Shearing, Viscosity, *args):
def __init__(self, **kwargs):
super(FlowMaterial, self).__init__(**kwargs)
FlowMaterial.dtypes = args
FlowMaterial.flow = flow
return FlowMaterial
else:
class StaticMaterial(Material, Thermal, Pressure, Geometry, Mass, *args):
def __init__(self, **kwargs):
super(StaticMaterial, self).__init__(**kwargs)
StaticMaterial.dtypes = args
StaticMaterial.flow = flow
return StaticMaterial
class _InitializedMaterial(object):
def __call__(self, *args):
obj = _InitializedMaterial()
obj.__class__ = material_type_factory(*args[0], flow=args[1])
return obj
class Material(Chainable):
def __init__(self, **kwargs):
super(Material, self).__init__(**kwargs)
self._logistic_properties += ['name', 'short_name', 'CAS']
def __reduce__(self):
return (_InitializedMaterial(), (self.dtypes, self.flow), self.__dict__)
dtypes = ()
flow = False
_version = 1
"""int: version of the material class. Bump this value up for big changes in the class which aren't compatible with
earlier release. """
name = None
r"""str: The common name of the material"""
CAS = None
r"""str: Chemical Abstracts Service number"""
@property
def short_name(self):
r"""
str: Short name for the material. When it is not user specified, the :attr:`~name` is used. When this consists
of multiple words, the short name is build from all first letters. When the name consist of a single word, the
first two letters are used """
if hasattr(self, '_short_name'):
return self._short_name
else:
if self.name is None:
return None
words = self.name.split(' ')
if len(words) > 1:
return ''.join([w[0] for w in words])
return self.name[:2]
@short_name.setter
def short_name(self, value):
self._short_name = value
@staticmethod
def dump(instance, filename):
with open(filename, 'wb') as f:
_dill.dump(instance, f)
@staticmethod
def load(filename):
with open(filename, 'rb') as f:
mat = _dill.load(f)
return mat