Определение runge_kutta_dopri5 гласит, что я могу дать несколько типов данных при инициализации:
template<typename State, typename Value = double, typename Deriv = State,
typename Time = Value,
typename Algebra = typename algebra_dispatcher< State >::algebra_type,
typename Operations = typename operations_dispatcher< State >::operations_type,
typename Resizer = initially_resizer> class runge_kutta_dopri5
с Value
, указывающим тип значений, используемых в вычислениях, и Time
, указывающим тип переменной времени, используемой в расчете. Теперь я хотел бы использовать свой собственный тип данных, например thrust::complex<double>
для Value
. Обычно этот тип данных также используется для переменной времени, но в этом случае не имеет смысла использовать комплексное число для подсчета времени. Поэтому я намеревался использовать double
в качестве типа переменной для переменной времени, то есть писать шаблон следующим образом (для thrust::complex
):
typedef thrust::complex<double> value_type;
typedef thrust::device_vector< value_type > state_type;
typedef runge_kutta_dopri5<state_type , value_type, state_type, double, thrust_algebra, thrust_operations> stepper_type;
При этом, однако, компиляция завершается неудачно с
error: no instance of constructor "boost::numeric::odeint::thrust_operations::scale_sum2<Fac1, Fac2>::scale_sum2 [with Fac1=value_type, Fac2=double]" matches the argument list
argument types are: (double, thrust::complex<double>)
detected during:
instantiation of "void boost::numeric::odeint::runge_kutta_dopri5<State, Value, Deriv, Time, Algebra, Operations, Resizer>::do_step_impl(System, const StateIn &, const DerivIn &, boost::numeric::odeint::runge_kutta_dopri5<State, Value, Deriv, Time, Algebra, Operations, Resizer>::time_type, StateOut &, DerivOut &, boost::numeric::odeint::runge_kutta_dopri5<State, Value, Deriv, Time, Algebra, Operations, Resizer>::time_type) [with State=state_type, Value=value_type, Deriv=state_type, Time=double, Algebra=boost::numeric::odeint::thrust_algebra, Operations=boost::numeric::odeint::thrust_operations, Resizer=boost::numeric::odeint::initially_resizer, System=boost_thrust_calculator, StateIn=state_type, DerivIn=state_type, StateOut=state_type, DerivOut=state_type]"
Есть ли способ создать эту функцию или реализовать ее как-то иначе? Или я должен написать свой собственный степпер?