/* Boost libs/numeric/odeint/examples/openmp/lorenz_ensemble_nested.cpp Copyright 2013 Karsten Ahnert Copyright 2013 Pascal Germroth Copyright 2013 Mario Mulansky Parallelized Lorenz ensembles using nested omp algebra 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 #include #include #include #include #include #include #include "point_type.hpp" using namespace std; using namespace boost::numeric::odeint; typedef point point_type; typedef vector< point_type > state_type; const double sigma = 10.0; const double b = 8.0 / 3.0; struct sys_func { const vector &R; sys_func( vector &R ) : R(R) {} void operator()( const state_type &x , state_type &dxdt , double t ) const { # pragma omp parallel for for(size_t i = 0 ; i < x.size() ; i++) { dxdt[i][0] = -sigma * (x[i][0] - x[i][1]); dxdt[i][1] = R[i] * x[i][0] - x[i][1] - x[i][0] * x[i][2]; dxdt[i][2] = -b * x[i][2] + x[i][0] * x[i][1]; } } }; int main(int argc, char **argv) { size_t n = 1024; if(argc > 1) n = boost::lexical_cast(argv[1]); vector R(n); const double Rmin = 0.1, Rmax = 50.0; # pragma omp parallel for for(size_t i = 0 ; i < n ; i++) R[i] = Rmin + (Rmax - Rmin) / (n - 1) * i; state_type state( n , point_type(10, 10, 10) ); typedef runge_kutta4< state_type, double , state_type , double , openmp_nested_algebra > stepper; const double t_max = 10.0, dt = 0.01; integrate_const( stepper(), sys_func(R), state, 0.0, t_max, dt ); std::copy( state.begin(), state.end(), ostream_iterator(cout, "\n") ); return 0; }