222 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			222 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| /*
 | |
|  [auto_generated]
 | |
|  boost/numeric/odeint/integrate/check_adapter.hpp
 | |
| 
 | |
|  [begin_description]
 | |
|  Adapters to add checking facility to stepper and observer
 | |
|  [end_description]
 | |
| 
 | |
|  Copyright 2015 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_INTEGRATE_CHECK_ADAPTER_HPP_INCLUDED
 | |
| #define BOOST_NUMERIC_ODEINT_INTEGRATE_CHECK_ADAPTER_HPP_INCLUDED
 | |
| 
 | |
| #include <boost/numeric/odeint/stepper/stepper_categories.hpp>
 | |
| #include <boost/numeric/odeint/stepper/controlled_step_result.hpp>
 | |
| 
 | |
| 
 | |
| namespace boost {
 | |
| namespace numeric {
 | |
| namespace odeint {
 | |
| 
 | |
| template<class Stepper, class Checker,
 | |
|          class StepperCategory = typename base_tag<typename Stepper::stepper_category>::type>
 | |
| class checked_stepper;
 | |
| 
 | |
| 
 | |
| /**
 | |
|  * \brief Adapter to combine basic stepper and checker.
 | |
|  */
 | |
| template<class Stepper, class Checker>
 | |
| class checked_stepper<Stepper, Checker, stepper_tag>
 | |
| {
 | |
| 
 | |
| public:
 | |
|     typedef Stepper stepper_type;
 | |
|     typedef Checker checker_type;
 | |
|     // forward stepper typedefs
 | |
|     typedef typename stepper_type::state_type state_type;
 | |
|     typedef typename stepper_type::value_type value_type;
 | |
|     typedef typename stepper_type::deriv_type deriv_type;
 | |
|     typedef typename stepper_type::time_type time_type;
 | |
| 
 | |
| private:
 | |
|     stepper_type &m_stepper;
 | |
|     checker_type &m_checker;
 | |
| 
 | |
| public:
 | |
|     /**
 | |
|      * \brief Construct the checked_stepper.
 | |
|      */
 | |
|     checked_stepper(stepper_type &stepper, checker_type &checker)
 | |
|             : m_stepper(stepper), m_checker(checker) { }
 | |
| 
 | |
|     /**
 | |
|      * \brief forward of the do_step method
 | |
|      */
 | |
|     template<class System, class StateInOut>
 | |
|     void do_step(System system, StateInOut &state, const time_type t, const time_type dt)
 | |
|     {
 | |
|         // do the step
 | |
|         m_stepper.do_step(system, state, t, dt);
 | |
|         // call the checker
 | |
|         m_checker();
 | |
|     }
 | |
| };
 | |
| 
 | |
| 
 | |
| /**
 | |
|  * \brief Adapter to combine controlled stepper and checker.
 | |
|  */
 | |
| template<class ControlledStepper, class Checker>
 | |
| class checked_stepper<ControlledStepper, Checker, controlled_stepper_tag>
 | |
| {
 | |
| 
 | |
| public:
 | |
|     typedef ControlledStepper stepper_type;
 | |
|     typedef Checker checker_type;
 | |
|     // forward stepper typedefs
 | |
|     typedef typename stepper_type::state_type state_type;
 | |
|     typedef typename stepper_type::value_type value_type;
 | |
|     typedef typename stepper_type::deriv_type deriv_type;
 | |
|     typedef typename stepper_type::time_type time_type;
 | |
| 
 | |
| private:
 | |
|     stepper_type &m_stepper;
 | |
|     checker_type &m_checker;
 | |
| 
 | |
| public:
 | |
|     /**
 | |
|      * \brief Construct the checked_stepper.
 | |
|      */
 | |
|     checked_stepper(stepper_type &stepper, checker_type &checker)
 | |
|             : m_stepper(stepper), m_checker(checker) { }
 | |
| 
 | |
|     /**
 | |
|      * \brief forward of the do_step method
 | |
|      */
 | |
|     template< class System , class StateInOut >
 | |
|     controlled_step_result try_step( System system , StateInOut &state , time_type &t , time_type &dt )
 | |
|     {
 | |
|         // do the step
 | |
|         if( m_stepper.try_step(system, state, t, dt) == success )
 | |
|         {
 | |
|             // call the checker if step was successful
 | |
|             m_checker();
 | |
|             return success;
 | |
|         } else
 | |
|         {
 | |
|             // step failed -> return fail
 | |
|             return fail;
 | |
|         }
 | |
|     }
 | |
| };
 | |
