jaxdem.integrators.vicsek#

Vicsek-style integrators (extrinsic and intrinsic noise).

Classes

VicsekExtrinsic(neighbor_radius, eta, v0, ...)

Vicsek-model integrator with extrinsic (vectorial) noise.

VicsekIntrinsic(neighbor_radius, eta, v0, ...)

Vicsek-model integrator with intrinsic noise.

class jaxdem.integrators.vicsek.VicsekExtrinsic(neighbor_radius: Array, eta: Array, v0: Array, max_neighbors: int)[source]#

Bases: LinearIntegrator

Vicsek-model integrator with extrinsic (vectorial) noise.

This integrator implements a Vicsek-like update rule by directly setting the translational velocity magnitude to v0 each step, based on the direction of a vector that combines:

  • the current accumulated force vector (from colliders + force functions),

  • the average neighbor velocity direction (including self),

  • an additive random unit vector scaled by eta (extrinsic noise).

Notes

  • Noise is generated per clump (one sample per rigid body) and then broadcast to all clump members so clumps move coherently.

  • Neighbor lists may be cached (e.g., NeighborList collider) or may sort the state (e.g., some cell-list builders). This integrator uses the returned state from create_neighbor_list for consistency.

neighbor_radius: Array#
eta: Array#
v0: Array#
max_neighbors: int#
static step_after_force(state: State, system: System) Tuple[State, System][source][source]#
class jaxdem.integrators.vicsek.VicsekIntrinsic(neighbor_radius: Array, eta: Array, v0: Array, max_neighbors: int)[source]#

Bases: LinearIntegrator

Vicsek-model integrator with intrinsic noise.

This variant perturbs the direction of the desired motion by applying a random rotation to the normalized base direction (rather than adding a random vector in force space as in the extrinsic / vectorial-noise variant).

The base direction is computed from: - the current accumulated force vector (from colliders + force functions), - the average neighbor velocity direction (including self), then noise is applied per clump and broadcast to all clump members so clumps move coherently.

neighbor_radius: Array#
eta: Array#
v0: Array#
max_neighbors: int#
static step_after_force(state: State, system: System) Tuple[State, System][source][source]#