163 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			163 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | /* | ||
|  |  [auto_generated] | ||
|  |  boost/numeric/odeint/stepper/symplectic_rkn_sb3a_mclachlan.hpp | ||
|  |   | ||
|  |  [begin_description] | ||
|  |  Implementation of the symplectic MacLachlan stepper for separable Hamiltonian system. | ||
|  |  [end_description] | ||
|  |   | ||
|  |  Copyright 2011-2013 Karsten Ahnert | ||
|  |  Copyright 2011-2013 Mario Mulansky | ||
|  |   | ||
|  |  Distributed under the Boost Software License, Version 1.0. | ||
|  |  (See accompanying file LICENSE_1_0.txt or | ||
|  |  copy at http://www.boost.org/LICENSE_1_0.txt) | ||
|  | */ | ||
|  | 
 | ||
|  | 
 | ||
|  | #ifndef BOOST_NUMERIC_ODEINT_STEPPER_SYMPLECTIC_RKN_SB3A_MCLACHLAN_HPP_INCLUDED | ||
|  | #define BOOST_NUMERIC_ODEINT_STEPPER_SYMPLECTIC_RKN_SB3A_MCLACHLAN_HPP_INCLUDED | ||
|  | 
 | ||
|  | 
 | ||
|  | #include <boost/numeric/odeint/stepper/base/symplectic_rkn_stepper_base.hpp> | ||
|  | 
 | ||
|  | #include <boost/numeric/odeint/algebra/range_algebra.hpp> | ||
|  | #include <boost/numeric/odeint/algebra/default_operations.hpp> | ||
|  | #include <boost/numeric/odeint/algebra/algebra_dispatcher.hpp> | ||
|  | #include <boost/numeric/odeint/algebra/operations_dispatcher.hpp> | ||
|  | 
 | ||
|  | #include <boost/numeric/odeint/util/resizer.hpp> | ||
|  | 
 | ||
|  | #include <boost/array.hpp> | ||
|  | 
 | ||
