31template <
typename FloatType, Arch Architecture>
32std::shared_ptr<CoulombP3M>
39 std::make_unique<CoulombP3MState<FloatType, Architecture, FFTConfig>>(
42 std::make_shared<CoulombP3MImpl<FloatType, Architecture, FFTConfig>>(
43 std::move(state_ptr), tuning_params, prefactor);
47std::shared_ptr<CoulombP3M>
50 bool single_precision,
Arch arch) {
51 auto fptr = &new_coulomb_p3m_impl<float, Arch::CPU>;
52 if (single_precision) {
54 fptr = new_coulomb_p3m_impl<float, Arch::CPU>;
56 fptr = new_coulomb_p3m_impl<float, Arch::CUDA>;
60 fptr = new_coulomb_p3m_impl<double, Arch::CPU>;
62 throw std::invalid_argument(
63 "P3M GPU only implemented in single-precision mode");
66 return fptr(std::move(p3m_params), tuning_params, prefactor);
Arch
P3M kernel architecture.
std::shared_ptr< CoulombP3M > new_coulomb_p3m_impl(P3MParameters &&p3m, TuningParameters const &tuning_params, double prefactor)
std::shared_ptr< CoulombP3M > new_coulomb_p3m(P3MParameters &&p3m_params, TuningParameters const &tuning_params, double prefactor, bool single_precision, Arch arch)
Structure to hold P3M parameters and some dependent variables.