jaxdem.integrators.spiral#
Angular-velocity integrator based on the spiral scheme.
Functions
|
Compute the time derivative of the angular velocity for diagonal inertia. |
Classes
|
Non-leapfrog spiral integrator for angular velocities. |
- class jaxdem.integrators.spiral.Spiral[source]#
Bases:
RotationIntegratorNon-leapfrog spiral integrator for angular velocities.
The implementation follows the velocity update described in del Valle et al. (2023).
- static step_after_force(state: State, system: System) Tuple['State', 'System'][source][source]#
Advance angular velocities by a single time step.
A third-order Runge–Kutta scheme (SSPRK3) integrates the rigid-body angular momentum equations in the principal axis frame. The quaternion is updated based on the spiral non-leapfrog algorithm.
SPIRAL algorithm:
\[q(t + \Delta t) = q(t) \cdot e^\left(\frac{\Delta t}{2}\omega\right) \cdot e^\left(\frac{\Delta t^2}{4}\dot{\omega}\right)\]Where the angular velocity and its derivative are purely imaginary quaternions (scalar part is zero and the vector part is equal to the vector). The exponential map of a purely imaginary quaternion is
\[e^u = \cos(|u|) + \frac{\vec{u}}{|u|}\sin(|u|)\]Angular velocity is then updated using SSPRK3:
\[\begin{split}& \vec{\omega}(t + \Delta t) = \vec{\omega}(t) + \frac{1}{6}(k_1 + k_2 + 4k_3) \\ & k_1 = \Delta t\; \dot{\vec{\omega}}(\vec{\omega}(t + \Delta t / 2), \vec{\tau}(t + \Delta t)) \\ & k_2 = \Delta t\; \dot{\vec{\omega}}(\vec{\omega}(t + \Delta t / 2) + k1, \vec{\tau}(t + \Delta t)) \\ & k_3 = \Delta t\; \dot{\vec{\omega}}(\vec{\omega}(t + \Delta t / 2) + (k1 + k2)/4, \vec{\tau}(t + \Delta t)) \\\end{split}\]Where the angular velocity derivative is a function of the torque and angular velocity:
\[\dot{\vec{\omega}} = (\tau - \vec{\omega} \times (I \vec{\omega}))I^{-1}\]- Parameters:
- Returns:
The updated state and system after one time step.
- Return type:
Reference#
del Valle et. al, SPIRAL: An efficient algorithm for the integration of the equation of rotational motion, https://doi.org/10.1016/j.cpc.2023.109077.
Note
This method donates state and system
TO DO: make it work without padding the vectors