Chris@16: /* Chris@16: [auto_generated] Chris@16: boost/numeric/odeint/integrate/detail/integrate_adaptive.hpp Chris@16: Chris@16: [begin_description] Chris@16: Default Integrate adaptive implementation. Chris@16: [end_description] Chris@16: Chris@101: Copyright 2011-2013 Karsten Ahnert Chris@101: Copyright 2011-2012 Mario Mulansky Chris@101: Copyright 2012 Christoph Koke Chris@16: Chris@16: Distributed under the Boost Software License, Version 1.0. Chris@16: (See accompanying file LICENSE_1_0.txt or Chris@16: copy at http://www.boost.org/LICENSE_1_0.txt) Chris@16: */ Chris@16: Chris@16: Chris@16: #ifndef BOOST_NUMERIC_ODEINT_INTEGRATE_DETAIL_INTEGRATE_ADAPTIVE_HPP_INCLUDED Chris@16: #define BOOST_NUMERIC_ODEINT_INTEGRATE_DETAIL_INTEGRATE_ADAPTIVE_HPP_INCLUDED Chris@16: Chris@16: #include Chris@16: Chris@101: #include Chris@101: Chris@16: #include Chris@16: #include Chris@101: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: #include Chris@16: Chris@16: Chris@16: #include Chris@16: Chris@16: namespace boost { Chris@16: namespace numeric { Chris@16: namespace odeint { Chris@16: namespace detail { Chris@16: Chris@16: // forward declaration Chris@16: template< class Stepper , class System , class State , class Time , class Observer> Chris@101: size_t integrate_const( Chris@16: Stepper stepper , System system , State &start_state , Chris@101: Time start_time , Time end_time , Time dt , Chris@16: Observer observer , stepper_tag ); Chris@16: Chris@16: /* Chris@16: * integrate_adaptive for simple stepper is basically an integrate_const + some last step Chris@16: */ Chris@16: template< class Stepper , class System , class State , class Time , class Observer > Chris@16: size_t integrate_adaptive( Chris@16: Stepper stepper , System system , State &start_state , Chris@16: Time start_time , Time end_time , Time dt , Chris@16: Observer observer , stepper_tag Chris@16: ) Chris@16: { Chris@101: size_t steps = detail::integrate_const( stepper , system , start_state , start_time , Chris@101: end_time , dt , observer , stepper_tag() ); Chris@101: typename odeint::unwrap_reference< Observer >::type &obs = observer; Chris@101: typename odeint::unwrap_reference< Stepper >::type &st = stepper; Chris@101: Chris@101: Time end = start_time + dt*steps; Chris@16: if( less_with_sign( end , end_time , dt ) ) Chris@16: { //make a last step to end exactly at end_time Chris@101: st.do_step( system , start_state , end , end_time - end ); Chris@16: steps++; Chris@16: obs( start_state , end_time ); Chris@16: } Chris@16: return steps; Chris@16: } Chris@16: Chris@16: Chris@16: /* Chris@16: * classical integrate adaptive Chris@16: */ Chris@16: template< class Stepper , class System , class State , class Time , class Observer > Chris@16: size_t integrate_adaptive( Chris@16: Stepper stepper , System system , State &start_state , Chris@16: Time &start_time , Time end_time , Time &dt , Chris@16: Observer observer , controlled_stepper_tag Chris@16: ) Chris@16: { Chris@16: typename odeint::unwrap_reference< Observer >::type &obs = observer; Chris@101: typename odeint::unwrap_reference< Stepper >::type &st = stepper; Chris@16: Chris@16: const size_t max_attempts = 1000; Chris@16: const char *error_string = "Integrate adaptive : Maximal number of iterations reached. A step size could not be found."; Chris@16: size_t count = 0; Chris@16: while( less_with_sign( start_time , end_time , dt ) ) Chris@16: { Chris@16: obs( start_state , start_time ); Chris@101: if( less_with_sign( end_time , static_cast