| 
 | |
| 
 | |
| /**
 | |
|  * \brief Adapter to combine dense out stepper and checker.
 | |
|  */
 | |
| template<class DenseOutStepper, class Checker>
 | |
| class checked_stepper<DenseOutStepper, Checker, dense_output_stepper_tag>
 | |
| {
 | |
| 
 | |
| public:
 | |
|     typedef DenseOutStepper stepper_type;
 | |
|     typedef Checker checker_type;
 | |
|     // forward stepper typedefs
 | |
|     typedef typename stepper_type::state_type state_type;
 | |
|     typedef typename stepper_type::value_type value_type;
 | |
|     typedef typename stepper_type::deriv_type deriv_type;
 | |
|     typedef typename stepper_type::time_type time_type;
 | |
| 
 | |
| private:
 | |
|     stepper_type &m_stepper;
 | |
|     checker_type &m_checker;
 | |
| 
 | |
| public:
 | |
|     /**
 | |
|      * \brief Construct the checked_stepper.
 | |
|      */
 | |
|     checked_stepper(stepper_type &stepper, checker_type &checker)
 | |
|             : m_stepper(stepper), m_checker(checker) { }
 | |
| 
 | |
| 
 | |
|     template< class System >
 | |
|     std::pair< time_type , time_type > do_step( System system )
 | |
|     {
 | |
|         m_checker();
 | |
|         return m_stepper.do_step(system);
 | |
|     }
 | |
| 
 | |
|     /* provide the remaining dense out stepper interface */
 | |
|     template< class StateType >
 | |
|     void initialize( const StateType &x0 , time_type t0 , time_type dt0 )
 | |
|     { m_stepper.initialize(x0, t0, dt0); }
 | |
| 
 | |
| 
 | |
|     template< class StateOut >
 | |
|     void calc_state( time_type t , StateOut &x ) const
 | |
|     { m_stepper.calc_state(t, x); }
 | |
| 
 | |
|     template< class StateOut >
 | |
|     void calc_state( time_type t , const StateOut &x ) const
 | |
|     { m_stepper.calc_state(t, x); }
 | |
| 
 | |
|     const state_type& current_state( void ) const
 | |
|     { return m_stepper.current_state(); }
 | |
| 
 | |
|     time_type current_time( void ) const
 | |
|     { return m_stepper.current_time(); }
 | |
| 
 | |
|     const state_type& previous_state( void ) const
 | |
|     { return m_stepper.previous_state(); }
 | |
| 
 | |
|     time_type previous_time( void ) const
 | |
|     { return m_stepper.previous_time(); }
 | |
| 
 | |
|     time_type current_time_step( void ) const
 | |
|     { return m_stepper.current_time_step(); }
 | |
| 
 | |
| };
 | |
| 
 | |
| 
 | |
| /**
 | |
|  * \brief Adapter to combine observer and checker.
 | |
|  */
 | |
| template<class Observer, class Checker>
 | |
| class checked_observer
 | |
| {
 | |
| public:
 | |
|     typedef Observer observer_type;
 | |
|     typedef Checker checker_type;
 | |
| 
 | |
| private:
 | |
|     observer_type &m_observer;
 | |
|     checker_type &m_checker;
 | |
| 
 | |
| public:
 | |
|     checked_observer(observer_type &observer, checker_type &checker)
 | |
|             : m_observer(observer), m_checker(checker)
 | |
|     {}
 | |
| 
 | |
|     template< class State , class Time >
 | |
|     void operator()(const State& state, Time t) const
 | |
|     {
 | |
|         // call the observer
 | |
|         m_observer(state, t);
 | |
|         // reset the checker
 | |
|         m_checker.reset();
 | |
|     }
 | |
| };
 | |
| 
 | |
| 
 | |
| } // namespace odeint
 | |
| } // namespace numeric
 | |
| } // namespace boost
 | |
| 
 | |
| #endif | 
