jaxdem.forces.hertz#
Hertzian (nonlinear) normal contact force model.
Classes
|
Hertzian nonlinear normal contact force between elastic spheres. |
- class jaxdem.forces.hertz.HertzianForce(laws: tuple[ForceModel, ...] = ())#
Bases:
ForceModelHertzian nonlinear normal contact force between elastic spheres.
The effective Young’s modulus \(E^*\) is computed directly from the per-particle Young’s modulus \(E\) and Poisson’s ratio \(\nu\):
\[\frac{1}{E^*} = \frac{1 - \nu_i^2}{E_i} + \frac{1 - \nu_j^2}{E_j}\]The effective radius is:
\[\frac{1}{R^*} = \frac{1}{R_i} + \frac{1}{R_j}\]The Hertzian stiffness combines both:
\[k = \tfrac{4}{3}\, E^* \sqrt{R^*}\]The penetration depth \(\delta\) between particles \(i\) and \(j\) is:
\[\delta = \max(0,\; R_i + R_j - r)\]where \(r = \|r_{ij}\|\).
The Hertzian normal force and contact energy are:
\[\mathbf{F}_{ij} = k \; \delta^{3/2} \; \hat{n}_{ij}, \qquad U_{ij} = \tfrac{2}{5}\, k \; \delta^{5/2}\]where \(\hat{n}_{ij} = \mathbf{r}_{ij} / r\).
Notes
The material
youngandpoissonproperties are read directly fromSystem.mat_tableper particle; no matchmaker effective value is used.- static force(i: int, j: int, pos: jax.Array, state: State, system: System) tuple[jax.Array, jax.Array][source]#
Compute Hertzian normal contact force on particle i from j.
\[\mathbf{F}_{ij} = \tfrac{4}{3}\, E^*\, \sqrt{R^*}\; \delta^{3/2}\; \hat{n}_{ij}\]- Parameters:
- Returns:
(force, torque)with shapes(dim,)and(ang_dim,).- Return type:
tuple[jax.Array, jax.Array]
- static energy(i: int, j: int, pos: jax.Array, state: State, system: System) jax.Array[source]#
Hertzian contact energy.
\[U_{ij} = \tfrac{2}{5} \cdot \tfrac{4}{3}\, E^*\, \sqrt{R^*}\, \delta^{5/2}\]
- property required_material_properties: tuple[str, ...][source]#
A static tuple of strings specifying the material properties required by this force model.
These properties (e.g., ‘young_eff’, ‘restitution’, …) must be present in the
System.mat_tablefor the model to function correctly. This is used for validation.