Source code for genesis.engine.materials.MPM.muscle

from typing import Any, Literal

import quadrants as qd
from pydantic import Field, PrivateAttr

from genesis.typing import PositiveFloat, PositiveInt, ValidFloat

from .elastic import Elastic


[docs]@qd.data_oriented class Muscle(Elastic): """ The muscle material class for MPM. Parameters ---------- E : float, optional Young's modulus. Default is 1e6. nu : float, optional Poisson ratio. Default is 0.2. rho : float, optional Density (kg/m³). Default is 1000. model : str, optional Stress model ('corotation', 'neohooken'). Default is 'neohooken'. n_groups : int, optional Number of muscle groups. Default is 1. """ E: PositiveFloat = 1e6 model: Literal["corotation", "neohooken"] = "neohooken" n_groups: PositiveInt = 1 # Auto-generated — equals E. stiffness: ValidFloat = Field(default=0.0, exclude=True) _update_stress_without_actuation: Any = PrivateAttr(default=None)
[docs] def model_post_init(self, context: Any) -> None: super().model_post_init(context) self.stiffness = self.E self._update_stress_without_actuation = self.update_stress self.update_stress = self._update_stress_with_actuation
@qd.func def _update_stress_with_actuation(self, U, S, V, F_tmp, F_new, J, Jp, actu, m_dir): stress = self._update_stress_without_actuation(U, S, V, F_tmp, F_new, J, Jp, actu, m_dir) AAt = m_dir.outer_product(m_dir) stress += self.stiffness * actu * F_tmp @ AAt @ F_tmp.transpose() return stress