我尝试使用openmp_range_algebra
使用boost :: odeint构造一个受控步进器typedef vector< complex< double > > state_type;
typedef runge_kutta_dopri5< state_type > error_stepper_type;
typedef controlled_runge_kutta< error_stepper_type > controlled_stepper_type;
controlled_stepper_type controlled_stepper(default_error_checker< double, openmp_range_algebra >;
但是,odeint中不存在这样的构造函数,因此代码无法编译。
我的问题:如何创建一个受控的runge_kutte-dopri5步进器,以便我可以在OpenMP中使用它?
我真的想并行化自适应步进器,因为由于长状态向量(长度:2 ^ 20),这是我程序中最耗时的部分。
非常感谢您的协助
答案 0 :(得分:3)
您需要使用范围代数对步进器进行参数化:
// Disclaimer: Not tested if it compiles
typedef runge_kutta_dopri5<
state_type, double,
state_type, double,
openmp_range_algebra
> stepper_type;
typedef controlled_runge_kutta< stepper_type > controlled_stepper_type;
typedef controlled_stepper_type::error_checker_type error_checker_type;
const double eps_absolute = 1.0e-6;
const double eps_relative = 1.0e-6;
controlled_stepper_type stepper( error_checker_type( eps_absolute , eps_relative ) );
使用make_controlled工厂函数更容易。上面的代码行可以简化为
typedef runge_kutta_dopri5<
state_type, double,
state_type, double,
openmp_range_algebra
> stepper_type;
auto stepper = make_controlled( 1.0e-6 , 1.0e-6 , stepper_type() );