137 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			137 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | /* | ||
|  |  [auto_generated] | ||
|  |  boost/numeric/odeint/stepper/symplectic_euler.hpp | ||
|  | 
 | ||
|  |  [begin_description] | ||
|  |  Implementation of the symplectic Euler for separable Hamiltonian systems. | ||
|  |  [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_EULER_HPP_INCLUDED | ||
|  | #define BOOST_NUMERIC_ODEINT_STEPPER_SYMPLECTIC_EULER_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/array.hpp> | ||
|  | 
 | ||
|  | namespace boost { | ||
|  | namespace numeric { | ||
|  | namespace odeint { | ||
|  | 
 | ||
|  | 
 | ||
|  | #ifndef DOXYGEN_SKIP | ||
|  | namespace detail { | ||
|  | namespace symplectic_euler_coef { | ||
|  | 
 | ||
|  | template< class Value > | ||
|  | struct coef_a_type : public boost::array< Value , 1 > | ||
|  | { | ||
|  |     coef_a_type( void ) | ||
|  |     { | ||
|  |         (*this)[0] = static_cast< Value >( 1 ); | ||
|  |     } | ||
|  | }; | ||
|  | 
 | ||
|  | template< class Value > | ||
|  | struct coef_b_type : public boost::array< Value , 1 > | ||
|  | { | ||
|  |     coef_b_type( void ) | ||
|  |     { | ||
|  |         (*this)[0] = static_cast< Value >( 1 ); | ||
|  |     } | ||
|  | }; | ||
|  | 
 | ||
|  | } // namespace symplectic_euler_coef | ||
|  | } // namespace detail | ||
|  | #endif | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 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_euler : | ||
|  | public symplectic_nystroem_stepper_base | ||
|  | < | ||
|  | 1 , 1 , | ||
|  | Coor , Momentum , Value , CoorDeriv , MomentumDeriv , Time , Algebra , Operations , Resizer | ||
|  | > | ||
|  | #else | ||
|  | class symplectic_euler : public symplectic_nystroem_stepper_base | ||
|  | #endif | ||
|  | { | ||
|  | public: | ||
|  | 
 | ||
|  | #ifndef DOXYGEN_SKIP | ||
|  |     typedef symplectic_nystroem_stepper_base< | ||
|  |     1 , 1 , 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_euler( const algebra_type &algebra = algebra_type() ) | ||
|  |     : stepper_base_type( detail::symplectic_euler_coef::coef_a_type< value_type >() , | ||
|  |             detail::symplectic_euler_coef::coef_b_type< value_type >() , | ||
|  |             algebra ) | ||
|  |     { } | ||
|  | }; | ||
|  | 
 | ||
|  | 
 | ||
|  | /*************** DOXYGEN ***************/ | ||
|  | 
 | ||
|  | /** | ||
|  |  * \class symplectic_euler | ||
|  |  * \brief Implementation of the symplectic Euler method. | ||
|  |  * | ||
|  |  * The method is of first order and has one stage. It is described HERE. | ||
|  |  * | ||
|  |  * \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_euler::symplectic_euler( const algebra_type &algebra ) | ||
|  |      * \brief Constructs the symplectic_euler. 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_EULER_HPP_INCLUDED |