DDC 0.0.0

a discrete domain computation library

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 "view.hpp"
8
9namespace ddc {
10
11template <class DimI, class... Dim>
15
22template <class DimI>
24{
25private:
26 ddc::Coordinate<DimI> m_eval_pos;
27
28public:
38
49 template <class CoordType, class BSplines, class Layout, class MemorySpace>
53 spline_coef) const
54 {
56
57 std::array<double, BSplines::degree() + 1> vals_ptr;
58 std::experimental::mdspan<
59 double,
60 std::experimental::extents<std::size_t, BSplines::degree() + 1>> const
61 vals(vals_ptr.data());
62
64 = ddc::discrete_space<BSplines>().eval_basis(vals, m_eval_pos);
65
66 double y = 0.0;
67 for (std::size_t i = 0; i < BSplines::degree() + 1; ++i) {
68 y += spline_coef(idx + i) * vals[i];
69 }
70 return y;
71 }
72};
73
80template <class DimI, class DimNI>
82{
83private:
84 ddc::Coordinate<DimI> m_eval_pos;
85 ddc::Coordinate<DimNI> m_eval_pos_not_interest_min;
86 ddc::Coordinate<DimNI> m_eval_pos_not_interest_max;
87
88public:
115
128 template <class DimNI_sfinae = DimNI, std::enable_if_t<DimNI_sfinae::PERIODIC, int> = 0>
130 : m_eval_pos(eval_pos)
131 , m_eval_pos_not_interest_min(0.)
132 , m_eval_pos_not_interest_max(0.)
133 {
134 }
135
153 template <class CoordType, class BSplines1, class BSplines2, class Layout, class MemorySpace>
157 double const,
159 Layout,
160 MemorySpace> const spline_coef) const
161 {
162 static_assert(
163 in_tags_v<
164 DimI,
166
168 if constexpr (DimNI::PERIODIC) {
170 } else {
172 m_eval_pos,
173 Kokkos::
175 m_eval_pos_not_interest_min,
176 m_eval_pos_not_interest_max));
177 }
178
179 std::array<double, BSplines1::degree() + 1> vals1_ptr;
180 std::experimental::mdspan<
181 double,
182 std::experimental::extents<std::size_t, BSplines1::degree() + 1>> const
183 vals1(vals1_ptr.data());
184 std::array<double, BSplines2::degree() + 1> vals2_ptr;
185 std::experimental::mdspan<
186 double,
187 std::experimental::extents<std::size_t, BSplines2::degree() + 1>> const
188 vals2(vals2_ptr.data());
189
196
197 double y = 0.0;
198 for (std::size_t i = 0; i < BSplines1::degree() + 1; ++i) {
199 for (std::size_t j = 0; j < BSplines2::degree() + 1; ++j) {
200 y += spline_coef(idx1 + i, idx2 + j) * vals1[i] * vals2[j];
201 }
202 }
203
204 return y;
205 }
206};
207} // namespace ddc
Definition discrete_domain.hpp:51
A DiscreteElement identifies an element of the discrete dimension.
Definition discrete_element.hpp:146
The top-level namespace of DDC.
Definition aligned_allocator.hpp:11
constexpr bool enable_chunk
Definition chunk_traits.hpp:16
detail::TaggedVector< CoordinateElement, CDims... > Coordinate
A Coordinate represents a coordinate in the continuous space.
Definition coordinate.hpp:26
Definition chunk_span.hpp:30
Definition constant_extrapolation_rule.hpp:13
ConstantExtrapolationRule(ddc::Coordinate< DimI > eval_pos, ddc::Coordinate< DimNI > eval_pos_not_interest_min, ddc::Coordinate< DimNI > eval_pos_not_interest_max)
Instantiate a ConstantExtrapolationRule.
Definition constant_extrapolation_rule.hpp:106
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.
Definition constant_extrapolation_rule.hpp:154
ConstantExtrapolationRule(ddc::Coordinate< DimI > eval_pos)
Instantiate a ConstantExtrapolationRule.
Definition constant_extrapolation_rule.hpp:129
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.
Definition constant_extrapolation_rule.hpp:50
ConstantExtrapolationRule(ddc::Coordinate< DimI > eval_pos)
Instantiate a ConstantExtrapolationRule.
Definition constant_extrapolation_rule.hpp:37