annotate DEPENDENCIES/generic/include/boost/numeric/odeint/integrate/detail/integrate_times.hpp @ 16:2665513ce2d3

Add boost headers
author Chris Cannam
date Tue, 05 Aug 2014 11:11:38 +0100
parents
children c530137014c0
rev   line source
Chris@16 1 /*
Chris@16 2 [auto_generated]
Chris@16 3 boost/numeric/odeint/integrate/detail/integrate_times.hpp
Chris@16 4
Chris@16 5 [begin_description]
Chris@16 6 Default integrate times implementation.
Chris@16 7 [end_description]
Chris@16 8
Chris@16 9 Copyright 2009-2012 Karsten Ahnert
Chris@16 10 Copyright 2009-2012 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_TIMES_HPP_INCLUDED
Chris@16 19 #define BOOST_NUMERIC_ODEINT_INTEGRATE_DETAIL_INTEGRATE_TIMES_HPP_INCLUDED
Chris@16 20
Chris@16 21 #include <stdexcept>
Chris@16 22
Chris@16 23 #include <boost/config.hpp>
Chris@16 24 #include <boost/numeric/odeint/util/unwrap_reference.hpp>
Chris@16 25 #include <boost/numeric/odeint/stepper/controlled_step_result.hpp>
Chris@16 26 #include <boost/numeric/odeint/util/detail/less_with_sign.hpp>
Chris@16 27
Chris@16 28
Chris@16 29 namespace boost {
Chris@16 30 namespace numeric {
Chris@16 31 namespace odeint {
Chris@16 32 namespace detail {
Chris@16 33
Chris@16 34
Chris@16 35
Chris@16 36 /*
Chris@16 37 * integrate_times for simple stepper
Chris@16 38 */
Chris@16 39 template< class Stepper , class System , class State , class TimeIterator , class Time , class Observer >
Chris@16 40 size_t integrate_times(
Chris@16 41 Stepper stepper , System system , State &start_state ,
Chris@16 42 TimeIterator start_time , TimeIterator end_time , Time dt ,
Chris@16 43 Observer observer , stepper_tag
Chris@16 44 )
Chris@16 45 {
Chris@16 46 BOOST_USING_STD_MIN();
Chris@16 47
Chris@16 48 typename odeint::unwrap_reference< Observer >::type &obs = observer;
Chris@16 49
Chris@16 50 size_t steps = 0;
Chris@16 51 Time current_dt = dt;
Chris@16 52 while( true )
Chris@16 53 {
Chris@16 54 Time current_time = *start_time++;
Chris@16 55 obs( start_state , current_time );
Chris@16 56 if( start_time == end_time )
Chris@16 57 break;
Chris@16 58 while( less_with_sign( current_time , *start_time , current_dt ) )
Chris@16 59 {
Chris@16 60 current_dt = min BOOST_PREVENT_MACRO_SUBSTITUTION ( dt , *start_time - current_time );
Chris@16 61 stepper.do_step( system , start_state , current_time , current_dt );
Chris@16 62 current_time += current_dt;
Chris@16 63 steps++;
Chris@16 64 }
Chris@16 65 }
Chris@16 66 return steps;
Chris@16 67 }
Chris@16 68
Chris@16 69 /*
Chris@16 70 * integrate_times for controlled stepper
Chris@16 71 */
Chris@16 72 template< class Stepper , class System , class State , class TimeIterator , class Time , class Observer >
Chris@16 73 size_t integrate_times(
Chris@16 74 Stepper stepper , System system , State &start_state ,
Chris@16 75 TimeIterator start_time , TimeIterator end_time , Time dt ,
Chris@16 76 Observer observer , controlled_stepper_tag
Chris@16 77 )
Chris@16 78 {
Chris@16 79 BOOST_USING_STD_MIN();
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 steps = 0;
Chris@16 86 while( true )
Chris@16 87 {
Chris@16 88 size_t fail_steps = 0;
Chris@16 89 Time current_time = *start_time++;
Chris@16 90 obs( start_state , current_time );
Chris@16 91 if( start_time == end_time )
Chris@16 92 break;
Chris@16 93 while( less_with_sign( current_time , *start_time , dt ) )
Chris@16 94 {
Chris@16 95 dt = min BOOST_PREVENT_MACRO_SUBSTITUTION ( dt , *start_time - current_time );
Chris@16 96 if( stepper.try_step( system , start_state , current_time , dt ) == success )
Chris@16 97 {
Chris@16 98 ++steps;
Chris@16 99 }
Chris@16 100 else
Chris@16 101 {
Chris@16 102 ++fail_steps;
Chris@16 103 }
Chris@16 104 if( fail_steps == max_attempts ) throw std::overflow_error( error_string );
Chris@16 105 }
Chris@16 106 }
Chris@16 107 return steps;
Chris@16 108 }
Chris@16 109
Chris@16 110 /*
Chris@16 111 * integrate_times for dense output stepper
Chris@16 112 */
Chris@16 113 template< class Stepper , class System , class State , class TimeIterator , class Time , class Observer >
Chris@16 114 size_t integrate_times(
Chris@16 115 Stepper stepper , System system , State &start_state ,
Chris@16 116 TimeIterator start_time , TimeIterator end_time , Time dt ,
Chris@16 117 Observer observer , dense_output_stepper_tag
Chris@16 118 )
Chris@16 119 {
Chris@16 120 typename odeint::unwrap_reference< Observer >::type &obs = observer;
Chris@16 121
Chris@16 122
Chris@16 123 if( start_time == end_time )
Chris@16 124 return 0;
Chris@16 125
Chris@16 126 Time last_time_point = *(end_time-1);
Chris@16 127
Chris@16 128 stepper.initialize( start_state , *start_time , dt );
Chris@16 129 obs( start_state , *start_time++ );
Chris@16 130
Chris@16 131 size_t count = 0;
Chris@16 132 while( start_time != end_time )
Chris@16 133 {
Chris@16 134 while( ( start_time != end_time ) && less_eq_with_sign( *start_time , stepper.current_time() , stepper.current_time_step() ) )
Chris@16 135 {
Chris@16 136 stepper.calc_state( *start_time , start_state );
Chris@16 137 obs( start_state , *start_time );
Chris@16 138 start_time++;
Chris@16 139 }
Chris@16 140
Chris@16 141 // we have not reached the end, do another real step
Chris@16 142 if( less_eq_with_sign( stepper.current_time() + stepper.current_time_step() ,
Chris@16 143 last_time_point ,
Chris@16 144 stepper.current_time_step() ) )
Chris@16 145 {
Chris@16 146 stepper.do_step( system );
Chris@16 147 ++count;
Chris@16 148 }
Chris@16 149 else if( start_time != end_time )
Chris@16 150 { // do the last step ending exactly on the end point
Chris@16 151 stepper.initialize( stepper.current_state() , stepper.current_time() , last_time_point - stepper.current_time() );
Chris@16 152 stepper.do_step( system );
Chris@16 153 ++count;
Chris@16 154 }
Chris@16 155 }
Chris@16 156 return count;
Chris@16 157 }
Chris@16 158
Chris@16 159
Chris@16 160 } // namespace detail
Chris@16 161 } // namespace odeint
Chris@16 162 } // namespace numeric
Chris@16 163 } // namespace boost
Chris@16 164
Chris@16 165
Chris@16 166 #endif // BOOST_NUMERIC_ODEINT_INTEGRATE_DETAIL_INTEGRATE_ADAPTIVE_HPP_INCLUDED