| /* |
| * odeint_rk4_array |
| * |
| * Copyright 2011 Mario Mulansky |
| * Copyright 2012 Karsten Ahnert |
| * |
| * Distributed under the Boost Software License, Version 1.0. |
| * (See accompanying file LICENSE_1_0.txt or |
| * copy at http://www.boost.org/LICENSE_1_0.txt) |
| */ |
| |
| #include <iostream> |
| |
| #include <boost/timer.hpp> |
| #include <boost/array.hpp> |
| |
| #include <boost/numeric/odeint/stepper/runge_kutta4_classic.hpp> |
| #include <boost/numeric/odeint/stepper/runge_kutta4.hpp> |
| #include <boost/numeric/odeint/algebra/array_algebra.hpp> |
| |
| #include "lorenz.hpp" |
| |
| typedef boost::timer timer_type; |
| |
| typedef boost::array< double , 3 > state_type; |
| |
| using namespace boost::numeric::odeint; |
| |
| //typedef boost::numeric::odeint::runge_kutta4_classic< state_type > rk4_odeint_type; |
| |
| // use the never resizer explicitely for optimal performance with gcc, |
| // for the intel compiler this doesnt matter and the above definition |
| // gives the same performance |
| typedef runge_kutta4_classic< state_type , double , state_type , double , |
| array_algebra, default_operations, never_resizer > rk4_odeint_type; |
| |
| |
| const int loops = 21; |
| const int num_of_steps = 20000000; |
| const double dt = 1E-10; |
| |
| |
| int main() |
| { |
| double min_time = 1E6; // something big |
| rk4_odeint_type stepper; |
| std::clog.precision(16); |
| std::cout.precision(16); |
| for( int n=0; n<loops; n++ ) |
| { |
| state_type x = {{ 8.5, 3.1, 1.2 }}; |
| double t = 0.0; |
| timer_type timer; |
| for( size_t i = 0 ; i < num_of_steps ; ++i ) |
| { |
| stepper.do_step( lorenz(), x, t, dt ); |
| t += dt; |
| } |
| min_time = std::min( timer.elapsed() , min_time ); |
| std::clog << timer.elapsed() << '\t' << x[0] << std::endl; |
| } |
| std::cout << "Minimal Runtime: " << min_time << std::endl; |
| } |