]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/numeric/odeint/include/boost/numeric/odeint/stepper/symplectic_rkn_sb3a_m4_mclachlan.hpp
bump version to 12.2.2-pve1
[ceph.git] / ceph / src / boost / libs / numeric / odeint / include / boost / numeric / odeint / stepper / symplectic_rkn_sb3a_m4_mclachlan.hpp
1 /*
2 [auto_generated]
3 boost/numeric/odeint/stepper/symplectic_rkn_sb3a_m4_mclachlan.hpp
4
5 [begin_description]
6 tba.
7 [end_description]
8
9 Copyright 2012-2013 Karsten Ahnert
10 Copyright 2012-2013 Mario Mulansky
11
12 Distributed under the Boost Software License, Version 1.0.
13 (See accompanying file LICENSE_1_0.txt or
14 copy at http://www.boost.org/LICENSE_1_0.txt)
15 */
16
17
18 #ifndef BOOST_NUMERIC_ODEINT_STEPPER_SYMPLECTIC_RKN_SB3A_M4_MCLACHLAN_HPP_DEFINED
19 #define BOOST_NUMERIC_ODEINT_STEPPER_SYMPLECTIC_RKN_SB3A_M4_MCLACHLAN_HPP_DEFINED
20
21 #include <boost/numeric/odeint/algebra/default_operations.hpp>
22 #include <boost/numeric/odeint/algebra/algebra_dispatcher.hpp>
23 #include <boost/numeric/odeint/algebra/operations_dispatcher.hpp>
24
25 #include <boost/numeric/odeint/util/resizer.hpp>
26
27
28 namespace boost {
29 namespace numeric {
30 namespace odeint {
31
32 #ifndef DOXYGEN_SKIP
33 namespace detail {
34 namespace symplectic_rkn_sb3a_m4_mclachlan {
35
36 /*
37 exp( a1 t A ) exp( b1 t B )
38 exp( a2 t A ) exp( b2 t B )
39 exp( a3 t A )
40 exp( b2 t B ) exp( a2 t A )
41 exp( b1 t B ) exp( a1 t A )
42 */
43
44
45
46 template< class Value >
47 struct coef_a_type : public boost::array< Value , 5 >
48 {
49 coef_a_type( void )
50 {
51 using std::sqrt;
52
53 Value z = sqrt( static_cast< Value >( 7 ) / static_cast< Value >( 8 ) ) / static_cast< Value >( 3 );
54 (*this)[0] = static_cast< Value >( 1 ) / static_cast< Value >( 2 ) - z ;
55 (*this)[1] = static_cast< Value >( -1 ) / static_cast< Value >( 3 ) + z ;
56 (*this)[2] = static_cast< Value >( 2 ) / static_cast< Value >( 3 );
57 (*this)[3] = (*this)[1];
58 (*this)[4] = (*this)[0];
59 }
60 };
61
62 template< class Value >
63 struct coef_b_type : public boost::array< Value , 5 >
64 {
65 coef_b_type( void )
66 {
67 (*this)[0] = static_cast< Value >( 1 );
68 (*this)[1] = static_cast< Value >( -1 ) / static_cast< Value >( 2 );
69 (*this)[2] = (*this)[1];
70 (*this)[3] = (*this)[0];
71 (*this)[4] = static_cast< Value >( 0 );
72 }
73 };
74
75 } // namespace symplectic_rkn_sb3a_m4_mclachlan
76 } // namespace detail
77 #endif // DOXYGEN_SKIP
78
79
80
81
82 template<
83 class Coor ,
84 class Momentum = Coor ,
85 class Value = double ,
86 class CoorDeriv = Coor ,
87 class MomentumDeriv = Coor ,
88 class Time = Value ,
89 class Algebra = typename algebra_dispatcher< Coor >::algebra_type ,
90 class Operations = typename operations_dispatcher< Coor >::operations_type ,
91 class Resizer = initially_resizer
92 >
93 #ifndef DOXYGEN_SKIP
94 class symplectic_rkn_sb3a_m4_mclachlan :
95 public symplectic_nystroem_stepper_base
96 <
97 5 , 4 ,
98 Coor , Momentum , Value , CoorDeriv , MomentumDeriv , Time , Algebra , Operations , Resizer
99 >
100 #else
101 class symplectic_rkn_sb3a_m4_mclachlan : public symplectic_nystroem_stepper_base
102 #endif
103 {
104 public:
105 #ifndef DOXYGEN_SKIP
106 typedef symplectic_nystroem_stepper_base
107 <
108 5 , 4 ,
109 Coor , Momentum , Value , CoorDeriv , MomentumDeriv , Time , Algebra , Operations , Resizer
110 > stepper_base_type;
111 #endif
112 typedef typename stepper_base_type::algebra_type algebra_type;
113 typedef typename stepper_base_type::value_type value_type;
114
115
116 symplectic_rkn_sb3a_m4_mclachlan( const algebra_type &algebra = algebra_type() )
117 : stepper_base_type(
118 detail::symplectic_rkn_sb3a_m4_mclachlan::coef_a_type< value_type >() ,
119 detail::symplectic_rkn_sb3a_m4_mclachlan::coef_b_type< value_type >() ,
120 algebra )
121 { }
122 };
123
124
125 /***************** DOXYGEN ***************/
126
127 /**
128 * \class symplectic_rkn_sb3a_m4_mclachlan
129 * \brief Implementation of the symmetric B3A Runge-Kutta Nystroem method of fifth order.
130 *
131 * The method is of fourth order and has five stages. It is described HERE. This method can be used
132 * with multiprecision types since the coefficients are defined analytically.
133 *
134 * ToDo: add reference to paper.
135 *
136 * \tparam Order The order of the stepper.
137 * \tparam Coor The type representing the coordinates q.
138 * \tparam Momentum The type representing the coordinates p.
139 * \tparam Value The basic value type. Should be something like float, double or a high-precision type.
140 * \tparam CoorDeriv The type representing the time derivative of the coordinate dq/dt.
141 * \tparam MomemtnumDeriv The type representing the time derivative of the momentum dp/dt.
142 * \tparam Time The type representing the time t.
143 * \tparam Algebra The algebra.
144 * \tparam Operations The operations.
145 * \tparam Resizer The resizer policy.
146 */
147
148 /**
149 * \fn symplectic_rkn_sb3a_m4_mclachlan::symplectic_rkn_sb3a_m4_mclachlan( const algebra_type &algebra )
150 * \brief Constructs the symplectic_rkn_sb3a_m4_mclachlan. This constructor can be used as a default
151 * constructor if the algebra has a default constructor.
152 * \param algebra A copy of algebra is made and stored inside explicit_stepper_base.
153 */
154
155 } // namespace odeint
156 } // namespace numeric
157 } // namespace boost
158
159
160 #endif // BOOST_NUMERIC_ODEINT_STEPPER_SYMPLECTIC_RKN_SB3A_M4_MCLACHLAN_HPP_DEFINED