Использование адаптивного буста odeint stepper с thrust :: complex как value_type и double как time_type - PullRequest
0 голосов
/ 03 мая 2020

Определение 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]"

Есть ли способ создать эту функцию или реализовать ее как-то иначе? Или я должен написать свой собственный степпер?

...