DDC 0.0.0

a discrete domain computation library

periodic_sampling.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 <cassert>
8#include <cstddef>
9#include <ostream>
10#include <tuple>
11#include <type_traits>
12#include <utility>
13
14#include <Kokkos_Core.hpp>
15
16#include "ddc/coordinate.hpp"
17#include "ddc/discrete_domain.hpp"
18#include "ddc/discrete_element.hpp"
19#include "ddc/discrete_space.hpp"
20#include "ddc/discrete_vector.hpp"
21#include "ddc/real_type.hpp"
22
23namespace ddc {
24
25namespace detail {
26
27struct PeriodicSamplingBase
28{
29};
30
31} // namespace detail
32
35template <class CDim>
36class PeriodicSampling : detail::PeriodicSamplingBase
37{
38public:
40
42
43
45
46public:
47 template <class DDim, class MemorySpace>
48 class Impl
49 {
50 template <class ODDim, class OMemorySpace>
51 friend class Impl;
52
53 private:
54 continuous_element_type m_origin {0};
55
56 Real m_step {1};
57
58 std::size_t m_n_period {2};
59
60 public:
62
64
66
68
69 Impl() = default;
70
71 Impl(Impl const&) = delete;
72
73 template <class OriginMemorySpace>
75 : m_origin(impl.m_origin)
76 , m_step(impl.m_step)
77 , m_n_period(impl.m_n_period)
78 {
79 }
80
81 Impl(Impl&&) = default;
82
90 : m_origin(origin)
91 , m_step(step)
92 , m_n_period(n_period)
93 {
94 assert(step > 0);
95 assert(n_period > 0);
96 }
97
98 ~Impl() = default;
99
102 {
103 return m_origin;
104 }
105
111
114 {
115 return m_step;
116 }
117
119 KOKKOS_FUNCTION std::size_t n_period() const
120 {
121 return m_n_period;
122 }
123
127 {
128 return m_origin
130 static_cast<int>((icoord.uid() + m_n_period / 2 - 1) % m_n_period)
131 - static_cast<int>(m_n_period / 2 - 1))
132 * m_step;
133 }
134 };
135
144 template <class DDim>
145 static std::tuple<typename DDim::template Impl<DDim, Kokkos::HostSpace>, DiscreteDomain<DDim>>
149 DiscreteVector<DDim> n_period)
150 {
151 assert(a < b);
152 assert(n > 1);
153 assert(n_period > 1);
154 typename DDim::template Impl<DDim, Kokkos::HostSpace>
155 disc(a, Coordinate<CDim> {(b - a) / (n - 1)}, n_period);
156 DiscreteDomain<DDim> domain {disc.front(), n};
157 return std::make_tuple(std::move(disc), std::move(domain));
158 }
159
170 template <class DDim>
171 std::tuple<
181 DiscreteVector<DDim> n_period,
184 {
185 using discrete_domain_type = DiscreteDomain<DDim>;
186 assert(a < b);
187 assert(n > 1);
188 assert(n_period > 1);
189 Real discretization_step {(b - a) / (n - 1)};
193 n_period);
194 discrete_domain_type ghosted_domain
195 = discrete_domain_type(disc.front(), n + n_ghosts_before + n_ghosts_after);
196 discrete_domain_type pre_ghost
197 = discrete_domain_type(ghosted_domain.front(), n_ghosts_before);
198 discrete_domain_type main_domain
199 = discrete_domain_type(ghosted_domain.front() + n_ghosts_before, n);
200 discrete_domain_type post_ghost
201 = discrete_domain_type(main_domain.back() + 1, n_ghosts_after);
202 return std::make_tuple(
203 std::move(disc),
204 std::move(main_domain),
205 std::move(ghosted_domain),
206 std::move(pre_ghost),
207 std::move(post_ghost));
208 }
209
219 template <class DDim>
220 std::tuple<
235};
236
237template <class DDim>
238struct is_periodic_sampling : public std::is_base_of<detail::PeriodicSamplingBase, DDim>
239{
240};
241
242template <class DDim>
244
245template <
246 class DDimImpl,
247 std::enable_if_t<
249 int> = 0>
250std::ostream& operator<<(std::ostream& out, DDimImpl const& mesh)
251{
252 return out << "PeriodicSampling( origin=" << mesh.origin() << ", step=" << mesh.step() << " )";
253}
254
256template <class DDim>
257KOKKOS_FUNCTION std::enable_if_t<
261{
262 return discrete_space<DDim>().origin();
263}
264
266template <class DDim>
267KOKKOS_FUNCTION std::enable_if_t<is_periodic_sampling_v<DDim>, DiscreteElement<DDim>>
269{
270 return discrete_space<DDim>().front();
271}
272
274template <class DDim>
275KOKKOS_FUNCTION std::enable_if_t<is_periodic_sampling_v<DDim>, Real> step() noexcept
276{
277 return discrete_space<DDim>().step();
278}
279
280template <class DDim, std::enable_if_t<is_periodic_sampling_v<DDim>, int> = 0>
282 DiscreteElement<DDim> const& c)
283{
284 return discrete_space<DDim>().coordinate(c);
285}
286
287template <class DDim, std::enable_if_t<is_periodic_sampling_v<DDim>, int> = 0>
289 DiscreteElement<DDim>)
290{
292}
293
294template <class DDim, std::enable_if_t<is_periodic_sampling_v<DDim>, int> = 0>
296 DiscreteElement<DDim>)
297{
299}
300
301template <class DDim, std::enable_if_t<is_periodic_sampling_v<DDim>, int> = 0>
303 DiscreteDomain<DDim> const& d)
304{
305 return coordinate(d.front());
306}
307
308template <class DDim, std::enable_if_t<is_periodic_sampling_v<DDim>, int> = 0>
310 DiscreteDomain<DDim> const& d)
311{
312 return coordinate(d.back());
313}
314
315template <class DDim, std::enable_if_t<is_periodic_sampling_v<DDim>, int> = 0>
317 DiscreteDomain<DDim> const& d)
318{
319 return rmax(d) - rmin(d);
320}
321
322} // namespace ddc
Definition discrete_domain.hpp:51
KOKKOS_FUNCTION constexpr discrete_element_type front() const noexcept
Definition discrete_domain.hpp:154
A DiscreteVector is a vector in the discrete dimension.
Definition discrete_vector.hpp:254
Definition periodic_sampling.hpp:49
Impl(continuous_element_type origin, Real step, std::size_t n_period)
Construct a Impl from a point and a spacing step.
Definition periodic_sampling.hpp:89
KOKKOS_FUNCTION discrete_element_type front() const noexcept
Lower bound index of the mesh.
Definition periodic_sampling.hpp:107
Impl(Impl const &)=delete
KOKKOS_FUNCTION std::size_t n_period() const
Number of steps in a period.
Definition periodic_sampling.hpp:119
KOKKOS_FUNCTION continuous_element_type origin() const noexcept
Lower bound index of the mesh.
Definition periodic_sampling.hpp:101
KOKKOS_FUNCTION continuous_element_type coordinate(discrete_element_type const &icoord) const noexcept
Convert a mesh index into a position in CDim
Definition periodic_sampling.hpp:126
Impl(Impl< DDim, OriginMemorySpace > const &impl)
Definition periodic_sampling.hpp:74
KOKKOS_FUNCTION Real step() const
Spacing step of the mesh.
Definition periodic_sampling.hpp:113
PeriodicSampling models a periodic discretization of the provided continuous dimension.
Definition periodic_sampling.hpp:37
std::tuple< Impl< DDim, Kokkos::HostSpace >, DiscreteDomain< DDim >, DiscreteDomain< DDim >, DiscreteDomain< DDim >, DiscreteDomain< DDim > > init_ghosted(continuous_element_type a, continuous_element_type b, DiscreteVector< DDim > n, DiscreteVector< DDim > n_period, DiscreteVector< DDim > n_ghosts)
Construct a periodic DiscreteDomain from a segment and a number of points n.
Definition periodic_sampling.hpp:226
static std::tuple< typename DDim::template Impl< DDim, Kokkos::HostSpace >, DiscreteDomain< DDim > > init(Coordinate< CDim > a, Coordinate< CDim > b, DiscreteVector< DDim > n, DiscreteVector< DDim > n_period)
Construct a Impl<Kokkos::HostSpace> and associated discrete_domain_type from a segment and a number ...
Definition periodic_sampling.hpp:146
std::tuple< Impl< DDim, Kokkos::HostSpace >, DiscreteDomain< DDim >, DiscreteDomain< DDim >, DiscreteDomain< DDim >, DiscreteDomain< DDim > > init_ghosted(continuous_element_type a, continuous_element_type b, DiscreteVector< DDim > n, DiscreteVector< DDim > n_period, DiscreteVector< DDim > n_ghosts_before, DiscreteVector< DDim > n_ghosts_after)
Construct a periodic DiscreteDomain from a segment and a number of points n.
Definition periodic_sampling.hpp:177
Coordinate< CDim > continuous_element_type
Definition periodic_sampling.hpp:41
CDim continuous_dimension_type
Definition periodic_sampling.hpp:39
The top-level namespace of DDC.
Definition aligned_allocator.hpp:11
KOKKOS_FUNCTION std::enable_if_t< is_periodic_sampling_v< DDim >, Real > step() noexcept
Spacing step of the mesh.
Definition periodic_sampling.hpp:275
KOKKOS_FUNCTION std::enable_if_t< is_periodic_sampling_v< DDim >, Coordinate< typename DDim::continuous_dimension_type > > origin() noexcept
Lower bound index of the mesh.
Definition periodic_sampling.hpp:260
constexpr bool enable_chunk
Definition chunk_traits.hpp:16
KOKKOS_FUNCTION Coordinate< typename DDim::continuous_dimension_type > rmax(DiscreteDomain< DDim > const &d)
Definition non_uniform_point_sampling.hpp:182
KOKKOS_FUNCTION Coordinate< typename DDim::continuous_dimension_type... > coordinate(DiscreteElement< DDim... > const &c)
Definition coordinate.hpp:29
std::ostream & operator<<(std::ostream &out, DiscreteElement<> const &)
Definition discrete_element.hpp:319
KOKKOS_FUNCTION Coordinate< typename DDim::continuous_dimension_type > rlength(DiscreteDomain< DDim > const &d)
Definition non_uniform_point_sampling.hpp:189
KOKKOS_FUNCTION Coordinate< typename DDim::continuous_dimension_type > distance_at_left(DiscreteElement< DDim > i)
Definition non_uniform_point_sampling.hpp:161
KOKKOS_FUNCTION Coordinate< typename DDim::continuous_dimension_type > rmin(DiscreteDomain< DDim > const &d)
Definition non_uniform_point_sampling.hpp:175
float Real
Definition real_type.hpp:15
constexpr bool is_periodic_sampling_v
Definition periodic_sampling.hpp:243
KOKKOS_FUNCTION std::enable_if_t< is_periodic_sampling_v< DDim >, DiscreteElement< DDim > > front() noexcept
Lower bound index of the mesh.
Definition periodic_sampling.hpp:268
detail::TaggedVector< CoordinateElement, CDims... > Coordinate
A Coordinate represents a coordinate in the continuous space.
Definition coordinate.hpp:26
KOKKOS_FUNCTION Coordinate< typename DDim::continuous_dimension_type > distance_at_right(DiscreteElement< DDim > i)
Definition non_uniform_point_sampling.hpp:168
Definition periodic_sampling.hpp:239