Draft:SPIRAL algorithm

From Wikipedia, the free encyclopedia
  • Comment: This is an article about an algorithm published in 2024, and is a combination of a textbook set of notes on it and an advert. Wikipedia is not the place for this. You need to find 12 or so completely independent reviews or references to it first, which will probably not occur fir some years. Ldm1954 (talk) 12:53, 15 May 2024 (UTC)

SPIRAL[1] is a third-order integration algorithm for solving Euler's rigid body equations of motion using quaternions. It stands for Stable Particle Rotation Integration Algorithm. SPIRAL provides several advantages over existing methods, including improved stability, accuracy, and reduced overall computational cost. Furthermore, its formulation preserves the norm of the quaternion, eliminating the need for recurrent normalization.

This algorithm has practical applications in various fields, such as particle simulation, molecular dynamics (MD), discrete element methods (DEM), physics game engines, computer graphics, robotics, sensors, navigation systems, autonomous vehicles, and control systems.

Euler rigid body equations of motion[edit]

A rotating solid object is described by Euler's rigid body equations of motion:

,

,

,

where is the angular velocity, and is the torque. Both quantities are in the body's principal axis reference frame. The body's principal moments of inertia are , , and . Solving this system of non-linear first-order differential equations yields the body's angular velocity. Using the result, one can calculate the orientation of the body using the norm-conserving quaternion derivative: [1]

.

where is a pure imaginary quaternion representing the angular velocity in the reference frame of the rotating body.

Algorithm[edit]

SPIRAL[1] applies to both leapfrog and non-leapfrog architectures, so it's easily adaptable to different code bases. In this context, the leapfrog version.

First, using the known torques, update the angular velocity:

,

with

.

.

.

The developers of SPIRAL[1] proposed Strong Stability Preserving Runge-Kutta 3 (SSPRK3) to update angular velocity. Nevertheless, other algorithms can be utilized instead. It is important to note that for optimal performance, the integration algorithm selected must be at least as accurate as the quaternion one, making sure that the full advantage of SPIRAL's precision and stability can be taken. Also, as in other leapfrog algorithms, the angular velocity must be initialized half a step backwards. Note that torque is not recalculated for each Runge-Kutta stage, meaning that SPIRAL[1] only requires one force calculation per time step.

Second, update the orientation:

Here the notation represents a quaternion.

Bellow, a sample implementation in Julia of a time step:

using StaticArrays
using ReferenceFrameRotations

function norm(v::Union{AbstractArray, Quaternion})
    return sqrt(mapreduce(x -> x*x, +, v))
end
function Lab_to_body(v::SVector{3, Float64}, q::Quaternion{Float64})::SVector{3, Float64}
    return vect(inv(q)*v*q)
end
function Body_to_lab(v::SVector{3, Float64}, q::Quaternion{Float64})::SVector{3, Float64}
    return vect(q*v*inv(q))
end

function w_dot(w::SVector{3, Float64}, M::SVector{3, Float64}, II::SVector{3, Float64})::SVector{3, Float64}
    return @inbounds SVector{3, Float64}(
            (M[1] + w[2]*w[3]*(II[2] - II[3]))/II[1],
            (M[2] + w[3]*w[1]*(II[3] - II[1]))/II[2],
            (M[3] + w[1]*w[2]*(II[1] - II[2]))/II[3]
        )
end
function SSPRK3(w::SVector{3, Float64}, M::SVector{3, Float64}, II::SVector{3, Float64}, dt::Float64)::SVector{3, Float64}
    # SSPRK3
    k1::SVector{3, Float64} = dt*w_dot(w                 , M, II)
    k2::SVector{3, Float64} = dt*w_dot(w + k1            , M, II)
    k3::SVector{3, Float64} = dt*w_dot(w + 0.25*(k1 + k2), M, II)
    return w + (k1 + k2 + 4.0*k3)/6.0
end
"""
- q: Current particle orientation.
- w: Current angular velocity (in the lab frame) of the particle.
- M: Torque (in the lab frame) acting on the particle.
- II: Inertia tensor in the principal axis frame. In this frame, the tensor is diagonal. Then, we assume it's a 3D vector. 
- dt: Time step.
"""
function step(q::Quaternion{Float64}, w::SVector{3, Float64}, M::SVector{3, Float64}, II::SVector{3, Float64}, dt::Float64)
    w = Lab_to_body(w, q)
    M = Lab_to_body(M, q)

    # Update velocity w(t + dt/2)
    w = SSPRK3(w, M, II, dt)

    # Update quaternion 
    θ1::Float64 = norm(w)*dt/2.0
    q = q*Quaternion(cos(θ1), sin(θ1)*w/norm(w))

    # Go back to lab frame    
    w = Body_to_lab(w, q)
    return (q, w)
end

Derivation[edit]

To derive an expression for , we start with the quaternion's time derivative: [2]

.

is a pure imaginary quaternion representing the angular velocity in the reference frame of the rotating body. Assuming that it depends only explicitly on time and solve by separation of variables:

,

to obtain

.

Expanding the angular velocity in a Taylor series around we get

.

Taking (leapfrog assumption) and perform the integral, we get

,

with

.

The exponential of a purely imaginary quaternion , where is a scalar and , a unit quaternion, reads[3]

,

Comparison of the quaternion relative error for different algorithms and SPIRAL at t=1 s as a function of the time step, as compared to an analytical solution.

with the unit vector . Then

Completing the derivation of the algorithm. This formulation preserves the norm of the initial quaternion, thus eliminating the need for subsequent normalization. Nonetheless, normalizing the quaternion every 50000 steps or so could prevent floating point precision-induced instabilities.

Accuracy and Stability[edit]

Comparison of the angular velocity relative error for different algorithms and SPIRAL at t=1 s as a function of the time step, as compared to an analytical solution.

