DDC
0.0.0
a
d
iscrete
d
omain
c
omputation library
About
Commented example
API reference
Contribute on Github
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
9
namespace
ddc
{
10
11
template
<
class
DimI
,
class
...
Dim
>
12
struct
ConstantExtrapolationRule
13
{
14
};
15
22
template
<
class
DimI>
23
struct
ConstantExtrapolationRule
<
DimI
>
24
{
25
private
:
26
ddc::Coordinate<DimI>
m_eval_pos;
27
28
public
:
37
explicit
ConstantExtrapolationRule
(
ddc::Coordinate<DimI>
eval_pos
) : m_eval_pos(
eval_pos
) {}
38
49
template
<
class
CoordType,
class
BSplines,
class
Layout,
class
MemorySpace>
50
KOKKOS_FUNCTION
double
operator()
(
51
[[
maybe_unused
]]
CoordType
pos
,
52
ddc::ChunkSpan
<
double
const
,
ddc::DiscreteDomain<BSplines>
,
Layout
,
MemorySpace
>
const
53
spline_coef
)
const
54
{
55
static_assert
(
in_tags_v<DimI, to_type_seq_t<CoordType>
>);
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
63
ddc::DiscreteElement<BSplines>
idx
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
80
template
<
class
DimI,
class
DimNI>
81
struct
ConstantExtrapolationRule
<
DimI
,
DimNI
>
82
{
83
private
:
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
88
public
:
106
explicit
ConstantExtrapolationRule
(
107
ddc::Coordinate<DimI>
eval_pos
,
108
ddc::Coordinate<DimNI>
eval_pos_not_interest_min
,
109
ddc::Coordinate<DimNI>
eval_pos_not_interest_max
)
110
: m_eval_pos(
eval_pos
)
111
, m_eval_pos_not_interest_min(
eval_pos_not_interest_min
)
112
, m_eval_pos_not_interest_max(
eval_pos_not_interest_max
)
113
{
114
}
115
128
template
<
class
DimNI_sfinae = DimNI, std::enable_if_t<DimNI_sfinae::PERIODIC,
int
> = 0>
129
explicit
ConstantExtrapolationRule
(
ddc::Coordinate<DimI>
eval_pos
)
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>
154
KOKKOS_FUNCTION
double
operator()
(
155
CoordType
coord_extrap
,
156
ddc::ChunkSpan
<
157
double
const
,
158
ddc::DiscreteDomain<BSplines1, BSplines2>
,
159
Layout
,
160
MemorySpace
>
const
spline_coef
)
const
161
{
162
static_assert
(
163
in_tags_v
<
164
DimI
,
165
to_type_seq_t<CoordType>
> &&
in_tags_v<DimNI, to_type_seq_t<CoordType>
>);
166
167
ddc::Coordinate<DimI, DimNI>
eval_pos
;
168
if
constexpr
(DimNI::PERIODIC) {
169
eval_pos
=
ddc::Coordinate<DimI, DimNI>
(m_eval_pos,
ddc::select<DimNI>
(
coord_extrap
));
170
}
else
{
171
eval_pos
=
ddc::Coordinate<DimI, DimNI>
(
172
m_eval_pos,
173
Kokkos
::
174
clamp
(
ddc::select<DimNI>
(
coord_extrap
),
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
190
ddc::DiscreteElement<BSplines1>
idx1
191
=
ddc::discrete_space<BSplines1>
()
192
.eval_basis(
vals1
,
ddc::select<typename BSplines1::tag_type>
(
eval_pos
));
193
ddc::DiscreteElement<BSplines2>
idx2
194
=
ddc::discrete_space<BSplines2>
()
195
.eval_basis(
vals2
,
ddc::select<typename BSplines2::tag_type>
(
eval_pos
));
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
ddc::DiscreteDomain
Definition
discrete_domain.hpp:51
ddc::DiscreteElement
A DiscreteElement identifies an element of the discrete dimension.
Definition
discrete_element.hpp:146
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:26
ddc::ChunkSpan
Definition
chunk_span.hpp:30
ddc::ConstantExtrapolationRule
Definition
constant_extrapolation_rule.hpp:13
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:106
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:154
ddc::ConstantExtrapolationRule< DimI, DimNI >::ConstantExtrapolationRule
ConstantExtrapolationRule(ddc::Coordinate< DimI > eval_pos)
Instantiate a ConstantExtrapolationRule.
Definition
constant_extrapolation_rule.hpp:129
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:50
ddc::ConstantExtrapolationRule< DimI >::ConstantExtrapolationRule
ConstantExtrapolationRule(ddc::Coordinate< DimI > eval_pos)
Instantiate a ConstantExtrapolationRule.
Definition
constant_extrapolation_rule.hpp:37