DDC
0.10.0
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
#include <type_traits>
10
11
#include <ddc/ddc.hpp>
12
13
#include <Kokkos_Core.hpp>
14
15
namespace
ddc
{
16
17
template
<
class
DimI
,
class
...
Dim
>
18
struct
ConstantExtrapolationRule
19
{
20
};
21
28
template
<
class
DimI>
29
struct
ConstantExtrapolationRule
<
DimI
>
30
{
31
private
:
32
ddc::Coordinate<DimI>
m_eval_pos;
33
34
public
:
42
explicit
ConstantExtrapolationRule
(
ddc::Coordinate<DimI>
eval_pos
) : m_eval_pos(
eval_pos
) {}
43
52
template
<
class
CoordType,
class
BSplines,
class
Layout,
class
MemorySpace>
53
KOKKOS_FUNCTION
double
operator()
(
54
[[
maybe_unused
]]
CoordType
pos
,
55
ddc::ChunkSpan
<
double
const
,
ddc::DiscreteDomain<BSplines>
,
Layout
,
MemorySpace
>
const
56
spline_coef
)
const
57
{
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
81
template
<
class
DimI,
class
DimNI>
82
struct
ConstantExtrapolationRule
<
DimI
,
DimNI
>
83
{
84
private
:
85
ddc::Coordinate<DimI>
m_eval_pos;
86
ddc::Coordinate<DimNI>
m_eval_pos_not_interest_min;
87
ddc::Coordinate<DimNI>
m_eval_pos_not_interest_max;
88
89
public
:
103
explicit
ConstantExtrapolationRule
(
104
ddc::Coordinate<DimI>
eval_pos
,
105
ddc::Coordinate<DimNI>
eval_pos_not_interest_min
,
106
ddc::Coordinate<DimNI>
eval_pos_not_interest_max
)
107
: m_eval_pos(
eval_pos
)
108
, m_eval_pos_not_interest_min(
eval_pos_not_interest_min
)
109
, m_eval_pos_not_interest_max(
eval_pos_not_interest_max
)
110
{
111
}
112
123
template
<
class
SFINAEDimNI = DimNI, std::enable_if_t<SFINAEDimNI::PERIODIC,
int
> = 0>
124
explicit
ConstantExtrapolationRule
(
ddc::Coordinate<DimI>
eval_pos
)
125
: m_eval_pos(
eval_pos
)
126
, m_eval_pos_not_interest_min(0.)
127
, m_eval_pos_not_interest_max(0.)
128
{
129
}
130
146
template
<
class
CoordType,
class
BSplines1,
class
BSplines2,
class
Layout,
class
MemorySpace>
147
KOKKOS_FUNCTION
double
operator()
(
148
CoordType
coord_extrap
,
149
ddc::ChunkSpan
<
150
double
const
,
151
ddc::DiscreteDomain<BSplines1, BSplines2>
,
152
Layout
,
153
MemorySpace
>
const
spline_coef
)
const
154
{
155
static_assert
(
156
in_tags_v<DimI, to_type_seq_t<CoordType>
>
157
&&
in_tags_v<DimNI, to_type_seq_t<CoordType>
>);
158
159
ddc::Coordinate<DimI, DimNI>
eval_pos
;
160
if
constexpr
(DimNI::PERIODIC) {
161
eval_pos
=
ddc::
162
Coordinate<DimI, DimNI>
(m_eval_pos,
ddc::Coordinate<DimNI>
(
coord_extrap
));
163
}
else
{
164
eval_pos
=
ddc::Coordinate<DimI, DimNI>
(
165
m_eval_pos,
166
Kokkos
::
167
clamp
(
ddc::Coordinate<DimNI>
(
coord_extrap
),
168
m_eval_pos_not_interest_min,
169
m_eval_pos_not_interest_max));
170
}
171
172
std::array<
double
, BSplines1::degree() + 1>
vals1_ptr
;
173
Kokkos::mdspan<
double
, Kokkos::extents<std::size_t, BSplines1::degree() + 1>>
const
vals1
(
174
vals1_ptr
.data());
175
std::array<
double
, BSplines2::degree() + 1>
vals2_ptr
;
176
Kokkos::mdspan<
double
, Kokkos::extents<std::size_t, BSplines2::degree() + 1>>
const
vals2
(
177
vals2_ptr
.data());
178
179
ddc::DiscreteElement<BSplines1>
const
idx1
=
ddc::discrete_space<BSplines1>
().eval_basis(
180
vals1
,
181
ddc::Coordinate<typename BSplines1::continuous_dimension_type>
(
eval_pos
));
182
ddc::DiscreteElement<BSplines2>
const
idx2
=
ddc::discrete_space<BSplines2>
().eval_basis(
183
vals2
,
184
ddc::Coordinate<typename BSplines2::continuous_dimension_type>
(
eval_pos
));
185
186
double
y
= 0.0;
187
for
(std::size_t
i
= 0;
i
< BSplines1::degree() + 1; ++
i
) {
188
for
(std::size_t
j
= 0;
j
< BSplines2::degree() + 1; ++
j
) {
189
y
+=
spline_coef
(
idx1
+
i
,
idx2
+
j
) *
vals1
[
i
] *
vals2
[
j
];
190
}
191
}
192
193
return
y
;
194
}
195
};
196
197
}
// namespace ddc
ddc::ChunkSpan
Definition
chunk_span.hpp:47
ddc::DiscreteDomain
Definition
discrete_domain.hpp:64
ddc::DiscreteElement
A DiscreteElement identifies an element of the discrete dimension.
Definition
discrete_element.hpp:161
ddc
The top-level namespace of DDC.
Definition
aligned_allocator.hpp:11
ddc::enable_chunk
constexpr bool enable_chunk
Definition
chunk_traits.hpp:16
ddc::Coordinate
detail::TaggedVector< CoordinateElement, CDims... > Coordinate
A Coordinate represents a coordinate in the continuous space.
Definition
coordinate.hpp:30
ddc::ConstantExtrapolationRule
Definition
constant_extrapolation_rule.hpp:19
ddc::ConstantExtrapolationRule< DimI, DimNI >::ConstantExtrapolationRule
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:103
ddc::ConstantExtrapolationRule< DimI, DimNI >::operator()
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:147
ddc::ConstantExtrapolationRule< DimI, DimNI >::ConstantExtrapolationRule
ConstantExtrapolationRule(ddc::Coordinate< DimI > eval_pos)
Instantiate a ConstantExtrapolationRule.
Definition
constant_extrapolation_rule.hpp:124
ddc::ConstantExtrapolationRule< DimI >::operator()
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:53
ddc::ConstantExtrapolationRule< DimI >::ConstantExtrapolationRule
ConstantExtrapolationRule(ddc::Coordinate< DimI > eval_pos)
Instantiate a ConstantExtrapolationRule.
Definition
constant_extrapolation_rule.hpp:42
src
ddc
kernels
splines
constant_extrapolation_rule.hpp
Generated by
1.9.8