diff options
Diffstat (limited to 'boost/numeric/odeint/integrate/check_adapter.hpp')
-rw-r--r-- | boost/numeric/odeint/integrate/check_adapter.hpp | 222 |
1 files changed, 222 insertions, 0 deletions
diff --git a/boost/numeric/odeint/integrate/check_adapter.hpp b/boost/numeric/odeint/integrate/check_adapter.hpp new file mode 100644 index 0000000000..3d3ebd6c88 --- /dev/null +++ b/boost/numeric/odeint/integrate/check_adapter.hpp @@ -0,0 +1,222 @@ +/* + [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
\ No newline at end of file |