jaxdem.bonded_forces.plastic_bending_deformable_particle#

Implementation of the deformable particle model with plastic bending angles.

Classes

PlasticBendingDeformableParticleModel(...[, ...])

Deformable particle model with plastic bending angles.

class jaxdem.bonded_forces.plastic_bending_deformable_particle.PlasticBendingDeformableParticleModel(elements: Array | None, edges: Array | None, element_adjacency: Array | None, element_adjacency_edges: Array | None, elements_id: Array | None, initial_body_contents: Array | None, initial_element_measures: Array | None, initial_edge_lengths: Array | None, initial_bendings: Array | None, w_b: Array | None, em: Array | None, ec: Array | None, eb: Array | None, el: Array | None, gamma: Array | None, vertex_count: int = 0, tau_s: Array | None = None)#

Bases: DeformableParticleModel

Deformable particle model with plastic bending angles.

Elastic forces match DeformableParticleModel. The model keeps the edge-spring, measure, content, bending, and surface-tension terms. See the DeformableParticleModel docstring for the full energy definition and shape conventions. The only difference is the plastic update rule for the reference bending angles.

Instead of relaxing each edge rest length (as in PlasticDeformableParticleModel), the reference bending angle of each adjacency relaxes toward the current bending angle:

The update runs once per physical time step, after the integrator drift and before force evaluation.

\[\theta_{a,0}(t+dt) = \theta_{a,0}(t) + (1-e^{-dt/\tau_{s,a}})\operatorname{wrap}(\theta_a(t)-\theta_{a,0}(t))\]

where \(\theta_{a,0}\) is the reference (rest) bending angle (initial_bendings), \(\theta_a\) is the current bending angle, \(\tau_{s,a}\) is the relaxation time (tau_s), and \(dt\) is the simulation time step. The wrapped difference lies in [-pi, pi]. Each update integrates relaxation exactly with the current angle held fixed; infinite tau_s leaves the reference unchanged.

Shapes (see DeformableParticleModel for definitions of K, M, E, A):

  • tau_s: (A,) — one relaxation time per adjacency (bending hinge).

tau_s: Array | None#

(A,).

Type:

Plastic relaxation time for each adjacency (bending hinge). Shape

classmethod Create(*, vertices: Array | ndarray | bool | number | bool | int | float | complex | None = None, elements: Array | ndarray | bool | number | bool | int | float | complex | None = None, edges: Array | ndarray | bool | number | bool | int | float | complex | None = None, element_adjacency: Array | ndarray | bool | number | bool | int | float | complex | None = None, element_adjacency_edges: Array | ndarray | bool | number | bool | int | float | complex | None = None, elements_id: Array | ndarray | bool | number | bool | int | float | complex | None = None, initial_body_contents: Array | ndarray | bool | number | bool | int | float | complex | None = None, initial_element_measures: Array | ndarray | bool | number | bool | int | float | complex | None = None, initial_edge_lengths: Array | ndarray | bool | number | bool | int | float | complex | None = None, initial_bendings: Array | ndarray | bool | number | bool | int | float | complex | None = None, em: Array | ndarray | bool | number | bool | int | float | complex | None = None, ec: Array | ndarray | bool | number | bool | int | float | complex | None = None, eb: Array | ndarray | bool | number | bool | int | float | complex | None = None, el: Array | ndarray | bool | number | bool | int | float | complex | None = None, gamma: Array | ndarray | bool | number | bool | int | float | complex | None = None, tau_s: Array | ndarray | bool | number | bool | int | float | complex | None = None, w_b: Array | ndarray | bool | number | bool | int | float | complex | None = None, vertex_count: int | None = None) → Self[source]#
update_reference_state(pos: jax.Array, state: State, system: System) → DeformableParticleModel[source]#

Relax each reference bending angle toward the current bending angle.