Source code for fenicsx_pulse.material_models.linear_elastic

import logging
from dataclasses import dataclass, field

import ufl

from .. import exceptions, kinematics
from ..material_model import Material
from ..units import Variable

logger = logging.getLogger(__name__)


[docs] @dataclass(slots=True) class LinearElastic(Material): """Linear elastic material Parameters ---------- E: float | dolfinx.fem.Function | dolfinx.fem.Constant Youngs module nu: float | dolfinx.fem.Function | dolfinx.fem.Constant Poisson's ratio """ E: Variable = field(default_factory=lambda: Variable(10, "kPa")) nu: Variable = field(default_factory=lambda: Variable(0.3, "dimensionless")) def __post_init__(self): if not isinstance(self.E, Variable): unit = "kPa" logger.warning("Setting mu to %s %s", self.E, unit) self.E = Variable(self.E, unit) if not isinstance(self.nu, Variable): self.nu = Variable(self.nu, "dimensionless") # The poisson ratio has to be between -1.0 and 0.5 nu = self.nu.to_base_units() if not exceptions.check_value_between(nu, -1.0, 0.5): raise exceptions.InvalidRangeError(name="mu", expected_range=(-1.0, 0.5))
[docs] def sigma(self, F: ufl.core.expr.Expr) -> ufl.core.expr.Expr: r"""Cauchy stress for linear elastic material .. math:: \sigma = \frac{E}{1 + \nu} \left( \varepsilon + \frac{\nu}{1 + \nu} \mathrm{tr}(\varepsilon) \mathbf{I} \right) Parameters ---------- F : ufl.core.expr.Expr The deformation gradient Returns ------- ufl.core.expr.Expr _description_ """ e = kinematics.EngineeringStrain(F) I = kinematics.SecondOrderIdentity(F) nu = self.nu.to_base_units() E = self.E.to_base_units() return (E / (1 + nu)) * (e + (nu / (1 - 2 * nu)) * ufl.tr(e) * I)