используя буст-одинт с комплексом тяги - PullRequest
1 голос
/ 19 марта 2020

Я пытаюсь использовать управляемый степпер в boost odeint с контейнером thrust::host_vector и типом данных thrust::complex<double>. Следующий код компилируется, когда я использую std::vector и std::complex<double>, однако, когда я использую контейнер тяги и / или тип данных, компилятор выдает ошибку.

Во-вторых, ошибка возникает только тогда, когда я использую управляемый степпер и простой степпер работает с тягой (вы можете раскомментировать соответствующие части кода). В моем коде есть ошибка, или это происходит от odeint?

#include <iostream>
#include <vector>
#include <complex>

#include <thrust/host_vector.h>
#include <thrust/for_each.h>
#include <thrust/transform.h>
#include <thrust/complex.h>

#include <boost/numeric/odeint.hpp>
#include <boost/numeric/odeint/external/thrust/thrust.hpp>

using namespace boost::numeric::odeint;

typedef std::complex<double> c_type;
typedef std::vector<c_type> state_vec;
//typedef thrust::complex<double> c_type;
//typedef thrust::host_vector<c_type> state_vec;

template<typename data_type, typename complex_type>
struct multiply {
    data_type a;
    multiply (data_type a): a(a) {}

    complex_type operator()(const complex_type& x){
        return -a*x;
    }
};

template<typename state_type, typename data_type>
struct exp_system {
    const data_type gamma;
    exp_system (data_type gamma): gamma(gamma) {}
    void operator()(const state_type &x, state_type &dxdt, const data_type){
        thrust::transform(x.begin(), x.end(), dxdt.begin(),
                          multiply<data_type, c_type>(gamma));
    }
};

int main()
{
    state_vec x(2);
    x[0] = c_type(1.0, 0.0);
    x[1] = c_type(0.10, 0.0);
    double gamma = 0.15;
    double t_final = 10.0;

    runge_kutta_dopri5<state_vec> stepper;
    auto c_stepper = make_controlled(1.E-5, 1.E-5, stepper);
    auto n_steps = integrate_adaptive(c_stepper,
                                      exp_system<state_vec, double>(gamma),
                                      x , 0.0 , t_final, 0.01 );
    //auto n_steps = integrate_adaptive(stepper,
    //                                  exp_system<state_vec, double>(gamma),
    //                                  x, 0.0, t_final, 0.01);

    std::cout << n_steps << std::endl;

    return 0;
}
...