To evaluate the accuracy and stability of SPIRAL[1], its output can be compared against an analytical solution, providing a reliable means of assessing its performance relative to other integration algorithms. The chosen analytical solution serves as a benchmark, representing the rotational motion of a cylinder under the influence of a constant torque applied along one of its principal axes. The algorithms in the comparison are the algorithms used to integrate the rotational motion of particles in various well-established open-source and commercial discrete element method (DEM) programs like Yade[2], MercuryDPM[3], etc[1]. The in the comparison are Runge-Kutta4 (but this one requires four force calculations per time step while the others only require one), Direct Euler, Velocity Verlet, Buss algorithm[4], Johnson algorithm[5], Fincham Leapfrog[6], Omelyan advanced leapfrog[7], algorithm found in MercuryDPM source code [8] and both SPIRAL[1] versions.

Comparison of the quaternion relative error for different algorithms and SPIRAL at t=1 s as a function of simulation time, as compared to an analytical solution.

First, the relative error between the analytical solution and the different integration algorithms as a function of the time step shows heuristically the convergence and accuracy of each algorithm. It is clear from this plot that all the algorithms, except for Runge-Kutta4 and SPIRAL[1], are second-order. SPIRAL[1] is third-order, and Runge-Kutta4 is fourth-order. However, Runge-Kutta requires four force calculations per time step, while SPIRAL[1] only requires one.

Although the error vs the time step provides insight into the accuracy of each algorithm, it is difficult to evaluate their stability. Therefore, to assess the stability of each algorithm, the plot of the error as a function of time using a time step of .

Code that reproduces these benchmarks and other benchmarks is publically available.[1]

Non-Leapfrog Version[edit]

Comparison of the angular velocity relative error for different algorithms and SPIRAL at t=1 s as a function of simulation time, as compared to an analytical solution.

To derive a non-leapfrog variant of SPIRAL, we follow the same procedure of the derivation section but with :

which is the non-leapfrog version of SPIRAL. Using the exponential of a quaternion: [4]

,

with

,

.

The non-leapfrog variant does not need a half backward step for initialization of the angular velocity. However, in this version the quaternion should be updated before the angular velocity.

  1. ^ a b c d e f g h i j k del Valle, Carlos Andrés; Angelidakis, Vasileios; Roy, Sudeshna; Muñoz, José Daniel; Pöschel, Thorsten (2024). "SPIRAL: An efficient algorithm for the integration of the equation of rotational motion". Computer Physics Communications. 297: 109077. arXiv:2311.04106. Bibcode:2024CoPhC.29709077D. doi:10.1016/j.cpc.2023.109077. ISSN 0010-4655.
  2. ^ Vaclav Smilauer; Angelidakis, Vasileios; Catalano, Emanuele; Caulk, Robert; Chareyre, Bruno; Chèvremont, William; Dorofeenko, Sergei; Duriez, Jerome; Dyck, Nolan; Elias, Jan; Er, Burak; Eulitz, Alexander; Gladky, Anton; Guo, Ning; Jakob, Christian; Francois Kneib; Kozicki, Janek; Marzougui, Donia; Maurin, Raphael; Modenese, Chiara; Pekmezi, Gerald; Scholtès, Luc; Sibille, Luc; Stransky, Jan; Sweijen, Thomas; Thoeni, Klaus; Yuan, Chao (2021-11-15). Yade documentation. The Yade Project. doi:10.5281/zenodo.5705394.
  3. ^ Weinhart, Thomas; Orefice, Luca; Post, Mitchel; van Schrojenstein Lantman, Marnix P.; Denissen, Irana F.C.; Tunuguntla, Deepak R.; Tsang, J.M.F.; Cheng, Hongyang; Shaheen, Mohamad Yousef; Shi, Hao; Rapino, Paolo; Grannonio, Elena; Losacco, Nunzio; Barbosa, Joao; Jing, Lu (2020). "Fast, flexible particle simulations — An introduction to MercuryDPM". Computer Physics Communications. 249: 107129. Bibcode:2020CoPhC.24907129W. doi:10.1016/j.cpc.2019.107129. ISSN 0010-4655.
  4. ^ Buss, Samuel R. (2000). "Accurate and Efficient Simulation of Rigid-Body Rotations". Journal of Computational Physics. 164 (2): 377–406. Bibcode:2000JCoPh.164..377B. doi:10.1006/jcph.2000.6602. ISSN 0021-9991.
  5. ^ Johnson, Scott M.; Williams, John R.; Cook, Benjamin K. (2008-05-21). "Quaternion-based rigid body rotation integration algorithms for use in particle methods". International Journal for Numerical Methods in Engineering. 74 (8): 1303–1313. Bibcode:2008IJNME..74.1303J. doi:10.1002/nme.2210. ISSN 0029-5981.
  6. ^ Fincham, David (1992). "Leapfrog Rotational Algorithms". Molecular Simulation. 8 (3–5): 165–178. doi:10.1080/08927029208022474. ISSN 0892-7022.
  7. ^ Omelyan, Igor P. (1998-07-01). "Algorithm for numerical integration of the rigid-body equations of motion". Physical Review E. 58 (1): 1169–1172. arXiv:physics/9901027. Bibcode:1998PhRvE..58.1169O. doi:10.1103/PhysRevE.58.1169.
  8. ^ Ostanin, Igor; Angelidakis, Vasileios; Plath, Timo; Pourandi, Sahar; Thornton, Anthony; Weinhart, Thomas (2024). "Rigid clumps in the MercuryDPM particle dynamics code". Computer Physics Communications. 296: 109034. arXiv:2310.05027. Bibcode:2024CoPhC.29609034O. doi:10.1016/j.cpc.2023.109034. ISSN 0010-4655.