|  | namespace boost { | ||
|  | namespace numeric { | ||
|  | namespace odeint { | ||
|  | 
 | ||
|  | 
 | ||
|  | #ifndef DOXYGEN_SKIP | ||
|  | namespace detail { | ||
|  | namespace symplectic_rkn_sb3a_mclachlan { | ||
|  | 
 | ||
|  |     /* | ||
|  |       exp( a1 t A ) exp( b1 t B ) | ||
|  |       exp( a2 t A ) exp( b2 t B ) | ||
|  |       exp( a3 t A ) exp( b3 t B ) exp( a3 t A ) | ||
|  |       exp( b2 t B ) exp( a2 t A ) | ||
|  |       exp( b1 t B ) exp( a1 t A ) | ||
|  |     */ | ||
|  | 
 | ||
|  |     template< class Value > | ||
|  |     struct coef_a_type : public boost::array< Value , 6 > | ||
|  |     { | ||
|  |         coef_a_type( void ) | ||
|  |         { | ||
|  |             (*this)[0] = static_cast< Value >( 0.40518861839525227722 ); | ||
|  |             (*this)[1] = static_cast< Value >( -0.28714404081652408900 ); | ||
|  |             (*this)[2] = static_cast< Value >( 1 ) / static_cast< Value >( 2 ) - ( (*this)[0] + (*this)[1] ); | ||
|  |             (*this)[3] = (*this)[2]; | ||
|  |             (*this)[4] = (*this)[1]; | ||
|  |             (*this)[5] = (*this)[0]; | ||
|  | 
 | ||
|  |         } | ||
|  |     }; | ||
|  | 
 | ||
|  |     template< class Value > | ||
|  |     struct coef_b_type : public boost::array< Value , 6 > | ||
|  |     { | ||
|  |         coef_b_type( void ) | ||
|  |         { | ||
|  |             (*this)[0] = static_cast< Value >( -3 ) / static_cast< Value >( 73 ); | ||
|  |             (*this)[1] = static_cast< Value >( 17 ) / static_cast< Value >( 59 ); | ||
|  |             (*this)[2] = static_cast< Value >( 1 ) - static_cast< Value >( 2 ) * ( (*this)[0] + (*this)[1] ); | ||
|  |             (*this)[3] = (*this)[1]; | ||
|  |             (*this)[4] = (*this)[0]; | ||
|  |             (*this)[5] = static_cast< Value >( 0 ); | ||
|  |         } | ||
|  |     }; | ||
|  | 
 | ||
|  | } // namespace symplectic_rkn_sb3a_mclachlan | ||
|  | } // namespace detail | ||
|  | #endif // DOXYGEN_SKIP | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | template< | ||
|  |     class Coor , | ||
|  |     class Momentum = Coor , | ||
|  |     class Value = double , | ||
|  |     class CoorDeriv = Coor , | ||
|  |     class MomentumDeriv = Coor , | ||
|  |     class Time = Value , | ||
|  |     class Algebra = typename algebra_dispatcher< Coor >::algebra_type , | ||
|  |     class Operations = typename operations_dispatcher< Coor >::operations_type , | ||
|  |     class Resizer = initially_resizer | ||
|  |     > | ||
|  | #ifndef DOXYGEN_SKIP | ||
|  | class symplectic_rkn_sb3a_mclachlan : | ||
|  |         public symplectic_nystroem_stepper_base | ||
|  | < | ||
|  |     6 , 4 , | ||
|  |     Coor , Momentum , Value , CoorDeriv , MomentumDeriv , Time , Algebra , Operations , Resizer | ||
|  |     > | ||
|  | #else | ||
|  | class symplectic_rkn_sb3a_mclachlan : public symplectic_nystroem_stepper_base | ||
|  | #endif | ||
|  | { | ||
|  | public: | ||
|  | #ifndef DOXYGEN_SKIP | ||
|  |     typedef symplectic_nystroem_stepper_base | ||
|  |     < | ||
|  |     6 , 4 , | ||
|  |     Coor , Momentum , Value , CoorDeriv , MomentumDeriv , Time , Algebra , Operations , Resizer | ||
|  |     > stepper_base_type; | ||
|  | #endif | ||
|  |     typedef typename stepper_base_type::algebra_type algebra_type; | ||
|  |     typedef typename stepper_base_type::value_type value_type; | ||
|  | 
 | ||
|  | 
 | ||
|  |     symplectic_rkn_sb3a_mclachlan( const algebra_type &algebra = algebra_type() ) | ||
|  |         : stepper_base_type( | ||
|  |             detail::symplectic_rkn_sb3a_mclachlan::coef_a_type< value_type >() , | ||
|  |             detail::symplectic_rkn_sb3a_mclachlan::coef_b_type< value_type >() , | ||
|  |             algebra ) | ||
|  |     { } | ||
|  | }; | ||
|  | 
 | ||
|  | 
 | ||
|  | /************* DOXYGEN ***********/ | ||
|  | 
 | ||
|  | /** | ||
|  |  * \class symplectic_rkn_sb3a_mclachlan | ||
|  |  * \brief Implement of the symmetric B3A method of Runge-Kutta-Nystroem method of sixth order. | ||
|  |  * | ||
|  |  * The method is of fourth order and has six stages. It is described HERE. This method cannot be used | ||
|  |  * with multiprecision types since the coefficients are not defined analytically. | ||
|  |  * | ||
|  |  * ToDo Add reference to the paper. | ||
|  |  * | ||
|  |  * \tparam Order The order of the stepper. | ||
|  |  * \tparam Coor The type representing the coordinates q. | ||
|  |  * \tparam Momentum The type representing the coordinates p. | ||
|  |  * \tparam Value The basic value type. Should be something like float, double or a high-precision type. | ||
|  |  * \tparam CoorDeriv The type representing the time derivative of the coordinate dq/dt. | ||
|  |  * \tparam MomemtnumDeriv The type representing the time derivative of the momentum dp/dt. | ||
|  |  * \tparam Time The type representing the time t. | ||
|  |  * \tparam Algebra The algebra. | ||
|  |  * \tparam Operations The operations. | ||
|  |  * \tparam Resizer The resizer policy. | ||
|  |  */ | ||
|  | 
 | ||
|  |     /** | ||
|  |      * \fn symplectic_rkn_sb3a_mclachlan::symplectic_rkn_sb3a_mclachlan( const algebra_type &algebra ) | ||
|  |      * \brief Constructs the symplectic_rkn_sb3a_mclachlan. This constructor can be used as a default | ||
|  |      * constructor if the algebra has a default constructor. | ||
|  |      * \param algebra A copy of algebra is made and stored inside explicit_stepper_base. | ||
|  |      */ | ||
|  | 
 | ||
|  | } // namespace odeint | ||
|  | } // namespace numeric | ||
|  | } // namespace boost | ||
|  | 
 | ||
|  | #endif // BOOST_NUMERIC_ODEINT_STEPPER_SYMPLECTIC_RKN_SB3A_MCLACHLAN_HPP_INCLUDED |