Сигнатурой типа для класса шагового я использую суммируюсь здесь:параметров шаблона `повышение :: числовая :: odeint :: runge_kutta-x` совместит с CUDA/OpenMP
Это может быть создаются следующим образом:
boost::numeric::odeint::runge_kutta_dopri5<state_type_> stepper;
Пока все хорошо. Оно работает.
Я планирую перенести мою программу на cuda (используя тягу), а затем в openmp. Я изменил декларацию следующее:
boost::numeric::odeint::runge_kutta_dopri5< state_type_
, double
, state_type_
, double
, boost::numeric::odeint::vector_space_algebra
> stepper;
Я последовал за решение this problem, но это не компилируется.
In file included from /usr/include/boost/numeric/odeint/stepper/euler.hpp:26:
/usr/include/boost/numeric/odeint/algebra/default_operations.hpp:87:27: error: invalid operands to binary expression ('double' and 'const std::vector<double, std::allocator<double> >')
t1 = m_alpha1 * t2 + m_alpha2 * t3;
~~~~~~~~^~~
Мне интересно, что это самый портативный способ заявить шаговую так, что минимальные изменения необходимы позже при переносе на CUDA.
Я вижу. Это мило. Также я добавил сообщение об ошибке компиляции, которое я получил с clang ++. Я не знаю об этом предупреждении; Я использую шаблоны, как они есть в примере кода. С первым объявлением, в котором я передаю только одно имя шаблона, он отлично работает (фактически работает немного лучше, чем существующий интегратор GSL). – Dilawar
Ваш state_type является 'vector < double >'. Векторная пространственная алгебра означает, что вы можете писать выражения типа 'a * x + b * y', что невозможно с помощью' vector < double > '. Используйте библиотеку линейной алгебры, такую как Eigen! – headmyshoulder