2014-12-27 64 views
4

在odeint創建控制的步進我嘗試使用使用OpenMP

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存在,因此代碼不編譯openmp_range_algebra構建具有升壓:: odeint的控制步進。

我的問題:如何創建一個受控的runge_kutte-dopri5步進器,以便我可以在OpenMP中使用它?

我真的很想並行化自適應步進器,因爲這是我的程序中由於長狀態向量(長度爲2^20)而最耗時的部分。

非常感謝您的協助

+0

您也可以考慮使用GPU。對於你的長度問題,它可能會加快你的代碼的數量級。 – headmyshoulder 2014-12-27 20:27:37

回答

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