1 /*
2  [auto_generated]
3  boost/numeric/odeint/stepper/symplectic_rkn_sb3a_mclachlan.hpp
4 
5  [begin_description]
6  Implementation of the symplectic MacLachlan stepper for separable Hamiltonian system.
7  [end_description]
8 
9  Copyright 2011-2013 Karsten Ahnert
10  Copyright 2011-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_MCLACHLAN_HPP_INCLUDED
19 #define BOOST_NUMERIC_ODEINT_STEPPER_SYMPLECTIC_RKN_SB3A_MCLACHLAN_HPP_INCLUDED
20 
21 
22 #include <boost/numeric/odeint/stepper/base/symplectic_rkn_stepper_base.hpp>
23 
24 #include <boost/numeric/odeint/algebra/range_algebra.hpp>
25 #include <boost/numeric/odeint/algebra/default_operations.hpp>
26 #include <boost/numeric/odeint/algebra/algebra_dispatcher.hpp>
27 #include <boost/numeric/odeint/algebra/operations_dispatcher.hpp>
28 
29 #include <boost/numeric/odeint/util/resizer.hpp>
30 
31 #include <boost/array.hpp>
32 
33 namespace boost {
34 namespace numeric {
35 namespace odeint {
36 
37 
38 #ifndef DOXYGEN_SKIP
39 namespace detail {
40 namespace symplectic_rkn_sb3a_mclachlan {
41 
42     /*
43       exp( a1 t A ) exp( b1 t B )
44       exp( a2 t A ) exp( b2 t B )
45       exp( a3 t A ) exp( b3 t B ) exp( a3 t A )
46       exp( b2 t B ) exp( a2 t A )
47       exp( b1 t B ) exp( a1 t A )
48     */
49 
50     template< class Value >
51     struct coef_a_type : public boost::array< Value , 6 >
52     {
coef_a_typeboost::numeric::odeint::detail::symplectic_rkn_sb3a_mclachlan::coef_a_type53         coef_a_type( void )
54         {
55             (*this)[0] = static_cast< Value >( 0.40518861839525227722 );
56             (*this)[1] = static_cast< Value >( -0.28714404081652408900 );
57             (*this)[2] = static_cast< Value >( 1 ) / static_cast< Value >( 2 ) - ( (*this)[0] + (*this)[1] );
58             (*this)[3] = (*this)[2];
59             (*this)[4] = (*this)[1];
60             (*this)[5] = (*this)[0];
61 
62         }
63     };
64 
65     template< class Value >
66     struct coef_b_type : public boost::array< Value , 6 >
67     {
coef_b_typeboost::numeric::odeint::detail::symplectic_rkn_sb3a_mclachlan::coef_b_type68         coef_b_type( void )
69         {
70             (*this)[0] = static_cast< Value >( -3 ) / static_cast< Value >( 73 );
71             (*this)[1] = static_cast< Value >( 17 ) / static_cast< Value >( 59 );
72             (*this)[2] = static_cast< Value >( 1 ) - static_cast< Value >( 2 ) * ( (*this)[0] + (*this)[1] );
73             (*this)[3] = (*this)[1];
74             (*this)[4] = (*this)[0];
75             (*this)[5] = static_cast< Value >( 0 );
76         }
77     };
78 
79 } // namespace symplectic_rkn_sb3a_mclachlan
80 } // namespace detail
81 #endif // DOXYGEN_SKIP
82 
83 
84 
85 template<
86     class Coor ,
87     class Momentum = Coor ,
88     class Value = double ,
89     class CoorDeriv = Coor ,
90     class MomentumDeriv = Coor ,
91     class Time = Value ,
92     class Algebra = typename algebra_dispatcher< Coor >::algebra_type ,
93     class Operations = typename operations_dispatcher< Coor >::operations_type ,
94     class Resizer = initially_resizer
95     >
96 #ifndef DOXYGEN_SKIP
97 class symplectic_rkn_sb3a_mclachlan :
98         public symplectic_nystroem_stepper_base
99 <
100     6 , 4 ,
101     Coor , Momentum , Value , CoorDeriv , MomentumDeriv , Time , Algebra , Operations , Resizer
102     >
103 #else
104 class symplectic_rkn_sb3a_mclachlan : public symplectic_nystroem_stepper_base
105 #endif
106 {
107 public:
108 #ifndef DOXYGEN_SKIP
109     typedef symplectic_nystroem_stepper_base
110     <
111     6 , 4 ,
112     Coor , Momentum , Value , CoorDeriv , MomentumDeriv , Time , Algebra , Operations , Resizer
113     > stepper_base_type;
114 #endif
115     typedef typename stepper_base_type::algebra_type algebra_type;
116     typedef typename stepper_base_type::value_type value_type;
117 
118 
symplectic_rkn_sb3a_mclachlan(const algebra_type & algebra=algebra_type ())119     symplectic_rkn_sb3a_mclachlan( const algebra_type &algebra = algebra_type() )
120         : stepper_base_type(
121             detail::symplectic_rkn_sb3a_mclachlan::coef_a_type< value_type >() ,
122             detail::symplectic_rkn_sb3a_mclachlan::coef_b_type< value_type >() ,
123             algebra )
124     { }
125 };
126 
127 
128 /************* DOXYGEN ***********/
129 
130 /**
131  * \class symplectic_rkn_sb3a_mclachlan
132  * \brief Implement of the symmetric B3A method of Runge-Kutta-Nystroem method of sixth order.
133  *
134  * The method is of fourth order and has six stages. It is described HERE. This method cannot be used
135  * with multiprecision types since the coefficients are not defined analytically.
136  *
137  * ToDo Add reference to the paper.
138  *
139  * \tparam Order The order of the stepper.
140  * \tparam Coor The type representing the coordinates q.
141  * \tparam Momentum The type representing the coordinates p.
142  * \tparam Value The basic value type. Should be something like float, double or a high-precision type.
143  * \tparam CoorDeriv The type representing the time derivative of the coordinate dq/dt.
144  * \tparam MomemtnumDeriv The type representing the time derivative of the momentum dp/dt.
145  * \tparam Time The type representing the time t.
146  * \tparam Algebra The algebra.
147  * \tparam Operations The operations.
148  * \tparam Resizer The resizer policy.
149  */
150 
151     /**
152      * \fn symplectic_rkn_sb3a_mclachlan::symplectic_rkn_sb3a_mclachlan( const algebra_type &algebra )
153      * \brief Constructs the symplectic_rkn_sb3a_mclachlan. This constructor can be used as a default
154      * constructor if the algebra has a default constructor.
155      * \param algebra A copy of algebra is made and stored inside explicit_stepper_base.
156      */
157 
158 } // namespace odeint
159 } // namespace numeric
160 } // namespace boost
161 
162 #endif // BOOST_NUMERIC_ODEINT_STEPPER_SYMPLECTIC_RKN_SB3A_MCLACHLAN_HPP_INCLUDED
163