annotate DEPENDENCIES/generic/include/boost/numeric/odeint/integrate/detail/integrate_adaptive.hpp @ 71:37586661a088

Start sketching summarise script
author Chris Cannam
date Wed, 29 Oct 2014 17:38:24 +0000
parents 2665513ce2d3
children c530137014c0
rev   line source
Chris@16 1 /*
Chris@16 2 [auto_generated]
Chris@16 3 boost/numeric/odeint/integrate/detail/integrate_adaptive.hpp
Chris@16 4
Chris@16 5 [begin_description]
Chris@16 6 Default Integrate adaptive implementation.
Chris@16 7 [end_description]
Chris@16 8
Chris@16 9 Copyright 2009-2011 Karsten Ahnert
Chris@16 10 Copyright 2009-2011 Mario Mulansky
Chris@16 11
Chris@16 12 Distributed under the Boost Software License, Version 1.0.
Chris@16 13 (See accompanying file LICENSE_1_0.txt or
Chris@16 14 copy at http://www.boost.org/LICENSE_1_0.txt)
Chris@16 15 */
Chris@16 16
Chris@16 17
Chris@16 18 #ifndef BOOST_NUMERIC_ODEINT_INTEGRATE_DETAIL_INTEGRATE_ADAPTIVE_HPP_INCLUDED
Chris@16 19 #define BOOST_NUMERIC_ODEINT_INTEGRATE_DETAIL_INTEGRATE_ADAPTIVE_HPP_INCLUDED
Chris@16 20
Chris@16 21 #include <stdexcept>
Chris@16 22
Chris@16 23 #include <boost/numeric/odeint/stepper/stepper_categories.hpp>
Chris@16 24 #include <boost/numeric/odeint/stepper/controlled_step_result.hpp>
Chris@16 25 #include <boost/numeric/odeint/integrate/detail/integrate_n_steps.hpp>
Chris@16 26 #include <boost/numeric/odeint/util/bind.hpp>
Chris@16 27 #include <boost/numeric/odeint/util/unwrap_reference.hpp>
Chris@16 28 #include <boost/numeric/odeint/util/copy.hpp>
Chris@16 29
Chris@16 30 #include <boost/numeric/odeint/util/detail/less_with_sign.hpp>
Chris@16 31
Chris@16 32
Chris@16 33 #include <iostream>
Chris@16 34
Chris@16 35 namespace boost {
Chris@16 36 namespace numeric {
Chris@16 37 namespace odeint {
Chris@16 38 namespace detail {
Chris@16 39
Chris@16 40 // forward declaration
Chris@16 41 template< class Stepper , class System , class State , class Time , class Observer>
Chris@16 42 Time integrate_n_steps(
Chris@16 43 Stepper stepper , System system , State &start_state ,
Chris@16 44 Time start_time , Time dt , size_t num_of_steps ,
Chris@16 45 Observer observer , stepper_tag );
Chris@16 46
Chris@16 47 /*
Chris@16 48 * integrate_adaptive for simple stepper is basically an integrate_const + some last step
Chris@16 49 */
Chris@16 50 template< class Stepper , class System , class State , class Time , class Observer >
Chris@16 51 size_t integrate_adaptive(
Chris@16 52 Stepper stepper , System system , State &start_state ,
Chris@16 53 Time start_time , Time end_time , Time dt ,
Chris@16 54 Observer observer , stepper_tag
Chris@16 55 )
Chris@16 56 {
Chris@16 57 size_t steps = static_cast< size_t >( (end_time-start_time)/dt );
Chris@16 58 Time end = detail::integrate_n_steps( stepper , system , start_state , start_time ,
Chris@16 59 dt , steps , observer , stepper_tag() );
Chris@16 60 if( less_with_sign( end , end_time , dt ) )
Chris@16 61 { //make a last step to end exactly at end_time
Chris@16 62 stepper.do_step( system , start_state , end , end_time - end );
Chris@16 63 steps++;
Chris@16 64 typename odeint::unwrap_reference< Observer >::type &obs = observer;
Chris@16 65 obs( start_state , end_time );
Chris@16 66 }
Chris@16 67 return steps;
Chris@16 68 }
Chris@16 69
Chris@16 70
Chris@16 71 /*
Chris@16 72 * classical integrate adaptive
Chris@16 73 */
Chris@16 74 template< class Stepper , class System , class State , class Time , class Observer >
Chris@16 75 size_t integrate_adaptive(
Chris@16 76 Stepper stepper , System system , State &start_state ,
Chris@16 77 Time &start_time , Time end_time , Time &dt ,
Chris@16 78 Observer observer , controlled_stepper_tag
Chris@16 79 )
Chris@16 80 {
Chris@16 81 typename odeint::unwrap_reference< Observer >::type &obs = observer;
Chris@16 82
Chris@16 83 const size_t max_attempts = 1000;
Chris@16 84 const char *error_string = "Integrate adaptive : Maximal number of iterations reached. A step size could not be found.";
Chris@16 85 size_t count = 0;
Chris@16 86 while( less_with_sign( start_time , end_time , dt ) )
Chris@16 87 {
Chris@16 88 obs( start_state , start_time );
Chris@16 89 if( less_with_sign( end_time , start_time + dt , dt ) )
Chris@16 90 {
Chris@16 91 dt = end_time - start_time;
Chris@16 92 }
Chris@16 93
Chris@16 94 size_t trials = 0;
Chris@16 95 controlled_step_result res = success;
Chris@16 96 do
Chris@16 97 {
Chris@16 98 res = stepper.try_step( system , start_state , start_time , dt );
Chris@16 99 ++trials;
Chris@16 100 }
Chris@16 101 while( ( res == fail ) && ( trials < max_attempts ) );
Chris@16 102 if( trials == max_attempts ) throw std::overflow_error( error_string );
Chris@16 103
Chris@16 104 ++count;
Chris@16 105 }
Chris@16 106 obs( start_state , start_time );
Chris@16 107 return count;
Chris@16 108 }
Chris@16 109
Chris@16 110
Chris@16 111 /*
Chris@16 112 * integrate adaptive for dense output steppers
Chris@16 113 *
Chris@16 114 * step size control is used if the stepper supports it
Chris@16 115 */
Chris@16 116 template< class Stepper , class System , class State , class Time , class Observer >
Chris@16 117 size_t integrate_adaptive(
Chris@16 118 Stepper stepper , System system , State &start_state ,
Chris@16 119 Time start_time , Time end_time , Time dt ,
Chris@16 120 Observer observer , dense_output_stepper_tag )
Chris@16 121 {
Chris@16 122 typename odeint::unwrap_reference< Observer >::type &obs = observer;
Chris@16 123
Chris@16 124 size_t count = 0;
Chris@16 125 stepper.initialize( start_state , start_time , dt );
Chris@16 126
Chris@16 127 while( less_with_sign( stepper.current_time() , end_time , stepper.current_time_step() ) )
Chris@16 128 {
Chris@16 129 while( less_eq_with_sign( stepper.current_time() + stepper.current_time_step() ,
Chris@16 130 end_time ,
Chris@16 131 stepper.current_time_step() ) )
Chris@16 132 { //make sure we don't go beyond the end_time
Chris@16 133 obs( stepper.current_state() , stepper.current_time() );
Chris@16 134 stepper.do_step( system );
Chris@16 135 ++count;
Chris@16 136 }
Chris@16 137 stepper.initialize( stepper.current_state() , stepper.current_time() , end_time - stepper.current_time() );
Chris@16 138 }
Chris@16 139 obs( stepper.current_state() , stepper.current_time() );
Chris@16 140 // overwrite start_state with the final point
Chris@16 141 boost::numeric::odeint::copy( stepper.current_state() , start_state );
Chris@16 142 return count;
Chris@16 143 }
Chris@16 144
Chris@16 145
Chris@16 146
Chris@16 147
Chris@16 148 } // namespace detail
Chris@16 149 } // namespace odeint
Chris@16 150 } // namespace numeric
Chris@16 151 } // namespace boost
Chris@16 152
Chris@16 153
Chris@16 154 #endif // BOOST_NUMERIC_ODEINT_INTEGRATE_DETAIL_INTEGRATE_ADAPTIVE_HPP_INCLUDED