13#include <Kokkos_Core.hpp>
17template <
class DimI,
class... Dim>
23
24
25
26
27
32 ddc::Coordinate<DimI> m_eval_pos;
36
37
38
39
40
41
45
46
47
48
49
50
51
52 template <
class CoordType,
class BSplines,
class Layout,
class MemorySpace>
59 static_assert(in_tags_v<DimI, to_type_seq_t<CoordType>>);
61 std::array<
double, BSplines::degree() + 1> vals_ptr;
62 Kokkos::mdspan<
double, Kokkos::extents<std::size_t, BSplines::degree() + 1>>
const vals(
65 ddc::DiscreteElement<BSplines>
const idx
66 =
ddc::discrete_space<BSplines>().eval_basis(vals, m_eval_pos);
69 for (std::size_t i = 0; i < BSplines::degree() + 1; ++i) {
70 y += spline_coef(idx + i) * vals[i];
77
78
79
80
81
82template <
class DimI,
class DimNI>
86 ddc::Coordinate<DimI> m_eval_pos;
87 ddc::Coordinate<DimNI> m_eval_pos_not_interest_min;
88 ddc::Coordinate<DimNI> m_eval_pos_not_interest_max;
92
93
94
95
96
97
98
99
100
101
102
103
105 ddc::Coordinate<DimI> eval_pos,
106 ddc::Coordinate<DimNI> eval_pos_not_interest_min,
107 ddc::Coordinate<DimNI> eval_pos_not_interest_max)
108 : m_eval_pos(eval_pos)
109 , m_eval_pos_not_interest_min(eval_pos_not_interest_min)
110 , m_eval_pos_not_interest_max(eval_pos_not_interest_max)
115
116
117
118
119
120
121
122
123
124 template <
class SFINAEDimNI = DimNI, std::enable_if_t<SFINAEDimNI::PERIODIC,
int> = 0>
126 : m_eval_pos(eval_pos)
127 , m_eval_pos_not_interest_min(0.)
128 , m_eval_pos_not_interest_max(0.)
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147 template <
class CoordType,
class BSplines1,
class BSplines2,
class Layout,
class MemorySpace>
149 CoordType coord_extrap,
154 MemorySpace>
const spline_coef)
const
157 in_tags_v<DimI, to_type_seq_t<CoordType>>
158 && in_tags_v<DimNI, to_type_seq_t<CoordType>>);
160 ddc::Coordinate<DimI, DimNI> eval_pos;
161 if constexpr (DimNI::PERIODIC) {
163 Coordinate<DimI, DimNI>(m_eval_pos,
ddc::Coordinate<DimNI>(coord_extrap));
165 eval_pos =
ddc::Coordinate<DimI, DimNI>(
168 clamp(
ddc::Coordinate<DimNI>(coord_extrap),
169 m_eval_pos_not_interest_min,
170 m_eval_pos_not_interest_max));
173 std::array<
double, BSplines1::degree() + 1> vals1_ptr;
174 Kokkos::mdspan<
double, Kokkos::extents<std::size_t, BSplines1::degree() + 1>>
const vals1(
176 std::array<
double, BSplines2::degree() + 1> vals2_ptr;
177 Kokkos::mdspan<
double, Kokkos::extents<std::size_t, BSplines2::degree() + 1>>
const vals2(
180 ddc::DiscreteElement<BSplines1>
const idx1 =
ddc::discrete_space<BSplines1>().eval_basis(
182 ddc::Coordinate<
typename BSplines1::continuous_dimension_type>(eval_pos));
183 ddc::DiscreteElement<BSplines2>
const idx2 =
ddc::discrete_space<BSplines2>().eval_basis(
185 ddc::Coordinate<
typename BSplines2::continuous_dimension_type>(eval_pos));
188 for (std::size_t i = 0; i < BSplines1::degree() + 1; ++i) {
189 for (std::size_t j = 0; j < BSplines2::degree() + 1; ++j) {
190 y += spline_coef(idx1 + i, idx2 + j) * vals1[i] * vals2[j];
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.