13#include <Kokkos_Core.hpp>
18
19
20
21
22
27 ddc::Coordinate<DimI> m_eval_pos;
31
32
33
34
35
36
37
38
39
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57 template <
class CoordType,
class... BSplines,
class Layout,
class MemorySpace>
59 CoordType coord_extrap,
63 static_assert(in_tags_v<DimI, to_type_seq_t<CoordType>>);
64 using TypeSeqBSplines =
ddc::
TypeSeq<BSplines...>;
66 ddc::Coordinate<DimI,
typename BSplines::continuous_dimension_type...>
const coord_eval(
67 get_eval_pos<BSplines>(
ddc::select<
typename BSplines::continuous_dimension_type>(
70 auto vals_ptr = cexa::make_tuple(std::array<Real, BSplines::degree() + 1> {}...);
71 auto const vals = cexa::make_tuple(
72 Kokkos::mdspan<Real, Kokkos::extents<std::size_t, BSplines::degree() + 1>>(
73 cexa::get<
ddc::type_seq_rank_v<BSplines, TypeSeqBSplines>>(vals_ptr)
76 auto const jmin = cexa::make_tuple(
77 ddc::discrete_space<BSplines>().eval_basis(
78 cexa::get<
ddc::type_seq_rank_v<BSplines, TypeSeqBSplines>>(vals),
79 ddc::Coordinate<
typename BSplines::continuous_dimension_type>(
82 static constexpr std::size_t dimension =
sizeof...(BSplines);
86 std::array<std::size_t, dimension> {(BSplines::degree() + 1)...},
87 [&](std::array<std::size_t, dimension> idx) {
89 ddc::DiscreteElement<BSplines...>((
90 cexa::get<
ddc::type_seq_rank_v<BSplines, TypeSeqBSplines>>(
92 + idx[
ddc::type_seq_rank_v<
94 TypeSeqBSplines>])...))
95 * (cexa::get<ddc::type_seq_rank_v<BSplines, TypeSeqBSplines>>(
96 vals)[idx[ddc::type_seq_rank_v<BSplines, TypeSeqBSplines>]]
104 template <
class BSplinesNI>
105 KOKKOS_FUNCTION
ddc::Coordinate<
typename BSplinesNI::continuous_dimension_type> get_eval_pos(
106 ddc::Coordinate<
typename BSplinesNI::continuous_dimension_type> coord_extrap)
const
108 if constexpr (std::is_same_v<
typename BSplinesNI::continuous_dimension_type, DimI>) {
111 if constexpr (BSplinesNI::is_periodic()) {
112 return ddc::Coordinate<
typename BSplinesNI::continuous_dimension_type>(
116 clamp(
ddc::Coordinate<
typename BSplinesNI::continuous_dimension_type>(
118 ddc::discrete_space<BSplinesNI>().rmin(),
119 ddc::discrete_space<BSplinesNI>().rmax());
124 template <std::size_t N,
class Functor,
class... Is>
125 KOKKOS_FUNCTION
static void for_each(
126 std::array<std::size_t, N>
const& bounds,
130 static constexpr std::size_t I =
sizeof...(Is);
131 if constexpr (I == N) {
132 f(std::array<std::size_t, N> {is...});
134 for (std::size_t i = 0; i < bounds[I]; ++i) {
135 for_each(bounds, f, is..., i);
friend class DiscreteDomain
KOKKOS_FUNCTION constexpr bool operator!=(DiscreteVector< OTags... > const &rhs) const noexcept
The top-level namespace of DDC.
constexpr bool is_uniform_bsplines_v
Indicates if a tag corresponds to uniform B-splines or not.
constexpr bool is_non_uniform_bsplines_v
Indicates if a tag corresponds to non-uniform B-splines or not.
A compile-time sequence of types.