integrate_times.hpp 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. /*
  2. [auto_generated]
  3. boost/numeric/odeint/integrate/integrate_times.hpp
  4. [begin_description]
  5. Integration of ODEs with observation at user defined points
  6. [end_description]
  7. Copyright 2009-2011 Karsten Ahnert
  8. Copyright 2009-2011 Mario Mulansky
  9. Distributed under the Boost Software License, Version 1.0.
  10. (See accompanying file LICENSE_1_0.txt or
  11. copy at http://www.boost.org/LICENSE_1_0.txt)
  12. */
  13. #ifndef BOOST_NUMERIC_ODEINT_INTEGRATE_INTEGRATE_TIMES_HPP_INCLUDED
  14. #define BOOST_NUMERIC_ODEINT_INTEGRATE_INTEGRATE_TIMES_HPP_INCLUDED
  15. #include <boost/range.hpp>
  16. #include <boost/numeric/odeint/stepper/stepper_categories.hpp>
  17. #include <boost/numeric/odeint/iterator/integrate/null_observer.hpp>
  18. #include <boost/numeric/odeint/iterator/integrate/detail/integrate_times.hpp>
  19. namespace boost {
  20. namespace numeric {
  21. namespace odeint {
  22. /*
  23. * the two overloads are needed in order to solve the forwarding problem
  24. */
  25. template< class Stepper , class System , class State , class TimeIterator , class Time , class Observer >
  26. size_t integrate_times(
  27. Stepper stepper , System system , State &start_state ,
  28. TimeIterator times_start , TimeIterator times_end , Time dt ,
  29. Observer observer )
  30. {
  31. typedef typename odeint::unwrap_reference< Stepper >::type::stepper_category stepper_category;
  32. return detail::integrate_times(
  33. stepper , system , start_state ,
  34. times_start , times_end , dt ,
  35. observer , stepper_category() );
  36. }
  37. /**
  38. * \brief Solves the forwarding problem, can be called with Boost.Range as start_state.
  39. */
  40. template< class Stepper , class System , class State , class TimeIterator , class Time , class Observer >
  41. size_t integrate_times(
  42. Stepper stepper , System system , const State &start_state ,
  43. TimeIterator times_start , TimeIterator times_end , Time dt ,
  44. Observer observer )
  45. {
  46. typedef typename odeint::unwrap_reference< Stepper >::type::stepper_category stepper_category;
  47. return detail::integrate_times(
  48. stepper , system , start_state ,
  49. times_start , times_end , dt ,
  50. observer , stepper_category() );
  51. }
  52. /**
  53. * \brief The same function as above, but without observer calls.
  54. */
  55. template< class Stepper , class System , class State , class TimeRange , class Time , class Observer >
  56. size_t integrate_times(
  57. Stepper stepper , System system , State &start_state ,
  58. const TimeRange &times , Time dt ,
  59. Observer observer )
  60. {
  61. return integrate_times(
  62. stepper , system , start_state ,
  63. boost::begin( times ) , boost::end( times ) , dt , observer );
  64. }
  65. /**
  66. * \brief Solves the forwarding problem, can be called with Boost.Range as start_state.
  67. */
  68. template< class Stepper , class System , class State , class TimeRange , class Time , class Observer >
  69. size_t integrate_times(
  70. Stepper stepper , System system , const State &start_state ,
  71. const TimeRange &times , Time dt ,
  72. Observer observer )
  73. {
  74. return integrate_times(
  75. stepper , system , start_state ,
  76. boost::begin( times ) , boost::end( times ) , dt , observer );
  77. }
  78. /********* DOXYGEN ***********/
  79. /**
  80. * \fn size_t integrate_times( Stepper stepper , System system , State &start_state , TimeIterator times_start , TimeIterator times_end , Time dt , Observer observer )
  81. * \brief Integrates the ODE with observer calls at given time points.
  82. *
  83. * Integrates the ODE given by system using the given stepper. This function
  84. * does observer calls at the subsequent time points given by the range
  85. * times_start, times_end. If the stepper has not step size control, the
  86. * step size might be reduced occasionally to ensure observer calls exactly
  87. * at the time points from the given sequence. If the stepper is a
  88. * ControlledStepper, the step size is adjusted to meet the error bounds,
  89. * but also might be reduced occasionally to ensure correct observer calls.
  90. * If a DenseOutputStepper is provided, the dense output functionality is
  91. * used to call the observer at the given times. The end time of the
  92. * integration is always *(end_time-1).
  93. *
  94. * \param stepper The stepper to be used for numerical integration.
  95. * \param system Function/Functor defining the rhs of the ODE.
  96. * \param start_state The initial condition x0.
  97. * \param times_start Iterator to the start time
  98. * \param times_end Iterator to the end time
  99. * \param dt The time step between observer calls, _not_ necessarily the
  100. * time step of the integration.
  101. * \param observer Function/Functor called at equidistant time intervals.
  102. * \return The number of steps performed.
  103. */
  104. } // namespace odeint
  105. } // namespace numeric
  106. } // namespace boost
  107. #endif // BOOST_NUMERIC_ODEINT_INTEGRATE_INTEGRATE_TIMES_HPP_INCLUDED