DDC 0.15.1
Loading...
Searching...
No Matches
constant_extrapolation_rule.hpp
1// Copyright (C) The DDC development team, see COPYRIGHT.md file
2//
3// SPDX-License-Identifier: MIT
4
5#pragma once
6
7#include <array>
8#include <cstddef>
9
10#include <ddc/ddc.hpp>
11
12#include <Kokkos_Core.hpp>
13
14namespace ddc {
15
16template <class DimI, class... Dim>
18{
19};
20
21/**
22 * @brief A functor for describing a spline boundary value by a constant extrapolation for 1D evaluator.
23 *
24 * To define the value of a function on B-splines out of the domain, we here use a constant
25 * extrapolation on the edge.
26 */
27template <class DimI>
29{
30private:
31 ddc::Coordinate<DimI> m_eval_pos;
32
33public:
34 /**
35 * @brief Instantiate a ConstantExtrapolationRule.
36 *
37 * The boundary value will be the same as at the coordinate eval_pos given.
38 *
39 * @param[in] eval_pos Coordinate inside the domain where we will evaluate each points outside the domain.
40 */
41 explicit ConstantExtrapolationRule(ddc::Coordinate<DimI> eval_pos) : m_eval_pos(eval_pos) {}
42
43 /**
44 * @brief Get the value of the function on B-splines at a coordinate outside the domain.
45 *
46 * @param[in] pos The coordinate where we want to evaluate the function on B-splines.
47 * @param[in] spline_coef The coefficients of the function on B-splines.
48 *
49 * @return A double with the value of the function on B-splines evaluated at the coordinate.
50 */
51 template <class CoordType, class BSplines, class Layout, class MemorySpace>
52 KOKKOS_FUNCTION double operator()(
53 [[maybe_unused]] CoordType pos,
54 ddc::ChunkSpan<double const, ddc::DiscreteDomain<BSplines>, Layout, MemorySpace> const
55 spline_coef) const
56 {
57 // `pos` is always unused, but needed for Doxygen
58 static_assert(in_tags_v<DimI, to_type_seq_t<CoordType>>);
59
60 std::array<double, BSplines::degree() + 1> vals_ptr;
61 Kokkos::mdspan<double, Kokkos::extents<std::size_t, BSplines::degree() + 1>> const vals(
62 vals_ptr.data());
63
64 ddc::DiscreteElement<BSplines> const idx
65 = ddc::discrete_space<BSplines>().eval_basis(vals, m_eval_pos);
66
67 double y = 0.0;
68 for (std::size_t i = 0; i < BSplines::degree() + 1; ++i) {
69 y += spline_coef(idx + i) * vals[i];
70 }
71 return y;
72 }
73};
74
75/**
76 * @brief A functor for describing a spline boundary value by a constant extrapolation for 2D evaluator.
77 *
78 * To define the value of a function on B-splines out of the domain, we here use a constant
79 * extrapolation on the edge.
80 */
81template <class DimI, class DimNI>
82struct ConstantExtrapolationRule<DimI, DimNI>
83{
84private:
85 ddc::Coordinate<DimI> m_eval_pos;
86
87public:
89 /**
90 * @brief Instantiate a ConstantExtrapolationRule.
91 *
92 * The boundary value will be the same as at the coordinate given in a dimension given.
93 * The dimension of the input defines the dimension of the boundary condition.
94 * The second and the third parameters are needed in case of non-periodic splines on the
95 * dimension off-interest (the complementary dimension of the boundary condition),
96 * because the evaluator can receive coordinates outside the domain in both dimension.
97 *
98 * @param[in] eval_pos Coordinate in the dimension given inside the domain where we will evaluate each points outside the domain.
99 * @param[in] eval_pos_not_interest_min The minimum coordinate inside the domain on the complementary dimension of the boundary condition.
100 * @param[in] eval_pos_not_interest_max The maximum coordinate inside the domain on the complementary dimension of the boundary condition.
101 *
102 * @deprecated Use the single parameter constructor instead, the boundaries are now retrieved from the BSplines boundaries
103 */
104 [[deprecated("Use the single parameter constructor instead, the boundaries are now retrieved from the BSplines boundaries")]] explicit ConstantExtrapolationRule(
105 ddc::Coordinate<DimI> eval_pos,
106 [[maybe_unused]] ddc::Coordinate<DimNI> eval_pos_not_interest_min,
107 [[maybe_unused]] ddc::Coordinate<DimNI> eval_pos_not_interest_max)
108 : m_eval_pos(eval_pos)
109 {
110 }
111#endif
112
113 /**
114 * @brief Instantiate a ConstantExtrapolationRule.
115 *
116 * The boundary value will be the same as at the coordinate given in a dimension given.
117 * The dimension of the input defines the dimension of the boundary condition.
118 * No second and third parameters are needed in case of periodic splines on the
119 * dimension off-interest (the complementary dimension of the boundary condition).
120 *
121 * @param[in] eval_pos Coordinate in the dimension given inside the domain where we will evaluate each points outside the domain.
122 */
123 explicit ConstantExtrapolationRule(ddc::Coordinate<DimI> eval_pos) : m_eval_pos(eval_pos) {}
124
125 /**
126 * @brief Get the value of the function on B-splines at a coordinate outside the domain.
127 *
128 * In the dimension defined in the constructor Dim1 (or Dim2), it sets the coordinate pos_1 (or pos_2)
129 * given at the m_eval_pos coordinate if it is outside the domain.
130 * If the coordinate on the complementary dimension of the boundary condition dimension ddc::Coordinate<DimNI>(coord_extrap) is
131 * outside the domain, then it also sets the coordinate at eval_pos_not_interest_min
132 * (if ddc::Coordinate<DimNI>(coord_extrap) @f$ < @f$ eval_pos_not_interest_min) or
133 * at eval_pos_not_interest_max (if ddc::Coordinate<DimNI>(coord_extrap) @f$ > @f$ eval_pos_not_interest_max).
134 *
135 * @param[in] coord_extrap The coordinates where we want to evaluate the function on B-splines
136 * @param[in] spline_coef The coefficients of the function on B-splines.
137 *
138 *@return A double with the value of the function on B-splines evaluated at the coordinate.
139 */
140 template <class CoordType, class BSplines1, class BSplines2, class Layout, class MemorySpace>
141 KOKKOS_FUNCTION double operator()(
142 CoordType coord_extrap,
143 ddc::ChunkSpan<
144 double const,
145 ddc::DiscreteDomain<BSplines1, BSplines2>,
146 Layout,
147 MemorySpace> const spline_coef) const
148 {
149 static_assert(
150 in_tags_v<DimI, to_type_seq_t<CoordType>>
151 && in_tags_v<DimNI, to_type_seq_t<CoordType>>);
152 using bsplines_ni_type = std::conditional_t<
153 std::is_same_v<typename BSplines1::continuous_dimension_type, DimNI>,
154 BSplines1,
155 BSplines2>;
156 static_assert(std::is_same_v<typename bsplines_ni_type::continuous_dimension_type, DimNI>);
157
158 ddc::Coordinate<DimI, DimNI> eval_pos;
159 if constexpr (bsplines_ni_type::is_periodic()) {
160 eval_pos = ddc::
161 Coordinate<DimI, DimNI>(m_eval_pos, ddc::Coordinate<DimNI>(coord_extrap));
162 } else {
163 eval_pos = ddc::Coordinate<DimI, DimNI>(
164 m_eval_pos,
165 Kokkos::
166 clamp(ddc::Coordinate<DimNI>(coord_extrap),
167 ddc::discrete_space<bsplines_ni_type>().rmin(),
168 ddc::discrete_space<bsplines_ni_type>().rmax()));
169 }
170
171 std::array<double, BSplines1::degree() + 1> vals1_ptr;
172 Kokkos::mdspan<double, Kokkos::extents<std::size_t, BSplines1::degree() + 1>> const vals1(
173 vals1_ptr.data());
174 std::array<double, BSplines2::degree() + 1> vals2_ptr;
175 Kokkos::mdspan<double, Kokkos::extents<std::size_t, BSplines2::degree() + 1>> const vals2(
176 vals2_ptr.data());
177
178 ddc::DiscreteElement<BSplines1> const idx1 = ddc::discrete_space<BSplines1>().eval_basis(
179 vals1,
180 ddc::Coordinate<typename BSplines1::continuous_dimension_type>(eval_pos));
181 ddc::DiscreteElement<BSplines2> const idx2 = ddc::discrete_space<BSplines2>().eval_basis(
182 vals2,
183 ddc::Coordinate<typename BSplines2::continuous_dimension_type>(eval_pos));
184
185 double y = 0.0;
186 for (std::size_t i = 0; i < BSplines1::degree() + 1; ++i) {
187 for (std::size_t j = 0; j < BSplines2::degree() + 1; ++j) {
188 y += spline_coef(idx1 + i, idx2 + j) * vals1[i] * vals2[j];
189 }
190 }
191
192 return y;
193 }
194};
195
196} // namespace ddc
friend class ChunkSpan
friend class DiscreteDomain
KOKKOS_FUNCTION constexpr bool operator!=(DiscreteVector< OTags... > const &rhs) const noexcept
Storage class of the static attributes of the discrete dimension.
KOKKOS_INLINE_FUNCTION std::size_t ncells() const noexcept
Returns the number of cells over which the B-splines are defined.
Impl(Impl &&x)=default
Move-constructs.
KOKKOS_INLINE_FUNCTION std::size_t nbasis() const noexcept
Returns the number of basis functions.
KOKKOS_INLINE_FUNCTION ddc::DiscreteElement< knot_discrete_dimension_type > get_last_support_knot(discrete_element_type const &ix) const
Returns the coordinate of the last support knot associated to a DiscreteElement identifying a B-splin...
KOKKOS_INLINE_FUNCTION discrete_element_type eval_basis_and_n_derivs(Kokkos::mdspan< double, Kokkos::dextents< std::size_t, 2 > > derivs, ddc::Coordinate< CDim > const &x, std::size_t n) const
Evaluates non-zero B-spline values and derivatives at a given coordinate.
Impl(Impl< DDim, OriginMemorySpace > const &impl)
Copy-constructs from another Impl with a different Kokkos memory space.
Impl(Impl const &x)=default
Copy-constructs.
KOKKOS_INLINE_FUNCTION discrete_element_type eval_deriv(Kokkos::mdspan< double, Kokkos::dextents< std::size_t, 1 > > derivs, ddc::Coordinate< CDim > const &x) const
Evaluates non-zero B-spline derivatives at a given coordinate.
KOKKOS_INLINE_FUNCTION ddc::DiscreteDomain< knot_discrete_dimension_type > break_point_domain() const
Returns the discrete domain which describes the break points.
Impl & operator=(Impl const &x)=default
Copy-assigns.
KOKKOS_INLINE_FUNCTION std::size_t npoints() const noexcept
The number of break points.
KOKKOS_INLINE_FUNCTION ddc::DiscreteElement< knot_discrete_dimension_type > get_first_support_knot(discrete_element_type const &ix) const
Returns the coordinate of the first support knot associated to a DiscreteElement identifying a B-spli...
KOKKOS_INLINE_FUNCTION double length() const noexcept
Returns the length of the domain.
Impl(RandomIt breaks_begin, RandomIt breaks_end)
Constructs an Impl by iterating over a range of break points from begin to end.
KOKKOS_INLINE_FUNCTION discrete_domain_type full_domain() const
Returns the discrete domain including eventual additional B-splines in the periodic case.
KOKKOS_INLINE_FUNCTION std::size_t size() const noexcept
Returns the number of elements necessary to construct a spline representation of a function.
Impl(std::initializer_list< ddc::Coordinate< CDim > > breaks)
Constructs an Impl using a brace-list, i.e.
Impl & operator=(Impl &&x)=default
Move-assigns.
KOKKOS_INLINE_FUNCTION ddc::Coordinate< CDim > rmin() const noexcept
Returns the coordinate of the first break point of the domain on which the B-splines are defined.
KOKKOS_INLINE_FUNCTION discrete_element_type eval_basis(Kokkos::mdspan< double, Kokkos::dextents< std::size_t, 1 > > values, ddc::Coordinate< CDim > const &x) const
Evaluates non-zero B-splines at a given coordinate.
~Impl()=default
Destructs.
KOKKOS_INLINE_FUNCTION ddc::Coordinate< CDim > rmax() const noexcept
Returns the coordinate of the last break point of the domain on which the B-splines are defined.
Impl(std::vector< ddc::Coordinate< CDim > > const &breaks)
Constructs an Impl using a std::vector.
The type of a non-uniform 1D spline basis (B-spline).
static constexpr std::size_t degree() noexcept
The degree of B-splines.
static constexpr bool is_periodic() noexcept
Indicates if the B-splines are periodic or not.
static constexpr bool is_uniform() noexcept
Indicates if the B-splines are uniform or not (this is not the case here).
NonUniformPointSampling models a non-uniform discretization of the CDim segment .
Storage class of the static attributes of the discrete dimension.
KOKKOS_INLINE_FUNCTION std::size_t ncells() const noexcept
Returns the number of cells over which the B-splines are defined.
KOKKOS_INLINE_FUNCTION ddc::Coordinate< CDim > rmin() const noexcept
Returns the coordinate of the lower bound of the domain on which the B-splines are defined.
Impl(Impl const &x)=default
Copy-constructs.
KOKKOS_INLINE_FUNCTION double length() const noexcept
Returns the length of the domain.
KOKKOS_INLINE_FUNCTION discrete_domain_type full_domain() const
Returns the discrete domain including eventual additional B-splines in the periodic case.
KOKKOS_INLINE_FUNCTION discrete_element_type eval_deriv(Kokkos::mdspan< double, Kokkos::dextents< std::size_t, 1 > > derivs, ddc::Coordinate< CDim > const &x) const
Evaluates non-zero B-spline derivatives at a given coordinate.
~Impl()=default
Destructs.
Impl(Impl< DDim, OriginMemorySpace > const &impl)
Copy-constructs from another Impl with a different Kokkos memory space.
KOKKOS_INLINE_FUNCTION discrete_element_type eval_basis_and_n_derivs(Kokkos::mdspan< double, Kokkos::dextents< std::size_t, 2 > > derivs, ddc::Coordinate< CDim > const &x, std::size_t n) const
Evaluates non-zero B-spline values and derivatives at a given coordinate.
Impl & operator=(Impl &&x)=default
Move-assigns.
KOKKOS_INLINE_FUNCTION ddc::Coordinate< CDim > rmax() const noexcept
Returns the coordinate of the upper bound of the domain on which the B-splines are defined.
KOKKOS_INLINE_FUNCTION ddc::DiscreteElement< knot_discrete_dimension_type > get_last_support_knot(discrete_element_type const &ix) const
Returns the coordinate of the last support knot associated to a DiscreteElement identifying a B-splin...
KOKKOS_INLINE_FUNCTION ddc::DiscreteDomain< knot_discrete_dimension_type > break_point_domain() const
Returns the discrete domain which describes the break points.
KOKKOS_INLINE_FUNCTION discrete_element_type eval_basis(Kokkos::mdspan< double, Kokkos::dextents< std::size_t, 1 > > values, ddc::Coordinate< CDim > const &x) const
Evaluates non-zero B-splines at a given coordinate.
KOKKOS_INLINE_FUNCTION ddc::DiscreteElement< knot_discrete_dimension_type > get_first_support_knot(discrete_element_type const &ix) const
Returns the coordinate of the first support knot associated to a DiscreteElement identifying a B-spli...
KOKKOS_INLINE_FUNCTION std::size_t nbasis() const noexcept
Returns the number of basis functions.
Impl & operator=(Impl const &x)=default
Copy-assigns.
KOKKOS_INLINE_FUNCTION std::size_t size() const noexcept
Returns the number of elements necessary to construct a spline representation of a function.
Impl(Impl &&x)=default
Move-constructs.
Impl(ddc::Coordinate< CDim > rmin, ddc::Coordinate< CDim > rmax, std::size_t ncells)
Constructs a spline basis (B-splines) with n equidistant knots over .
The type of a uniform 1D spline basis (B-spline).
static constexpr bool is_uniform() noexcept
Indicates if the B-splines are uniform or not (this is the case here).
static constexpr std::size_t degree() noexcept
The degree of B-splines.
static constexpr bool is_periodic() noexcept
Indicates if the B-splines are periodic or not.
UniformPointSampling models a uniform discretization of the provided continuous dimension.
#define DDC_BUILD_DEPRECATED_CODE
Definition config.hpp:7
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.
KOKKOS_FUNCTION double operator()(CoordType coord_extrap, ddc::ChunkSpan< double const, ddc::DiscreteDomain< BSplines1, BSplines2 >, Layout, MemorySpace > const spline_coef) const
Get the value of the function on B-splines at a coordinate outside the domain.
ConstantExtrapolationRule(ddc::Coordinate< DimI > eval_pos)
Instantiate a ConstantExtrapolationRule.
KOKKOS_FUNCTION double operator()(CoordType pos, ddc::ChunkSpan< double const, ddc::DiscreteDomain< BSplines >, Layout, MemorySpace > const spline_coef) const
Get the value of the function on B-splines at a coordinate outside the domain.
ConstantExtrapolationRule(ddc::Coordinate< DimI > eval_pos)
Instantiate a ConstantExtrapolationRule.