Source code for planestress.pre.material
"""Class describing a planestress material."""
from __future__ import annotations
from dataclasses import dataclass
from functools import cache
import numpy as np
import numpy.typing as npt
[docs]
@dataclass(eq=True, frozen=True)
class Material:
"""Class for a plane-stress material.
The color can be a multitude of different formats, refer to
https://matplotlib.org/stable/api/colors_api.html and
https://matplotlib.org/stable/gallery/color/named_colors.html for more information.
Args:
name: Material name. Defaults to ``"default"``.
elastic_modulus: Material modulus of elasticity. Defaults to ``1.0``.
poissons_ratio: Material Poisson's ratio. Defaults to ``0.0``.
thickness: Material thickness. Defaults to ``1.0``.
density: Material density (mass per unit volume). Defaults to ``1.0``.
color: Defaults to ``"w"``.
"""
name: str = "default"
elastic_modulus: float = 1.0
poissons_ratio: float = 0.0
thickness: float = 1.0
density: float = 1.0
color: str = "w"
@property
def mu(self) -> float:
r"""Returns Lamé parameter mu.
Returns:
Lamé parameter :math:`\mu`.
"""
return self.elastic_modulus / (2 * (1 + self.poissons_ratio))
@property
def lda(self) -> float:
r"""Returns Lamé parameter lambda.
Returns:
Lamé parameter :math:`\lambda`.
"""
return (
self.poissons_ratio
* self.elastic_modulus
/ ((1 + self.poissons_ratio) * (1 - 2 * self.poissons_ratio))
)
[docs]
@cache
def get_d_matrix(self) -> npt.NDArray[np.float64]:
r"""Returns the constitutive matrix for plane-stress.
The constitutive matrix (D) is defined as
:math:`\boldsymbol{\sigma} = \textbf{D} \boldsymbol{\varepsilon}`.
TODO - consider caching the result.
Returns:
Constitutive matrix.
"""
mu = self.mu
lda = self.lda
d_mat = np.zeros((3, 3)) # allocate D matrix
d_mat[0:2, 0:2] = lda + 2 * mu
d_mat[2, 2] = mu
d_mat[0, 1] = lda
d_mat[1, 0] = lda
return d_mat
DEFAULT_MATERIAL = Material()