3 libs/numeric/odeint/test/runge_kutta_controlled_concepts.cpp
6 This file tests the Stepper concepts of odeint with all Controlled Runge-Kutta steppers.
7 It's one of the main tests of odeint.
10 Copyright 2012 Karsten Ahnert
11 Copyright 2012-2013 Mario Mulansky
13 Distributed under the Boost Software License, Version 1.0.
14 (See accompanying file LICENSE_1_0.txt or
15 copy at http://www.boost.org/LICENSE_1_0.txt)
18 // disable checked iterator warning for msvc
19 #include <boost/config.hpp>
21 #pragma warning(disable:4996)
24 #define BOOST_TEST_MODULE odeint_runge_kutta_controlled_concepts
30 #include <boost/numeric/odeint/config.hpp>
32 #include <boost/array.hpp>
34 #include <boost/test/unit_test.hpp>
36 #include <boost/ref.hpp>
37 #include <boost/bind.hpp>
38 #include <boost/utility.hpp>
39 #include <boost/type_traits/add_reference.hpp>
41 #include <boost/mpl/vector.hpp>
42 #include <boost/mpl/for_each.hpp>
43 #include <boost/mpl/insert_range.hpp>
44 #include <boost/mpl/end.hpp>
45 #include <boost/mpl/copy.hpp>
46 #include <boost/mpl/placeholders.hpp>
47 #include <boost/mpl/inserter.hpp>
49 #include <boost/numeric/odeint/stepper/runge_kutta_cash_karp54_classic.hpp>
50 #include <boost/numeric/odeint/stepper/runge_kutta_cash_karp54.hpp>
51 #include <boost/numeric/odeint/stepper/runge_kutta_dopri5.hpp>
52 #include <boost/numeric/odeint/stepper/runge_kutta_fehlberg78.hpp>
53 #include <boost/numeric/odeint/stepper/controlled_runge_kutta.hpp>
54 #include <boost/numeric/odeint/stepper/bulirsch_stoer.hpp>
56 #include "prepare_stepper_testing.hpp"
57 #include "dummy_odes.hpp"
61 using namespace boost::unit_test
;
62 using namespace boost::numeric::odeint
;
63 namespace mpl
= boost::mpl
;
65 const double result
= 2.2; // two steps
67 const double eps
= 1.0e-14;
69 template< class Stepper
, class System
>
70 void check_controlled_stepper_concept( Stepper
&stepper
, System system
, typename
Stepper::state_type
&x
)
72 typedef Stepper stepper_type
;
73 typedef typename
stepper_type::deriv_type container_type
;
74 //typedef typename stepper_type::order_type order_type; controlled_error_stepper don't necessarily have a order (burlish-stoer)
75 typedef typename
stepper_type::time_type time_type
;
77 time_type t
= 0.0 , dt
= 0.1;
78 controlled_step_result step_result
= stepper
.try_step( system
, x
, t
, dt
);
80 BOOST_CHECK_MESSAGE( step_result
== success
, "step result: " << step_result
); // error = 0 for constant system -> step size is always too small
84 template< class ControlledStepper
, typename T
>
85 struct perform_controlled_stepper_test
87 typedef T vector_space_type
;
88 void operator()( void ) const
93 ControlledStepper controlled_stepper
;
94 constant_system_functor_vector_space sys
;
96 // dont run this for MSVC due to compiler bug 697006
97 check_controlled_stepper_concept( controlled_stepper
,
98 constant_system_vector_space
< vector_space_type
, vector_space_type
, typename
ControlledStepper::time_type
>
101 check_controlled_stepper_concept( controlled_stepper
, boost::cref( sys
) , x
);
103 check_controlled_stepper_concept( controlled_stepper
, boost::cref( sys
) , x
);
104 BOOST_CHECK( (abs( x
- result
)) < eps
);
108 template< class ControlledStepper
, typename T
>
109 struct perform_controlled_stepper_test
< ControlledStepper
, std::vector
<T
> >
111 typedef std::vector
<T
> vector_type
;
112 void operator()( void )
115 vector_type
x( 1 , 2.0 );
116 ControlledStepper controlled_stepper
;
117 constant_system_functor_standard sys
;
119 // dont run this for MSVC due to compiler bug 697006
121 check_controlled_stepper_concept( controlled_stepper
,
122 constant_system_standard
< vector_type
, vector_type
, typename
ControlledStepper::time_type
> ,
125 check_controlled_stepper_concept( controlled_stepper
, boost::cref( sys
) , x
);
127 check_controlled_stepper_concept( controlled_stepper
, boost::cref( sys
) , x
);
128 BOOST_CHECK( (abs( x
[0] - result
)) < eps
);
133 template< class ControlledStepper
>
134 struct perform_controlled_stepper_test
< ControlledStepper
, vector_space_type
>
136 void operator()( void ) const
141 ControlledStepper controlled_stepper
;
142 constant_system_functor_vector_space sys
;
144 // dont run this for MSVC due to compiler bug 697006
145 check_controlled_stepper_concept( controlled_stepper
,
146 constant_system_vector_space
< vector_space_type
, vector_space_type
, typename
ControlledStepper::time_type
>
149 check_controlled_stepper_concept( controlled_stepper
, boost::cref( sys
) , x
);
151 check_controlled_stepper_concept( controlled_stepper
, boost::cref( sys
) , x
);
152 BOOST_CHECK( (abs( x
- result
)) < eps
);
156 template< class ControlledStepper
, typename T
>
157 struct perform_controlled_stepper_test
< ControlledStepper
, boost::array
<T
,1> >
159 typedef boost::array
<T
,1> array_type
;
160 void operator()( void )
165 ControlledStepper controlled_stepper
;
166 constant_system_functor_standard sys
;
168 // dont run this for MSVC due to compiler bug 697006
169 check_controlled_stepper_concept( controlled_stepper
, constant_system_standard
< array_type
, array_type
, typename
ControlledStepper::time_type
> , x
);
171 check_controlled_stepper_concept( controlled_stepper
, boost::cref( sys
) , x
);
173 check_controlled_stepper_concept( controlled_stepper
, boost::cref( sys
) , x
);
174 BOOST_CHECK( (abs( x
[0] - result
)) < eps
);
179 template< class State
> class controlled_stepper_methods
: public mpl::vector
<
180 controlled_runge_kutta
< runge_kutta_cash_karp54_classic
< State
, typename
detail::extract_value_type
<State
>::type
> > ,
181 controlled_runge_kutta
< runge_kutta_dopri5
< State
, typename
detail::extract_value_type
<State
>::type
> > ,
182 controlled_runge_kutta
< runge_kutta_fehlberg78
< State
, typename
detail::extract_value_type
<State
>::type
> > ,
183 bulirsch_stoer
< State
, typename
detail::extract_value_type
<State
>::type
>
195 mpl::end
< mpl::_1
> ,
196 controlled_stepper_methods
< mpl::_2
>
199 >::type all_controlled_stepper_methods
;
204 BOOST_AUTO_TEST_SUITE( controlled_runge_kutta_concept_test
)
206 BOOST_AUTO_TEST_CASE_TEMPLATE( controlled_stepper_test
, ControlledStepper
, all_controlled_stepper_methods
)
208 perform_controlled_stepper_test
< ControlledStepper
, typename
ControlledStepper::state_type
> tester
;
212 BOOST_AUTO_TEST_SUITE_END()