Draft:SPIRAL algorithm
This article, Draft:SPIRAL algorithm, has recently been created via the Articles for creation process. Please check to see if the reviewer has accidentally left this template after accepting the draft and take appropriate action as necessary.
Reviewer tools: Preload talk Inform author |
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)
![]() | This article has multiple issues. Please help improve it or discuss these issues on the talk page. (Learn how and when to remove these messages)
|
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
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
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:<syntaxhighlight lang="julia"> 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 </syntaxhighlight>
Derivation
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]
,

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

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.

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

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.00 1.01 1.02 1.03 1.04 1.05 1.06 1.07 1.08 1.09 1.10 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.
- ^ 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.
- ^ 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.
- ^ 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.
- ^ 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.
- ^ Fincham, David (1992). "Leapfrog Rotational Algorithms". Molecular Simulation. 8 (3–5): 165–178. doi:10.1080/08927029208022474. ISSN 0892-7022.
- ^ 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.
- ^ 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.
- Pending AfC submissions
- Pending AfC submissions in article space
- AfC submissions by date/05 May 2024
- Short description with empty Wikidata description
- All articles with topics of unclear notability
- All Wikipedia neutral point of view disputes
- Draft topics used in wrong namespace
- AfC topic used in wrong namespace