def _convert_properties(dim, elastic_modulus, poissons_ratio): """Convert from elastic modulus and Poisson's ratio to the Lame parameter and shear modulus Args: dim: whether 2D or 3D elastic_modulus: the elastic modulus in each phase poissons_ration: the poissons ratio for each phase Returns: array of shape (n_phases, 2) where for example [1, 0], gives the Lame parameter in the second phase """ return pipe( zip(elastic_modulus, poissons_ratio), map_( lambda x: pipe( ElasticConstants(young=x[0], poisson=x[1]), lambda y: (y.lam, dim / 3.0 * y.mu), ) ), list, np.array, )
def test_elastic_constants(self): import numpy as nm from sfepy.mechanics.matcoefs import ElasticConstants ok = True names = ['bulk', 'lam', 'mu', 'young', 'poisson', 'p_wave'] ec = ElasticConstants(lam=1.0, mu=1.5) vals = ec.get(names) self.report('using values:', vals) for i1 in range(len(names)): for i2 in range(i1+1, len(names)): kwargs = {names[i1] : vals[i1], names[i2] : vals[i2]} try: ec.init(**kwargs) except: _ok = False else: _ok = True ec_vals = ec.get(names) _ok = _ok and nm.allclose(ec_vals, vals) self.report(names[i1], names[i2], '->', _ok) if not _ok: self.report('correct:', vals) self.report(' got:', ec_vals) ok = ok and _ok return ok
def _convert_properties(dim, elastic_modulus, poissons_ratio): """Convert from elastic modulus and Poisson's ratio to the Lame parameter and shear modulus Args: dim: whether 2D or 3D elastic_modulus: the elastic modulus in each phase poissons_ration: the poissons ratio for each phase Returns: array of shape (n_phases, 2) where for example [1, 0], gives the Lame parameter in the second phase >>> assert(np.allclose( ... _convert_properties( ... dim=2, elastic_modulus=(1., 2.), poissons_ratio=(1., 1.) ... ), ... np.array([[-0.5, 1. / 6.], [-1., 1. / 3.]]) ... )) Test case with 3 phases. >>> X2D = np.array([[[0, 1, 2, 1], ... [2, 1, 0, 0], ... [1, 0, 2, 2]]]) >>> X2D_property = _convert_properties( ... dim=2, elastic_modulus=(1., 2., 3.), poissons_ratio=(1., 1., 1.) ... )[X2D] >>> lame = lame0, lame1, lame2 = -0.5, -1., -1.5 >>> mu = mu0, mu1, mu2 = 1. / 6, 1. / 3, 1. / 2 >>> lm = list(zip(lame, mu)) >>> assert(np.allclose(X2D_property, ... [[lm[0], lm[1], lm[2], lm[1]], ... [lm[2], lm[1], lm[0], lm[0]], ... [lm[1], lm[0], lm[2], lm[2]]])) Test case with 2 phases. >>> X3D = np.array([[[0, 1], ... [0, 0]], ... [[1, 1], ... [0, 1]]]) >>> X3D_property = _convert_properties( ... dim=2, elastic_modulus=(1., 2.), poissons_ratio=(1., 1.) ... )[X3D] >>> assert(np.allclose( ... X3D_property, ... [[[lm[0], lm[1]], ... [lm[0], lm[0]]], ... [[lm[1], lm[1]], ... [lm[0], lm[1]]]] ... )) """ return pipe( zip(elastic_modulus, poissons_ratio), map_(lambda x: pipe( ElasticConstants(young=x[0], poisson=x[1]), lambda y: (y.lam, dim / 3.0 * y.mu), )), list, np.array, )
.. math:: D_{ijkl} = \mu (\delta_{ik} \delta_{jl}+\delta_{il} \delta_{jk}) + \lambda \ \delta_{ij} \delta_{kl} \;. """ from sfepy.mechanics.matcoefs import lame_from_youngpoisson from sfepy.discrete.fem.utils import refine_mesh from sfepy import data_dir filename_mesh = data_dir + '/meshes/2d/simple_square.mesh' young = 2000.0 # Young's modulus [MPa] poisson = 0.4 # Poisson's ratio from sfepy.mechanics.matcoefs import ElasticConstants, ElasticTensor elas = ElasticConstants(young=2000., poisson=.4) bulk, mu = elas.get(['bulk', 'mu']) elasTensor = ElasticTensor(bulk=bulk, mu=mu, plane='strain') materials = { 'Asphalt' : ({ 'lam' : lame_from_youngpoisson(young, poisson)[0], 'mu' : lame_from_youngpoisson(young, poisson)[1], 'Voight' : elasTensor.voight, 'Mandel' : elasTensor.mandel, },), 'Load' : ({'.val' : [0.0, -1000.0]},), } regions = { 'Omega' : 'all',
def _convert(E, nu): ec = ElasticConstants(young=E, poisson=nu) mu = dim / 3. * ec.mu # pylint: disable=no-member lame = ec.lam # pylint: disable=no-member return lame, mu
def _convert(E, nu): ec = ElasticConstants(young=E, poisson=nu) mu = dim / 3. * ec.mu lame = ec.lam return lame, mu