13#include <Kokkos_Core.hpp>
15#include "bsplines_non_uniform.hpp"
16#include "bsplines_uniform.hpp"
17#include "math_tools.hpp"
24
25
26
27
28
29
30template <
class ExecSpace,
class DDim,
class Layout,
class MemorySpace>
31void uniform_bsplines_integrals(
32 ExecSpace
const& execution_space,
35 static_assert(is_uniform_bsplines_v<DDim>);
37 Kokkos::SpaceAccessibility<ExecSpace, MemorySpace>::accessible,
38 "MemorySpace has to be accessible for ExecutionSpace.");
40 assert([&]() ->
bool {
41 if constexpr (DDim::is_periodic()) {
42 return int_vals.size() == ddc::discrete_space<DDim>().nbasis()
43 || int_vals.size() == ddc::discrete_space<DDim>().size();
45 return int_vals.size() == ddc::discrete_space<DDim>().nbasis();
51 if constexpr (DDim::is_periodic()) {
56 int_vals[dom_bsplines],
58 if (int_vals.size() ==
ddc::discrete_space<DDim>().size()) {
61 ddc::parallel_fill(execution_space, int_vals[dom_bsplines_repeated], 0);
70 int_vals[dom_bspline_entirely_in_domain],
73 ddc::DiscreteElement<DDim>
const first_bspline = full_dom_splines.front();
74 ddc::DiscreteElement<DDim>
const last_bspline = full_dom_splines.back();
79 Kokkos::IndexType<std::size_t>>(execution_space, 0, DDim::degree()),
80 KOKKOS_LAMBDA(std::size_t i) {
81 std::array<
double, DDim::degree() + 2> edge_vals_ptr;
82 Kokkos::mdspan<
double, Kokkos::extents<std::size_t, DDim::degree() + 2>>
const
83 edge_vals(edge_vals_ptr.data());
85 ddc::discrete_space<DDim>().eval_basis(
87 ddc::discrete_space<DDim>().rmin(),
90 double const d_eval =
ddc::detail::sum(edge_vals);
92 double const c_eval =
ddc::detail::sum(edge_vals, 0, DDim::degree() - i);
94 double const edge_value
97 int_vals(first_bspline + i) = edge_value;
98 int_vals(last_bspline - i) = edge_value;
104
105
106
107
108
109
110template <
class ExecSpace,
class DDim,
class Layout,
class MemorySpace>
111void non_uniform_bsplines_integrals(
112 ExecSpace
const& execution_space,
115 static_assert(is_non_uniform_bsplines_v<DDim>);
117 Kokkos::SpaceAccessibility<ExecSpace, MemorySpace>::accessible,
118 "MemorySpace has to be accessible for ExecutionSpace.");
120 assert([&]() ->
bool {
121 if constexpr (DDim::is_periodic()) {
122 return int_vals.size() == ddc::discrete_space<DDim>().nbasis()
123 || int_vals.size() == ddc::discrete_space<DDim>().size();
125 return int_vals.size() == ddc::discrete_space<DDim>().nbasis();
131 double const inv_deg = 1.0 / (DDim::degree() + 1);
135 ddc::parallel_for_each(
138 KOKKOS_LAMBDA(
ddc::DiscreteElement<DDim> ix) {
140 = (
ddc::coordinate(
ddc::discrete_space<DDim>().get_last_support_knot(ix))
142 ddc::discrete_space<DDim>().get_first_support_knot(ix)))
146 if constexpr (DDim::is_periodic()) {
147 if (int_vals.size() ==
ddc::discrete_space<DDim>().size()) {
150 ddc::parallel_fill(execution_space, int_vals[dom_bsplines_wrap], 0);
158
159
160
161
162
163
164
165template <
class ExecSpace,
class DDim,
class Layout,
class MemorySpace>
167 ExecSpace
const& execution_space,
170 static_assert(is_uniform_bsplines_v<DDim> || is_non_uniform_bsplines_v<DDim>);
171 if constexpr (is_uniform_bsplines_v<DDim>) {
172 uniform_bsplines_integrals(execution_space, int_vals);
173 }
else if constexpr (is_non_uniform_bsplines_v<DDim>) {
174 non_uniform_bsplines_integrals(execution_space, int_vals);
friend class DiscreteDomain
KOKKOS_FUNCTION constexpr bool operator!=(DiscreteVector< OTags... > const &rhs) const noexcept
The top-level namespace of DDC.
ddc::ChunkSpan< double, ddc::DiscreteDomain< DDim >, Layout, MemorySpace > integrals(ExecSpace const &execution_space, ddc::ChunkSpan< double, ddc::DiscreteDomain< DDim >, Layout, MemorySpace > int_vals)
Compute the integrals of the B-splines.