Source code for genesis.engine.materials.MPM.snow
from typing import Any
import quadrants as qd
from pydantic import StrictBool, model_validator
import genesis as gs
from genesis.typing import PositiveFloat
from .base import SamplerType
from .elasto_plastic import ElastoPlastic
[docs]@qd.data_oriented
class Snow(ElastoPlastic):
"""
The snow material class for MPM.
Note
----
Snow is a special type of ElastoPlastic that gets harder when compressed.
It does not support von Mises yield criterion.
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.
sampler : str, optional
Particle sampler. Default is 'random'.
yield_lower : float, optional
Lower bound of yield condition. Default is 2.5e-2.
yield_higher : float, optional
Upper bound of yield condition. Default is 4.5e-3.
"""
sampler: SamplerType = "random"
use_von_mises: StrictBool = False
@model_validator(mode="before")
@classmethod
def _enforce_no_von_mises(cls, data: dict) -> dict:
if data.get("use_von_mises", False):
gs.raise_exception("Snow does not support use_von_mises=True.")
data["use_von_mises"] = False
return data
[docs] def model_post_init(self, context: Any) -> None:
super().model_post_init(context)
self.update_F_S_Jp = self._update_F_S_Jp_snow
self.update_stress = self._update_stress_snow
@qd.func
def _update_F_S_Jp_snow(self, J, F_tmp, U, S, V, Jp):
S_new = qd.Matrix.zero(gs.qd_float, 3, 3)
Jp_new = Jp
for d in qd.static(range(3)):
S_new[d, d] = min(max(S[d, d], 1 - self.yield_lower), 1 + self.yield_higher)
Jp_new *= S[d, d] / S_new[d, d]
F_new = U @ S_new @ V.transpose()
return F_new, S_new, Jp_new
@qd.func
def _update_stress_snow(self, U, S, V, F_tmp, F_new, J, Jp, actu, m_dir):
# Hardening coefficient: material harder when compressed
h = qd.exp(10 * (1.0 - Jp))
mu, lam = self.mu * h, self.lam * h
r = U @ V.transpose()
stress = 2 * mu * (F_new - r) @ F_new.transpose() + qd.Matrix.identity(gs.qd_float, 3) * lam * J * (J - 1)
return stress