13#include <Kokkos_Core.hpp>
19template <
class Hamiltonian,
class Index>
20inline constexpr bool has_component_dmoments_v
21 =
requires(Hamiltonian
const& h) { h.template dhamiltonian_dmoments<Index>(0.0); };
23template <
class Hamiltonian,
class Index>
24inline constexpr bool has_span_dmoments_v
25 =
requires(Hamiltonian
const& h, std::span<double const, Hamiltonian::N> moments) {
26 h.template dhamiltonian_dmoments<Index>(moments);
29template <
class Hamiltonian,
class Index,
class Elem>
30inline constexpr bool has_elem_dmoments_v =
requires(Hamiltonian
const& h, Elem elem) {
31 h.template dhamiltonian_dmoments<Index>(0.0, elem);
34template <
class Hamiltonian,
class Index,
class Elem>
35inline constexpr bool has_elem_span_dmoments_v =
requires(
37 std::span<double const, Hamiltonian::N> moments,
38 Elem elem) { h.template dhamiltonian_dmoments<Index>(moments, elem); };
40template <
class Hamiltonian,
class Elem>
41inline constexpr bool has_elem_dpotential_v
42 =
requires(Hamiltonian
const& h, Elem elem) { h.dhamiltonian_dpotential(0.0, elem); };
46template <
class Hamiltonian>
49 Hamiltonian m_hamiltonian;
52 static constexpr bool IS_LINEAR = Hamiltonian::IS_LINEAR;
55 : m_hamiltonian(std::move(hamiltonian))
59 template <
class Index>
61 std::span<double const, Hamiltonian::N> spatial_moments)
const
63 if constexpr (detail::has_span_dmoments_v<Hamiltonian, Index>) {
64 return m_hamiltonian.template dhamiltonian_dmoments<Index>(spatial_moments);
66 return m_hamiltonian.template dhamiltonian_dmoments<Index>(spatial_moments);
70 template <
class Index,
class Elem>
72 std::span<double const, Hamiltonian::N> spatial_moments,
75 if constexpr (detail::has_elem_span_dmoments_v<Hamiltonian, Index, Elem>) {
76 return m_hamiltonian.template dhamiltonian_dmoments<Index>(spatial_moments, elem);
78 return m_hamiltonian.template dhamiltonian_dmoments<Index>(spatial_moments, elem);
82 template <
class Index>
84 double spatial_moments_component)
const
86 return m_hamiltonian.template dhamiltonian_dmoments<Index>(spatial_moments_component);
89 template <
class Index,
class Elem>
91 double spatial_moments_component,
94 if constexpr (detail::has_elem_dmoments_v<Hamiltonian, Index, Elem>) {
96 .template dhamiltonian_dmoments<Index>(spatial_moments_component, elem);
98 return m_hamiltonian.template dhamiltonian_dmoments<Index>(spatial_moments_component);
102 template <
class Index>
104 std::span<double const, 1> potential)
const
106 static_cast<void>(
sizeof(Index));
107 return -m_hamiltonian.dhamiltonian_dpotential(potential[0]);
110 template <
class Index,
class Elem>
112 std::span<double const, 1> potential,
115 static_cast<void>(
sizeof(Index));
116 if constexpr (detail::has_elem_dpotential_v<Hamiltonian, Elem>) {
117 return -m_hamiltonian.dhamiltonian_dpotential(potential[0], elem);
119 static_cast<void>(elem);
124 template <
class Index>
125 [[nodiscard]] KOKKOS_FUNCTION
constexpr double dmoments_dt(
double potential)
const
127 static_cast<void>(
sizeof(Index));
128 return -m_hamiltonian.dhamiltonian_dpotential(potential);
131 template <
class Index,
class Elem>
132 [[nodiscard]] KOKKOS_FUNCTION
constexpr double dmoments_dt(
double potential, Elem elem)
const
134 static_cast<void>(
sizeof(Index));
135 if constexpr (detail::has_elem_dpotential_v<Hamiltonian, Elem>) {
136 return -m_hamiltonian.dhamiltonian_dpotential(potential, elem);
138 static_cast<void>(elem);
139 return -m_hamiltonian.dhamiltonian_dpotential(potential);
143 template <
class Index,
class Elem>
146 return m_hamiltonian.template dhamiltonian_dmoments_value<Index>(elem);
149 template <
class Index,
class Elem>
150 requires requires(Hamiltonian
const& h, Elem e) { h.dhamiltonian_dpotential_value(e); }
153 static_cast<void>(
sizeof(Index));
154 auto value = m_hamiltonian.dhamiltonian_dpotential_value(elem);
155 if constexpr (std::is_same_v<std::remove_cvref_t<
decltype(value)>,
double>) {
158 ddc::device_for_each(value.domain(), [&](
auto mem_elem) { value(mem_elem) *= -1.0; });
KOKKOS_FUNCTION constexpr double dmoments_dt(std::span< double const, 1 > potential, Elem elem) const
KOKKOS_FUNCTION constexpr double dpotential_dt(double spatial_moments_component, Elem elem) const
KOKKOS_FUNCTION constexpr auto dpotential_dt_value(Elem elem) const
KOKKOS_FUNCTION constexpr double dpotential_dt(std::span< double const, Hamiltonian::N > spatial_moments, Elem elem) const
KOKKOS_FUNCTION constexpr auto dmoments_dt_value(Elem elem) const
static constexpr bool IS_LINEAR
KOKKOS_FUNCTION constexpr double dpotential_dt(double spatial_moments_component) const
KOKKOS_FUNCTION constexpr HamiltonEquations(Hamiltonian hamiltonian)
KOKKOS_FUNCTION constexpr double dmoments_dt(std::span< double const, 1 > potential) const
KOKKOS_FUNCTION constexpr double dpotential_dt(std::span< double const, Hamiltonian::N > spatial_moments) const
KOKKOS_FUNCTION constexpr double dmoments_dt(double potential) const
KOKKOS_FUNCTION constexpr double dmoments_dt(double potential, Elem elem) const