Line data Source code
1 1 : // Distributed under the MIT License. 2 : // See LICENSE.txt for details. 3 : 4 : /// \file 5 : /// Defines helper functions for converting between `DataVector`s and boost 6 : /// quaternions. 7 : 8 : #pragma once 9 : 10 : #include "DataStructures/BoostMultiArray.hpp" 11 : 12 : #include <boost/math/quaternion.hpp> 13 : #include <boost/numeric/odeint.hpp> 14 : 15 : #include "DataStructures/DataVector.hpp" 16 : 17 : /// \cond 18 : namespace gsl { 19 : template <class T> 20 : class not_null; 21 : } // namespace gsl 22 : /// \endcond 23 : 24 : /// Convert a `boost::math::quaternion` to a `DataVector` 25 1 : DataVector quaternion_to_datavector( 26 : const boost::math::quaternion<double>& input); 27 : 28 : /// \brief Convert a `DataVector` to a `boost::math::quaternion` 29 : /// 30 : /// \details To convert to a quaternion, a `DataVector` must have either 3 or 4 31 : /// components. If it has 3 components, the quaternion will be constructed with 32 : /// 0 scalar part while the vector part is the `DataVector`. If the `DataVector` 33 : /// has 4 components, the quaternion is just the `DataVector` itself. 34 1 : boost::math::quaternion<double> datavector_to_quaternion( 35 : const DataVector& input); 36 : 37 : /// Normalize a `boost::math::quaternion` 38 1 : void normalize_quaternion( 39 : gsl::not_null<boost::math::quaternion<double>*> input); 40 : 41 : // Necessary for odeint to be able to integrate boost quaternions 42 0 : namespace boost::numeric::odeint { 43 : template <> 44 0 : struct vector_space_norm_inf<boost::math::quaternion<double>> { 45 0 : using result_type = double; 46 0 : result_type operator()(const boost::math::quaternion<double>& q) const { 47 : return sup(q); 48 : } 49 : }; 50 : } // namespace boost::numeric::odeint