DDC 0.0.0

a discrete domain computation library

non_uniform_point_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 <cstddef>
8#include <initializer_list>
9#include <ostream>
10#include <type_traits>
11#include <vector>
12
13#include <Kokkos_Core.hpp>
14
15#include "ddc/coordinate.hpp"
16#include "ddc/discrete_domain.hpp"
17#include "ddc/discrete_element.hpp"
18#include "ddc/discrete_space.hpp"
19#include "ddc/discrete_vector.hpp"
20
21namespace ddc {
22
23namespace detail {
24
25struct NonUniformPointSamplingBase
26{
27};
28
29} // namespace detail
30
32template <class CDim>
33class NonUniformPointSampling : detail::NonUniformPointSamplingBase
34{
35public:
37
39
40
42
43public:
44 template <class DDim, class MemorySpace>
45 class Impl
46 {
47 template <class ODDim, class OMemorySpace>
48 friend class Impl;
49
50 Kokkos::View<continuous_element_type*, MemorySpace> m_points;
51
52 public:
54
56
58
60
61 Impl() = default;
62
64 explicit Impl(std::initializer_list<continuous_element_type> points)
65 {
66 std::vector<continuous_element_type> host_points(points.begin(), points.end());
67 Kokkos::View<continuous_element_type*, Kokkos::HostSpace>
68 host(host_points.data(), host_points.size());
69 Kokkos::resize(m_points, host.extent(0));
70 Kokkos::deep_copy(m_points, host);
71 }
72
74 template <class InputRange>
75 explicit Impl(InputRange const& points)
76 {
77 if constexpr (Kokkos::is_view<InputRange>::value) {
78 Kokkos::deep_copy(m_points, points);
79 } else {
80 std::vector<continuous_element_type> host_points(points.begin(), points.end());
81 Kokkos::View<continuous_element_type*, Kokkos::HostSpace>
82 host(host_points.data(), host_points.size());
83 Kokkos::resize(m_points, host.extent(0));
84 Kokkos::deep_copy(m_points, host);
85 }
86 }
87
89 template <class InputIt>
91 {
92 std::vector<continuous_element_type> host_points(points_begin, points_end);
93 Kokkos::View<continuous_element_type*, Kokkos::HostSpace>
94 host(host_points.data(), host_points.size());
95 Kokkos::resize(m_points, host.extent(0));
96 Kokkos::deep_copy(m_points, host);
97 }
98
99 template <class OriginMemorySpace>
101 : m_points(Kokkos::create_mirror_view_and_copy(MemorySpace(), impl.m_points))
102 {
103 }
104
105 Impl(Impl const& x) = delete;
106
107 Impl(Impl&& x) = default;
108
109 ~Impl() = default;
110
111 KOKKOS_FUNCTION std::size_t size() const
112 {
113 return m_points.size();
114 }
115
119 {
120 return m_points(icoord.uid());
121 }
122 };
123};
124
125template <class DDim>
127 : public std::is_base_of<detail::NonUniformPointSamplingBase, DDim>
128{
129};
130
131template <class DDim>
133
134template <class DDim>
135using is_non_uniform_sampling [[deprecated("Use is_non_uniform_point_sampling instead")]]
137
138template <class DDim>
139[[deprecated(
140 "Use is_non_uniform_point_sampling_v instead")]] constexpr bool is_non_uniform_sampling_v
142
143template <
144 class DDimImpl,
145 std::enable_if_t<
147 int> = 0>
148std::ostream& operator<<(std::ostream& out, DDimImpl const& mesh)
149{
150 return out << "NonUniformPointSampling(" << mesh.size() << ")";
151}
152
153template <class DDim, std::enable_if_t<is_non_uniform_point_sampling_v<DDim>, int> = 0>
159
160template <class DDim, std::enable_if_t<is_non_uniform_point_sampling_v<DDim>, int> = 0>
166
167template <class DDim, std::enable_if_t<is_non_uniform_point_sampling_v<DDim>, int> = 0>
173
174template <class DDim, std::enable_if_t<is_non_uniform_point_sampling_v<DDim>, int> = 0>
180
181template <class DDim, std::enable_if_t<is_non_uniform_point_sampling_v<DDim>, int> = 0>
187
188template <class DDim, std::enable_if_t<is_non_uniform_point_sampling_v<DDim>, int> = 0>
194
195} // namespace ddc
Definition discrete_domain.hpp:51
A DiscreteVector is a vector in the discrete dimension.
Definition discrete_vector.hpp:254
Definition non_uniform_point_sampling.hpp:46
KOKKOS_FUNCTION std::size_t size() const
Definition non_uniform_point_sampling.hpp:111
KOKKOS_FUNCTION continuous_element_type coordinate(discrete_element_type const &icoord) const noexcept
Convert a mesh index into a position in CDim
Definition non_uniform_point_sampling.hpp:118
Impl(Impl< DDim, OriginMemorySpace > const &impl)
Definition non_uniform_point_sampling.hpp:100
Impl(std::initializer_list< continuous_element_type > points)
Construct a NonUniformPointSampling using a brace-list, i.e. NonUniformPointSampling mesh({0....
Definition non_uniform_point_sampling.hpp:64
Impl(InputRange const &points)
Construct a NonUniformPointSampling using a C++20 "common range".
Definition non_uniform_point_sampling.hpp:75
Impl(InputIt points_begin, InputIt points_end)
Construct a NonUniformPointSampling using a pair of iterators.
Definition non_uniform_point_sampling.hpp:90
NonUniformPointSampling models a non-uniform discretization of the CDim segment .
Definition non_uniform_point_sampling.hpp:34
CDim continuous_dimension_type
Definition non_uniform_point_sampling.hpp:36
Coordinate< CDim > continuous_element_type
Definition non_uniform_point_sampling.hpp:38
The top-level namespace of DDC.
Definition aligned_allocator.hpp:11
constexpr bool is_non_uniform_point_sampling_v
Definition non_uniform_point_sampling.hpp:132
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
auto create_mirror_view_and_copy(Space const &space, ChunkSpan< ElementType, Support, Layout, MemorySpace > const &src)
If src is accessible from space then returns a copy of src, otherwise returns a new Chunk with the sa...
Definition create_mirror.hpp:101
std::ostream & operator<<(std::ostream &out, DiscreteElement<> const &)
Definition discrete_element.hpp:319
constexpr bool is_non_uniform_sampling_v
Definition non_uniform_point_sampling.hpp:141
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
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 non_uniform_point_sampling.hpp:128