【问题标题】:Creating a controlled stepper in odeint using OpenMP使用 OpenMP 在 odeint 中创建受控步进器
【发布时间】:2014-12-27 17:20:05
【问题描述】:

我尝试使用 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)。

非常感谢您的帮助

【问题讨论】:

  • 您可能还想考虑使用 GPU。对于您的长度问题,它可能会将您的代码加速几个数量级。

标签: c++ boost openmp odeint


【解决方案1】:

您需要使用范围代数对步进器进行参数化:

// 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() );

【讨论】:

    猜你喜欢
    • 2020-06-05
    • 1970-01-01
    • 2020-02-06
    • 1970-01-01
    • 1970-01-01
    • 2020-02-09
    • 1970-01-01
    • 1970-01-01
    • 2018-10-20
    相关资源
    最近更新 更多