jaxdem.bonded_forces.plastic_perimeter_deformable_particle#

Implementation of the plastic perimeter deformable particle model.

Classes

PlasticPerimeterDeformableParticleModel(...)

Deformable particle model with perimeter-level plasticity.

class jaxdem.bonded_forces.plastic_perimeter_deformable_particle.PlasticPerimeterDeformableParticleModel(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, edges_id: Array | None = None, tau_s: Array | None = None)#

Bases: DeformableParticleModel

Deformable particle model with perimeter-level plasticity.

Elastic forces are identical to DeformableParticleModel (individual edge springs, measure, content, bending, and surface-tension terms are all preserved; see its docstring for the full energy definition and shape conventions). The only difference is in the plastic update rule.

Instead of relaxing each edge rest length independently (as in PlasticDeformableParticleModel), the total reference perimeter of each body relaxes toward the current total perimeter, and the change is distributed back to individual edges by uniform rescaling:

\[\begin{split}P_{K,0}^{\text{new}} &= P_{K,0} + \frac{1}{\tau_{s,K}} (P_K - P_{K,0})\,dt \\ L_{e,0}^{\text{new}} &= L_{e,0}\;\frac{P_{K,0}^{\text{new}}}{P_{K,0}} \qquad \forall\, e \in K\end{split}\]

where \(P_K = \sum_{e \in K} L_e\) is the current perimeter, \(P_{K,0} = \sum_{e \in K} L_{e,0}\) the reference perimeter, \(\tau_{s,K}\) the per-body relaxation time, and \(dt\) the time step. Uniform rescaling preserves relative edge proportions within each body.

This model requires an edges_id mapping (shape (E,)) that assigns each edge to its owning body, analogous to elements_id for elements. When only a single body is present and edges_id is omitted, all edges are assumed to belong to body 0.

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

  • edges_id: (E,)

  • tau_s: (K,)

edges_id: Array | None#

(E,). edges_id[e] == k means edge e belongs to body k. Required for perimeter-level plasticity.

Type:

Array of body IDs for each edge. Shape

tau_s: Array | None#

(K,). Controls how fast the total reference perimeter of each body relaxes toward the current perimeter.

Type:

Plastic relaxation time for each body. 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, edges_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) Self[source]#
update_reference_state(pos: jax.Array, state: State, system: System) DeformableParticleModel[source]#

Relax each body’s reference perimeter toward its current perimeter.