runge_kutta_controlled_concepts.cpp 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. /*
  2. [auto_generated]
  3. libs/numeric/odeint/test/runge_kutta_controlled_concepts.cpp
  4. [begin_description]
  5. This file tests the Stepper concepts of odeint with all Controlled Runge-Kutta steppers.
  6. It's one of the main tests of odeint.
  7. [end_description]
  8. Copyright 2012 Karsten Ahnert
  9. Copyright 2012-2013 Mario Mulansky
  10. Distributed under the Boost Software License, Version 1.0.
  11. (See accompanying file LICENSE_1_0.txt or
  12. copy at http://www.boost.org/LICENSE_1_0.txt)
  13. */
  14. // disable checked iterator warning for msvc
  15. #include <boost/config.hpp>
  16. #ifdef BOOST_MSVC
  17. #pragma warning(disable:4996)
  18. #endif
  19. #define BOOST_TEST_MODULE odeint_runge_kutta_controlled_concepts
  20. #include <vector>
  21. #include <cmath>
  22. #include <iostream>
  23. #include <boost/numeric/odeint/config.hpp>
  24. #include <boost/array.hpp>
  25. #include <boost/test/unit_test.hpp>
  26. #include <boost/ref.hpp>
  27. #include <boost/bind.hpp>
  28. #include <boost/utility.hpp>
  29. #include <boost/type_traits/add_reference.hpp>
  30. #include <boost/mpl/vector.hpp>
  31. #include <boost/mpl/for_each.hpp>
  32. #include <boost/mpl/insert_range.hpp>
  33. #include <boost/mpl/end.hpp>
  34. #include <boost/mpl/copy.hpp>
  35. #include <boost/mpl/placeholders.hpp>
  36. #include <boost/mpl/inserter.hpp>
  37. #include <boost/numeric/odeint/stepper/runge_kutta_cash_karp54_classic.hpp>
  38. #include <boost/numeric/odeint/stepper/runge_kutta_cash_karp54.hpp>
  39. #include <boost/numeric/odeint/stepper/runge_kutta_dopri5.hpp>
  40. #include <boost/numeric/odeint/stepper/runge_kutta_fehlberg78.hpp>
  41. #include <boost/numeric/odeint/stepper/controlled_runge_kutta.hpp>
  42. #include <boost/numeric/odeint/stepper/bulirsch_stoer.hpp>
  43. #include "prepare_stepper_testing.hpp"
  44. #include "dummy_odes.hpp"
  45. using std::vector;
  46. using namespace boost::unit_test;
  47. using namespace boost::numeric::odeint;
  48. namespace mpl = boost::mpl;
  49. const double result = 2.2; // two steps
  50. const double eps = 1.0e-14;
  51. template< class Stepper , class System >
  52. void check_controlled_stepper_concept( Stepper &stepper , System system , typename Stepper::state_type &x )
  53. {
  54. typedef Stepper stepper_type;
  55. typedef typename stepper_type::deriv_type container_type;
  56. //typedef typename stepper_type::order_type order_type; controlled_error_stepper don't necessarily have a order (burlish-stoer)
  57. typedef typename stepper_type::time_type time_type;
  58. time_type t = 0.0 , dt = 0.1;
  59. controlled_step_result step_result = stepper.try_step( system , x , t , dt );
  60. BOOST_CHECK_MESSAGE( step_result == success , "step result: " << step_result ); // error = 0 for constant system -> step size is always too small
  61. }
  62. template< class ControlledStepper , typename T >
  63. struct perform_controlled_stepper_test
  64. {
  65. typedef T vector_space_type;
  66. void operator()( void ) const
  67. {
  68. using std::abs;
  69. vector_space_type x;
  70. x = 2.0;
  71. ControlledStepper controlled_stepper;
  72. constant_system_functor_vector_space sys;
  73. #ifndef _MSC_VER
  74. // dont run this for MSVC due to compiler bug 697006
  75. check_controlled_stepper_concept( controlled_stepper ,
  76. constant_system_vector_space< vector_space_type , vector_space_type , typename ControlledStepper::time_type >
  77. , x );
  78. #else
  79. check_controlled_stepper_concept( controlled_stepper , boost::cref( sys ) , x );
  80. #endif
  81. check_controlled_stepper_concept( controlled_stepper , boost::cref( sys ) , x );
  82. BOOST_CHECK( (abs( x - result )) < eps );
  83. }
  84. };
  85. template< class ControlledStepper , typename T >
  86. struct perform_controlled_stepper_test< ControlledStepper , std::vector<T> >
  87. {
  88. typedef std::vector<T> vector_type;
  89. void operator()( void )
  90. {
  91. using std::abs;
  92. vector_type x( 1 , 2.0 );
  93. ControlledStepper controlled_stepper;
  94. constant_system_functor_standard sys;
  95. #ifndef _MSC_VER
  96. // dont run this for MSVC due to compiler bug 697006
  97. check_controlled_stepper_concept( controlled_stepper ,
  98. constant_system_standard< vector_type , vector_type , typename ControlledStepper::time_type > ,
  99. x );
  100. #else
  101. check_controlled_stepper_concept( controlled_stepper , boost::cref( sys ) , x );
  102. #endif
  103. check_controlled_stepper_concept( controlled_stepper , boost::cref( sys ) , x );
  104. BOOST_CHECK( (abs( x[0] - result )) < eps );
  105. }
  106. };
  107. template< class ControlledStepper >
  108. struct perform_controlled_stepper_test< ControlledStepper , vector_space_type >
  109. {
  110. void operator()( void ) const
  111. {
  112. using std::abs;
  113. vector_space_type x;
  114. x = 2.0;
  115. ControlledStepper controlled_stepper;
  116. constant_system_functor_vector_space sys;
  117. #ifndef _MSC_VER
  118. // dont run this for MSVC due to compiler bug 697006
  119. check_controlled_stepper_concept( controlled_stepper ,
  120. constant_system_vector_space< vector_space_type , vector_space_type , typename ControlledStepper::time_type >
  121. , x );
  122. #else
  123. check_controlled_stepper_concept( controlled_stepper , boost::cref( sys ) , x );
  124. #endif
  125. check_controlled_stepper_concept( controlled_stepper , boost::cref( sys ) , x );
  126. BOOST_CHECK( (abs( x - result )) < eps );
  127. }
  128. };
  129. template< class ControlledStepper , typename T >
  130. struct perform_controlled_stepper_test< ControlledStepper , boost::array<T,1> >
  131. {
  132. typedef boost::array<T,1> array_type;
  133. void operator()( void )
  134. {
  135. using std::abs;
  136. array_type x;
  137. x[0] = 2.0;
  138. ControlledStepper controlled_stepper;
  139. constant_system_functor_standard sys;
  140. #ifndef _MSC_VER
  141. // dont run this for MSVC due to compiler bug 697006
  142. check_controlled_stepper_concept( controlled_stepper , constant_system_standard< array_type , array_type , typename ControlledStepper::time_type > , x );
  143. #else
  144. check_controlled_stepper_concept( controlled_stepper , boost::cref( sys ) , x );
  145. #endif
  146. check_controlled_stepper_concept( controlled_stepper , boost::cref( sys ) , x );
  147. BOOST_CHECK( (abs( x[0] - result )) < eps );
  148. }
  149. };
  150. template< class State > class controlled_stepper_methods : public mpl::vector<
  151. controlled_runge_kutta< runge_kutta_cash_karp54_classic< State , typename detail::extract_value_type<State>::type > > ,
  152. controlled_runge_kutta< runge_kutta_dopri5< State , typename detail::extract_value_type<State>::type > > ,
  153. controlled_runge_kutta< runge_kutta_fehlberg78< State , typename detail::extract_value_type<State>::type > > ,
  154. bulirsch_stoer< State , typename detail::extract_value_type<State>::type >
  155. > { };
  156. typedef mpl::copy
  157. <
  158. container_types ,
  159. mpl::inserter
  160. <
  161. mpl::vector0<> ,
  162. mpl::insert_range
  163. <
  164. mpl::_1 ,
  165. mpl::end< mpl::_1 > ,
  166. controlled_stepper_methods< mpl::_2 >
  167. >
  168. >
  169. >::type all_controlled_stepper_methods;
  170. BOOST_AUTO_TEST_SUITE( controlled_runge_kutta_concept_test )
  171. BOOST_AUTO_TEST_CASE_TEMPLATE( controlled_stepper_test , ControlledStepper , all_controlled_stepper_methods )
  172. {
  173. perform_controlled_stepper_test< ControlledStepper , typename ControlledStepper::state_type > tester;
  174. tester();
  175. }
  176. BOOST_AUTO_TEST_SUITE_END()