DDC 0.12.0
Loading...
Searching...
No Matches
strided_discrete_domain.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 <iterator>
9#include <tuple>
10#include <type_traits>
11
12#include <Kokkos_Assert.hpp>
13#include <Kokkos_Macros.hpp>
14
15#include "detail/type_seq.hpp"
16
19
20namespace ddc {
21
22template <class DDim>
24
25template <class... DDims>
27
28template <class T>
29struct is_strided_discrete_domain : std::false_type
30{
31};
32
33template <class... Tags>
34struct is_strided_discrete_domain<StridedDiscreteDomain<Tags...>> : std::true_type
35{
36};
37
38template <class T>
40
41namespace concepts {
42
43template <class T>
44concept strided_discrete_domain = is_strided_discrete_domain_v<T>;
45
46}
47
48namespace detail {
49
50template <class... Tags>
51struct ToTypeSeq<StridedDiscreteDomain<Tags...>>
52{
53 using type = TypeSeq<Tags...>;
54};
55
56template <class T, class U>
57struct RebindDomain;
58
59template <class... DDims, class... ODDims>
60struct RebindDomain<StridedDiscreteDomain<DDims...>, detail::TypeSeq<ODDims...>>
61{
62 using type = StridedDiscreteDomain<ODDims...>;
63};
64
65} // namespace detail
66
67template <class... ODDims>
68KOKKOS_FUNCTION DiscreteVector<ODDims...> prod(
69 DiscreteVector<ODDims...> const& lhs,
70 DiscreteVector<ODDims...> const& rhs) noexcept
71{
72 return DiscreteVector<ODDims...>((get<ODDims>(lhs) * get<ODDims>(rhs))...);
73}
74
75template <class... DDims>
77{
78 template <class...>
79 friend class StridedDiscreteDomain;
80
81 static_assert(
82 type_seq_is_unique_v<detail::TypeSeq<DDims...>>,
83 "The dimensions of a StridedDiscreteDomain must be unique");
84
85public:
86 using discrete_element_type = DiscreteElement<DDims...>;
87
88 using discrete_vector_type = DiscreteVector<DDims...>;
89
90private:
91 DiscreteElement<DDims...> m_element_begin;
92
93 DiscreteVector<DDims...> m_extents;
94
95 DiscreteVector<DDims...> m_strides;
96
97public:
98 static KOKKOS_FUNCTION constexpr std::size_t rank()
99 {
100 return sizeof...(DDims);
101 }
102
103 KOKKOS_DEFAULTED_FUNCTION StridedDiscreteDomain() = default;
104
105 /// Construct a StridedDiscreteDomain by copies and merge of domains
106 template <concepts::strided_discrete_domain... DDoms>
107 KOKKOS_FUNCTION constexpr explicit StridedDiscreteDomain(DDoms const&... domains)
108 : m_element_begin(domains.front()...)
109 , m_extents(domains.extents()...)
110 , m_strides(domains.strides()...)
111 {
112 }
113
114 /** Construct a StridedDiscreteDomain starting from element_begin with size points.
115 * @param element_begin the lower bound in each direction
116 * @param extents the number of points in each direction
117 * @param strides the step between two elements
118 */
119 KOKKOS_FUNCTION constexpr StridedDiscreteDomain(
120 discrete_element_type const& element_begin,
121 discrete_vector_type const& extents,
122 discrete_vector_type const& strides)
123 : m_element_begin(element_begin)
124 , m_extents(extents)
125 , m_strides(strides)
126 {
127 }
128
129 KOKKOS_DEFAULTED_FUNCTION StridedDiscreteDomain(StridedDiscreteDomain const& x) = default;
130
131 KOKKOS_DEFAULTED_FUNCTION StridedDiscreteDomain(StridedDiscreteDomain&& x) = default;
132
133 KOKKOS_DEFAULTED_FUNCTION ~StridedDiscreteDomain() = default;
134
135 KOKKOS_DEFAULTED_FUNCTION StridedDiscreteDomain& operator=(StridedDiscreteDomain const& x)
136 = default;
137
138 KOKKOS_DEFAULTED_FUNCTION StridedDiscreteDomain& operator=(StridedDiscreteDomain&& x) = default;
139
140 template <class... ODims>
141 KOKKOS_FUNCTION constexpr bool operator==(StridedDiscreteDomain<ODims...> const& other) const
142 {
143 if (empty() && other.empty()) {
144 return true;
145 }
146 return m_element_begin == other.m_element_begin && m_extents == other.m_extents
147 && m_strides == other.m_strides;
148 }
149
150#if !defined(__cpp_impl_three_way_comparison) || __cpp_impl_three_way_comparison < 201902L
151 // In C++20, `a!=b` shall be automatically translated by the compiler to `!(a==b)`
152 template <class... ODims>
153 KOKKOS_FUNCTION constexpr bool operator!=(StridedDiscreteDomain<ODims...> const& other) const
154 {
155 return !(*this == other);
156 }
157#endif
158
159 KOKKOS_FUNCTION constexpr std::size_t size() const
160 {
161 return (1UL * ... * get<DDims>(m_extents));
162 }
163
164 KOKKOS_FUNCTION constexpr discrete_vector_type extents() const noexcept
165 {
166 return m_extents;
167 }
168
169 KOKKOS_FUNCTION constexpr discrete_vector_type strides() const noexcept
170 {
171 return m_strides;
172 }
173
174 template <class QueryDDim>
175 KOKKOS_FUNCTION constexpr DiscreteVector<QueryDDim> extent() const noexcept
176 {
177 return DiscreteVector<QueryDDim>(m_extents);
178 }
179
180 KOKKOS_FUNCTION constexpr discrete_element_type front() const noexcept
181 {
182 return m_element_begin;
183 }
184
185 KOKKOS_FUNCTION constexpr discrete_element_type back() const noexcept
186 {
187 return discrete_element_type(
188 (DiscreteElement<DDims>(m_element_begin)
189 + (get<DDims>(m_extents) - 1) * get<DDims>(m_strides))...);
190 }
191
192 KOKKOS_FUNCTION constexpr StridedDiscreteDomain take_first(discrete_vector_type n) const
193 {
194 return StridedDiscreteDomain(front(), n, m_strides);
195 }
196
197 KOKKOS_FUNCTION constexpr StridedDiscreteDomain take_last(discrete_vector_type n) const
198 {
199 return StridedDiscreteDomain(front() + prod(extents() - n, m_strides), n, m_strides);
200 }
201
202 KOKKOS_FUNCTION constexpr StridedDiscreteDomain remove_first(discrete_vector_type n) const
203 {
204 return StridedDiscreteDomain(front() + prod(n, m_strides), extents() - n, m_strides);
205 }
206
207 KOKKOS_FUNCTION constexpr StridedDiscreteDomain remove_last(discrete_vector_type n) const
208 {
209 return StridedDiscreteDomain(front(), extents() - n, m_strides);
210 }
211
212 KOKKOS_FUNCTION constexpr StridedDiscreteDomain remove(
213 discrete_vector_type n1,
214 discrete_vector_type n2) const
215 {
216 return StridedDiscreteDomain(front() + prod(n1, m_strides), extents() - n1 - n2, m_strides);
217 }
218
219 KOKKOS_FUNCTION constexpr DiscreteElement<DDims...> operator()(
220 DiscreteVector<DDims...> const& dvect) const noexcept
221 {
222 return m_element_begin + prod(dvect, m_strides);
223 }
224
225 template <class... DElems>
226 KOKKOS_FUNCTION bool contains(DElems const&... delems) const noexcept
227 {
228 static_assert(
229 sizeof...(DDims) == (0 + ... + DElems::size()),
230 "Invalid number of dimensions");
231 static_assert((is_discrete_element_v<DElems> && ...), "Expected DiscreteElements");
232 auto const contains_1d = [](DiscreteElementType const i,
233 DiscreteElementType const b,
234 DiscreteVectorElement const n,
235 DiscreteVectorElement const s) {
236 return (i >= b) && (i < (b + (n - 1) * s + 1)) && ((i - b) % s == 0);
237 };
238 DiscreteElement<DDims...> const delem(delems...);
239 for (std::size_t i = 0; i < rank(); ++i) {
240 if (!contains_1d(
241 detail::array(delem)[i],
242 detail::array(m_element_begin)[i],
243 detail::array(m_extents)[i],
244 detail::array(m_strides)[i])) {
245 return false;
246 }
247 }
248 return true;
249 }
250
251 template <class... DElems>
252 KOKKOS_FUNCTION DiscreteVector<DDims...> distance_from_front(
253 DElems const&... delems) const noexcept
254 {
255 static_assert(
256 sizeof...(DDims) == (0 + ... + DElems::size()),
257 "Invalid number of dimensions");
258 static_assert((is_discrete_element_v<DElems> && ...), "Expected DiscreteElements");
259 KOKKOS_ASSERT(contains(delems...))
260 return DiscreteVector<DDims...>(
261 ((DiscreteElement<DDims>(take<DDims>(delems...))
262 - DiscreteElement<DDims>(m_element_begin))
263 / DiscreteVector<DDims>(m_strides))...);
264 }
265
266 KOKKOS_FUNCTION constexpr bool empty() const noexcept
267 {
268 return size() == 0;
269 }
270
271 KOKKOS_FUNCTION constexpr explicit operator bool()
272 {
273 return !empty();
274 }
275
276 KOKKOS_FUNCTION auto begin() const
277 requires(sizeof...(DDims) == 1)
278 {
280 std::tuple_element_t<0, std::tuple<DDims...>>>(front(), m_strides);
281 }
282
283 KOKKOS_FUNCTION auto end() const
284 requires(sizeof...(DDims) == 1)
285 {
286 return StridedDiscreteDomainIterator<std::tuple_element_t<
287 0,
288 std::tuple<DDims...>>>(m_element_begin + m_extents * m_strides, m_strides);
289 }
290
291 KOKKOS_FUNCTION auto cbegin() const
292 requires(sizeof...(DDims) == 1)
293 {
295 std::tuple_element_t<0, std::tuple<DDims...>>>(front(), m_strides);
296 }
297
298 KOKKOS_FUNCTION auto cend() const
299 requires(sizeof...(DDims) == 1)
300 {
301 return StridedDiscreteDomainIterator<std::tuple_element_t<
302 0,
303 std::tuple<DDims...>>>(m_element_begin + m_extents * m_strides, m_strides);
304 }
305
306 KOKKOS_FUNCTION constexpr decltype(auto) operator[](std::size_t n)
307 requires(sizeof...(DDims) == 1)
308 {
309 return begin()[n];
310 }
311
312 KOKKOS_FUNCTION constexpr decltype(auto) operator[](std::size_t n) const
313 requires(sizeof...(DDims) == 1)
314 {
315 return begin()[n];
316 }
317};
318
319template <>
321{
322 template <class...>
323 friend class StridedDiscreteDomain;
324
325public:
326 using discrete_element_type = DiscreteElement<>;
327
328 using discrete_vector_type = DiscreteVector<>;
329
330 static KOKKOS_FUNCTION constexpr std::size_t rank()
331 {
332 return 0;
333 }
334
335 KOKKOS_DEFAULTED_FUNCTION constexpr StridedDiscreteDomain() = default;
336
337 // Construct a StridedDiscreteDomain from a reordered copy of `domain`
338 template <class... ODDims>
339 KOKKOS_FUNCTION constexpr explicit StridedDiscreteDomain(
340 StridedDiscreteDomain<ODDims...> const& /*domain*/)
341 {
342 }
343
344 /** Construct a StridedDiscreteDomain starting from element_begin with size points.
345 * @param element_begin the lower bound in each direction
346 * @param size the number of points in each direction
347 * @param strides the step between two elements
348 */
349 KOKKOS_FUNCTION constexpr StridedDiscreteDomain(
350 [[maybe_unused]] discrete_element_type const& element_begin,
351 [[maybe_unused]] discrete_vector_type const& size,
352 [[maybe_unused]] discrete_vector_type const& strides)
353 {
354 // Parameters `element_begin`, `size` and `strides` are truly unused
355 }
356
357 KOKKOS_DEFAULTED_FUNCTION StridedDiscreteDomain(StridedDiscreteDomain const& x) = default;
358
359 KOKKOS_DEFAULTED_FUNCTION StridedDiscreteDomain(StridedDiscreteDomain&& x) = default;
360
361 KOKKOS_DEFAULTED_FUNCTION ~StridedDiscreteDomain() = default;
362
363 KOKKOS_DEFAULTED_FUNCTION StridedDiscreteDomain& operator=(StridedDiscreteDomain const& x)
364 = default;
365
366 KOKKOS_DEFAULTED_FUNCTION StridedDiscreteDomain& operator=(StridedDiscreteDomain&& x) = default;
367
368 KOKKOS_FUNCTION constexpr bool operator==(StridedDiscreteDomain const& /*other*/) const
369 {
370 return true;
371 }
372
373#if !defined(__cpp_impl_three_way_comparison) || __cpp_impl_three_way_comparison < 201902L
374 // In C++20, `a!=b` shall be automatically translated by the compiler to `!(a==b)`
375 KOKKOS_FUNCTION constexpr bool operator!=(StridedDiscreteDomain const& other) const
376 {
377 return !(*this == other);
378 }
379#endif
380
381 static KOKKOS_FUNCTION constexpr std::size_t size()
382 {
383 return 1;
384 }
385
386 static KOKKOS_FUNCTION constexpr discrete_vector_type extents() noexcept
387 {
388 return {};
389 }
390
391 static KOKKOS_FUNCTION constexpr discrete_element_type front() noexcept
392 {
393 return {};
394 }
395
396 static KOKKOS_FUNCTION constexpr discrete_element_type back() noexcept
397 {
398 return {};
399 }
400
401 KOKKOS_FUNCTION constexpr StridedDiscreteDomain take_first(discrete_vector_type /*n*/) const
402 {
403 return *this;
404 }
405
406 KOKKOS_FUNCTION constexpr StridedDiscreteDomain take_last(discrete_vector_type /*n*/) const
407 {
408 return *this;
409 }
410
411 KOKKOS_FUNCTION constexpr StridedDiscreteDomain remove_first(discrete_vector_type /*n*/) const
412 {
413 return *this;
414 }
415
416 KOKKOS_FUNCTION constexpr StridedDiscreteDomain remove_last(discrete_vector_type /*n*/) const
417 {
418 return *this;
419 }
420
421 KOKKOS_FUNCTION constexpr StridedDiscreteDomain remove(
422 discrete_vector_type /*n1*/,
423 discrete_vector_type /*n2*/) const
424 {
425 return *this;
426 }
427
428 KOKKOS_FUNCTION constexpr DiscreteElement<> operator()(
429 DiscreteVector<> const& /*dvect*/) const noexcept
430 {
431 return {};
432 }
433
434 static KOKKOS_FUNCTION bool contains() noexcept
435 {
436 return true;
437 }
438
439 static KOKKOS_FUNCTION bool contains(DiscreteElement<>) noexcept
440 {
441 return true;
442 }
443
444 static KOKKOS_FUNCTION DiscreteVector<> distance_from_front() noexcept
445 {
446 return {};
447 }
448
449 static KOKKOS_FUNCTION DiscreteVector<> distance_from_front(DiscreteElement<>) noexcept
450 {
451 return {};
452 }
453
454 static KOKKOS_FUNCTION constexpr bool empty() noexcept
455 {
456 return false;
457 }
458
459 KOKKOS_FUNCTION constexpr explicit operator bool()
460 {
461 return true;
462 }
463};
464
465template <class... QueryDDims, class... DDims>
466KOKKOS_FUNCTION constexpr StridedDiscreteDomain<QueryDDims...> select(
467 StridedDiscreteDomain<DDims...> const& domain)
468{
469 return StridedDiscreteDomain<QueryDDims...>(domain);
470}
471
472namespace detail {
473
474template <class T>
475struct ConvertTypeSeqToStridedDiscreteDomain;
476
477template <class... DDims>
478struct ConvertTypeSeqToStridedDiscreteDomain<detail::TypeSeq<DDims...>>
479{
480 using type = StridedDiscreteDomain<DDims...>;
481};
482
483template <class T>
484using convert_type_seq_to_strided_discrete_domain_t =
485 typename ConvertTypeSeqToStridedDiscreteDomain<T>::type;
486
487} // namespace detail
488
489// Computes the subtraction DDom_a - DDom_b in the sense of linear spaces(retained dimensions are those in DDom_a which are not in DDom_b)
490template <class... DDimsA, class... DDimsB>
491KOKKOS_FUNCTION constexpr auto remove_dims_of(
492 StridedDiscreteDomain<DDimsA...> const& DDom_a,
493 StridedDiscreteDomain<DDimsB...> const& /*DDom_b*/) noexcept
494{
495 using TagSeqA = detail::TypeSeq<DDimsA...>;
496 using TagSeqB = detail::TypeSeq<DDimsB...>;
497
498 using type_seq_r = type_seq_remove_t<TagSeqA, TagSeqB>;
499 return detail::convert_type_seq_to_strided_discrete_domain_t<type_seq_r>(DDom_a);
500}
501
502//! Remove the dimensions DDimsB from DDom_a
503//! @param[in] DDom_a The discrete domain on which to remove dimensions
504//! @return The discrete domain without DDimsB dimensions
505template <class... DDimsB, class... DDimsA>
506KOKKOS_FUNCTION constexpr auto remove_dims_of(
507 StridedDiscreteDomain<DDimsA...> const& DDom_a) noexcept
508{
509 using TagSeqA = detail::TypeSeq<DDimsA...>;
510 using TagSeqB = detail::TypeSeq<DDimsB...>;
511
512 using type_seq_r = type_seq_remove_t<TagSeqA, TagSeqB>;
513 return detail::convert_type_seq_to_strided_discrete_domain_t<type_seq_r>(DDom_a);
514}
515
516namespace detail {
517
518// Checks if dimension of DDom_a is DDim1. If not, returns restriction to DDim2 of DDom_b. May not be useful in its own, it helps for replace_dim_of
519template <typename DDim1, typename DDim2, typename DDimA, typename... DDimsB>
520KOKKOS_FUNCTION constexpr std::conditional_t<
521 std::is_same_v<DDimA, DDim1>,
524replace_dim_of_1d(
525 [[maybe_unused]] StridedDiscreteDomain<DDimA> const& DDom_a,
526 [[maybe_unused]] StridedDiscreteDomain<DDimsB...> const& DDom_b) noexcept
527{
528 if constexpr (std::is_same_v<DDimA, DDim1>) {
529 return ddc::StridedDiscreteDomain<DDim2>(DDom_b);
530 } else {
531 return DDom_a;
532 }
533}
534
535} // namespace detail
536
537// Replace in DDom_a the dimension Dim1 by the dimension Dim2 of DDom_b
538template <typename DDim1, typename DDim2, typename... DDimsA, typename... DDimsB>
539KOKKOS_FUNCTION constexpr auto replace_dim_of(
540 StridedDiscreteDomain<DDimsA...> const& DDom_a,
541 [[maybe_unused]] StridedDiscreteDomain<DDimsB...> const& DDom_b) noexcept
542{
543 // TODO : static_asserts
544 using TagSeqA = detail::TypeSeq<DDimsA...>;
545 using TagSeqB = detail::TypeSeq<DDim1>;
546 using TagSeqC = detail::TypeSeq<DDim2>;
547
548 using type_seq_r = ddc::type_seq_replace_t<TagSeqA, TagSeqB, TagSeqC>;
549 return ddc::detail::convert_type_seq_to_strided_discrete_domain_t<type_seq_r>(
550 detail::replace_dim_of_1d<
551 DDim1,
552 DDim2,
553 DDimsA,
554 DDimsB...>(ddc::StridedDiscreteDomain<DDimsA>(DDom_a), DDom_b)...);
555}
556
557template <class... QueryDDims, class... DDims>
558KOKKOS_FUNCTION constexpr DiscreteVector<QueryDDims...> extents(
559 StridedDiscreteDomain<DDims...> const& domain) noexcept
560{
561 return DiscreteVector<QueryDDims...>(StridedDiscreteDomain<QueryDDims>(domain).size()...);
562}
563
564template <class... QueryDDims, class... DDims>
565KOKKOS_FUNCTION constexpr DiscreteElement<QueryDDims...> front(
566 StridedDiscreteDomain<DDims...> const& domain) noexcept
567{
568 return DiscreteElement<QueryDDims...>(StridedDiscreteDomain<QueryDDims>(domain).front()...);
569}
570
571template <class... QueryDDims, class... DDims>
572KOKKOS_FUNCTION constexpr DiscreteElement<QueryDDims...> back(
573 StridedDiscreteDomain<DDims...> const& domain) noexcept
574{
575 return DiscreteElement<QueryDDims...>(StridedDiscreteDomain<QueryDDims>(domain).back()...);
576}
577
578template <class DDim>
580{
581private:
582 DiscreteElement<DDim> m_value = DiscreteElement<DDim>();
583
584 DiscreteVector<DDim> m_stride = DiscreteVector<DDim>();
585
586public:
587 using iterator_category = std::random_access_iterator_tag;
588
589 using value_type = DiscreteElement<DDim>;
590
591 using difference_type = std::ptrdiff_t;
592
593 KOKKOS_DEFAULTED_FUNCTION StridedDiscreteDomainIterator() = default;
594
595 KOKKOS_FUNCTION constexpr explicit StridedDiscreteDomainIterator(
596 DiscreteElement<DDim> value,
597 DiscreteVector<DDim> stride)
598 : m_value(value)
599 , m_stride(stride)
600 {
601 }
602
603 KOKKOS_FUNCTION constexpr DiscreteElement<DDim> operator*() const noexcept
604 {
605 return m_value;
606 }
607
608 KOKKOS_FUNCTION constexpr StridedDiscreteDomainIterator& operator++()
609 {
610 m_value += m_stride;
611 return *this;
612 }
613
614 KOKKOS_FUNCTION constexpr StridedDiscreteDomainIterator operator++(int)
615 {
616 auto tmp = *this;
617 ++*this;
618 return tmp;
619 }
620
621 KOKKOS_FUNCTION constexpr StridedDiscreteDomainIterator& operator--()
622 {
623 m_value -= m_stride;
624 return *this;
625 }
626
627 KOKKOS_FUNCTION constexpr StridedDiscreteDomainIterator operator--(int)
628 {
629 auto tmp = *this;
630 --*this;
631 return tmp;
632 }
633
634 KOKKOS_FUNCTION constexpr StridedDiscreteDomainIterator& operator+=(difference_type n)
635 {
636 if (n >= static_cast<difference_type>(0)) {
637 m_value += static_cast<DiscreteElementType>(n) * m_stride;
638 } else {
639 m_value -= static_cast<DiscreteElementType>(-n) * m_stride;
640 }
641 return *this;
642 }
643
644 KOKKOS_FUNCTION constexpr StridedDiscreteDomainIterator& operator-=(difference_type n)
645 {
646 if (n >= static_cast<difference_type>(0)) {
647 m_value -= static_cast<DiscreteElementType>(n) * m_stride;
648 } else {
649 m_value += static_cast<DiscreteElementType>(-n) * m_stride;
650 }
651 return *this;
652 }
653
654 KOKKOS_FUNCTION constexpr DiscreteElement<DDim> operator[](difference_type n) const
655 {
656 return m_value + n * m_stride;
657 }
658
659 friend KOKKOS_FUNCTION constexpr bool operator==(
662 {
663 return xx.m_value == yy.m_value;
664 }
665
666#if !defined(__cpp_impl_three_way_comparison) || __cpp_impl_three_way_comparison < 201902L
667 // In C++20, `a!=b` shall be automatically translated by the compiler to `!(a==b)`
668 friend KOKKOS_FUNCTION constexpr bool operator!=(
671 {
672 return xx.m_value != yy.m_value;
673 }
674#endif
675
676 friend KOKKOS_FUNCTION constexpr bool operator<(
679 {
680 return xx.m_value < yy.m_value;
681 }
682
683 friend KOKKOS_FUNCTION constexpr bool operator>(
686 {
687 return yy < xx;
688 }
689
690 friend KOKKOS_FUNCTION constexpr bool operator<=(
693 {
694 return !(yy < xx);
695 }
696
697 friend KOKKOS_FUNCTION constexpr bool operator>=(
700 {
701 return !(xx < yy);
702 }
703
704 friend KOKKOS_FUNCTION constexpr StridedDiscreteDomainIterator operator+(
706 difference_type n)
707 {
708 return i += n;
709 }
710
711 friend KOKKOS_FUNCTION constexpr StridedDiscreteDomainIterator operator+(
712 difference_type n,
714 {
715 return i += n;
716 }
717
718 friend KOKKOS_FUNCTION constexpr StridedDiscreteDomainIterator operator-(
720 difference_type n)
721 {
722 return i -= n;
723 }
724
725 friend KOKKOS_FUNCTION constexpr difference_type operator-(
728 {
729 return (yy.m_value > xx.m_value) ? (-static_cast<difference_type>(yy.m_value - xx.m_value))
730 : (xx.m_value - yy.m_value);
731 }
732};
733
734} // namespace ddc
friend class DiscreteDomain
KOKKOS_DEFAULTED_FUNCTION constexpr DiscreteElement()=default
KOKKOS_FUNCTION constexpr bool operator!=(DiscreteVector< OTags... > const &rhs) const noexcept
KOKKOS_DEFAULTED_FUNCTION constexpr DiscreteVector()=default
KOKKOS_FUNCTION std::size_t size() const
KOKKOS_FUNCTION Coordinate< CDim > coordinate(discrete_element_type const &icoord) const noexcept
Convert a mesh index into a position in CDim
Impl(Impl< DDim, OriginMemorySpace > const &impl)
Impl & operator=(Impl &&x)=default
Impl & operator=(Impl const &x)=delete
Impl(InputIt const points_begin, InputIt const points_end)
Construct a NonUniformPointSampling using a pair of iterators.
KOKKOS_FUNCTION discrete_element_type front() const noexcept
Lower bound index of the mesh.
Impl(InputRange const &points)
Construct a NonUniformPointSampling using a C++20 "common range".
Impl(std::initializer_list< Coordinate< CDim > > const points)
Construct a NonUniformPointSampling using a brace-list, i.e. NonUniformPointSampling mesh({0....
NonUniformPointSampling models a non-uniform discretization of the CDim segment .
static std::tuple< typename DDim::template Impl< DDim, Kokkos::HostSpace >, DiscreteDomain< DDim > > init(InputRange const &non_uniform_points)
Construct an Impl<Kokkos::HostSpace> and associated discrete_domain_type from a range containing the ...
static std::tuple< typename DDim::template Impl< DDim, Kokkos::HostSpace >, DiscreteDomain< DDim >, DiscreteDomain< DDim >, DiscreteDomain< DDim >, DiscreteDomain< DDim > > init_ghosted(InputRange const &domain_r, InputRange const &pre_ghost_r, InputRange const &post_ghost_r)
Construct 4 non-uniform DiscreteDomain and an Impl<Kokkos::HostSpace> from 3 ranges containing the po...
Impl & operator=(Impl &&x)=default
KOKKOS_FUNCTION Coordinate< CDim > origin() const noexcept
Lower bound index of the mesh.
KOKKOS_FUNCTION discrete_element_type front() const noexcept
Lower bound index of the mesh.
KOKKOS_FUNCTION Coordinate< CDim > coordinate(discrete_element_type const &icoord) const noexcept
Convert a mesh index into a position in CDim
Impl(Impl const &)=delete
KOKKOS_FUNCTION std::size_t n_period() const
Number of steps in a period.
Impl(Impl< DDim, OriginMemorySpace > const &impl)
Impl(Coordinate< CDim > origin, Real step, std::size_t n_period)
Construct a Impl from a point and a spacing step.
KOKKOS_FUNCTION Real step() const
Spacing step of the mesh.
Impl & operator=(Impl const &x)=delete
PeriodicSampling models a periodic discretization of the provided continuous dimension.
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 ...
std::tuple< Impl< DDim, Kokkos::HostSpace >, DiscreteDomain< DDim >, DiscreteDomain< DDim >, DiscreteDomain< DDim >, DiscreteDomain< DDim > > init_ghosted(Coordinate< CDim > a, Coordinate< CDim > 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.
std::tuple< Impl< DDim, Kokkos::HostSpace >, DiscreteDomain< DDim >, DiscreteDomain< DDim >, DiscreteDomain< DDim >, DiscreteDomain< DDim > > init_ghosted(Coordinate< CDim > a, Coordinate< CDim > 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.
ScopeGuard & operator=(ScopeGuard const &x)=delete
~ScopeGuard() noexcept
ScopeGuard(ScopeGuard &&x) noexcept=delete
ScopeGuard & operator=(ScopeGuard &&x) noexcept=delete
ScopeGuard(int, char **&)
ScopeGuard(ScopeGuard const &x)=delete
static KOKKOS_FUNCTION bool contains(DiscreteElement<>) noexcept
KOKKOS_FUNCTION constexpr SparseDiscreteDomain remove(discrete_vector_type, discrete_vector_type) const
KOKKOS_FUNCTION constexpr SparseDiscreteDomain take_first(discrete_vector_type) const
static KOKKOS_FUNCTION constexpr std::size_t rank()
KOKKOS_DEFAULTED_FUNCTION constexpr SparseDiscreteDomain()=default
KOKKOS_FUNCTION constexpr DiscreteElement operator()(DiscreteVector<> const &) const noexcept
KOKKOS_FUNCTION constexpr SparseDiscreteDomain remove_last(discrete_vector_type) const
static KOKKOS_FUNCTION DiscreteVector distance_from_front() noexcept
static KOKKOS_FUNCTION constexpr std::size_t size()
static KOKKOS_FUNCTION constexpr bool empty() noexcept
static KOKKOS_FUNCTION DiscreteVector distance_from_front(DiscreteElement<>) noexcept
KOKKOS_FUNCTION constexpr bool operator==(SparseDiscreteDomain const &) const
static KOKKOS_FUNCTION constexpr discrete_element_type back() noexcept
static KOKKOS_FUNCTION bool contains() noexcept
KOKKOS_FUNCTION constexpr SparseDiscreteDomain take_last(discrete_vector_type) const
KOKKOS_FUNCTION constexpr operator bool()
KOKKOS_DEFAULTED_FUNCTION SparseDiscreteDomain & operator=(SparseDiscreteDomain const &x)=default
KOKKOS_DEFAULTED_FUNCTION SparseDiscreteDomain & operator=(SparseDiscreteDomain &&x)=default
KOKKOS_FUNCTION constexpr SparseDiscreteDomain remove_first(discrete_vector_type) const
KOKKOS_DEFAULTED_FUNCTION SparseDiscreteDomain(SparseDiscreteDomain const &x)=default
KOKKOS_DEFAULTED_FUNCTION ~SparseDiscreteDomain()=default
static KOKKOS_FUNCTION constexpr discrete_element_type front() noexcept
KOKKOS_FUNCTION constexpr SparseDiscreteDomain(SparseDiscreteDomain< ODDims... > const &)
static KOKKOS_FUNCTION constexpr discrete_vector_type extents() noexcept
KOKKOS_DEFAULTED_FUNCTION SparseDiscreteDomain(SparseDiscreteDomain &&x)=default
KOKKOS_FUNCTION constexpr discrete_element_type back() const noexcept
KOKKOS_FUNCTION constexpr SparseDiscreteDomain remove_first(discrete_vector_type n) const
static KOKKOS_FUNCTION constexpr std::size_t rank()
KOKKOS_DEFAULTED_FUNCTION SparseDiscreteDomain & operator=(SparseDiscreteDomain const &x)=default
KOKKOS_FUNCTION constexpr SparseDiscreteDomain take_last(discrete_vector_type n) const
KOKKOS_FUNCTION DiscreteVector< DDims... > distance_from_front(DElems const &... delems) const noexcept
KOKKOS_FUNCTION constexpr auto discrete_elements() const noexcept
KOKKOS_FUNCTION constexpr SparseDiscreteDomain remove(discrete_vector_type n1, discrete_vector_type n2) const
KOKKOS_FUNCTION constexpr decltype(auto) operator[](std::size_t n) const
SparseDiscreteDomain(Kokkos::View< DiscreteElement< DDims > *, Kokkos::SharedSpace > const &... views)
Construct a SparseDiscreteDomain with Kokkos::View explicitly listing the discrete elements.
KOKKOS_DEFAULTED_FUNCTION SparseDiscreteDomain & operator=(SparseDiscreteDomain &&x)=default
KOKKOS_FUNCTION constexpr std::size_t size() const
KOKKOS_FUNCTION constexpr bool operator==(SparseDiscreteDomain< ODims... > const &other) const
KOKKOS_FUNCTION bool contains(DElems const &... delems) const noexcept
KOKKOS_FUNCTION constexpr decltype(auto) operator[](std::size_t n)
KOKKOS_FUNCTION constexpr SparseDiscreteDomain take_first(discrete_vector_type n) const
KOKKOS_DEFAULTED_FUNCTION SparseDiscreteDomain()=default
KOKKOS_DEFAULTED_FUNCTION SparseDiscreteDomain(SparseDiscreteDomain &&x)=default
KOKKOS_FUNCTION constexpr discrete_element_type front() const noexcept
KOKKOS_FUNCTION constexpr operator bool()
KOKKOS_FUNCTION constexpr bool empty() const noexcept
KOKKOS_FUNCTION constexpr SparseDiscreteDomain(DDoms const &... domains)
Construct a SparseDiscreteDomain by copies and merge of domains.
KOKKOS_FUNCTION constexpr DiscreteElement< DDims... > operator()(DiscreteVector< DDims... > const &dvect) const noexcept
KOKKOS_DEFAULTED_FUNCTION SparseDiscreteDomain(SparseDiscreteDomain const &x)=default
KOKKOS_FUNCTION constexpr SparseDiscreteDomain remove_last(discrete_vector_type n) const
KOKKOS_FUNCTION constexpr discrete_vector_type extents() const noexcept
KOKKOS_FUNCTION constexpr DiscreteVector< QueryDDim > extent() const noexcept
KOKKOS_DEFAULTED_FUNCTION ~SparseDiscreteDomain()=default
static KOKKOS_FUNCTION DiscreteVector distance_from_front() noexcept
KOKKOS_DEFAULTED_FUNCTION StridedDiscreteDomain & operator=(StridedDiscreteDomain &&x)=default
KOKKOS_FUNCTION constexpr StridedDiscreteDomain take_first(discrete_vector_type) const
static KOKKOS_FUNCTION constexpr std::size_t size()
KOKKOS_FUNCTION constexpr StridedDiscreteDomain(discrete_element_type const &element_begin, discrete_vector_type const &size, discrete_vector_type const &strides)
Construct a StridedDiscreteDomain starting from element_begin with size points.
KOKKOS_FUNCTION constexpr StridedDiscreteDomain remove(discrete_vector_type, discrete_vector_type) const
static KOKKOS_FUNCTION bool contains(DiscreteElement<>) noexcept
static KOKKOS_FUNCTION constexpr discrete_element_type front() noexcept
KOKKOS_FUNCTION constexpr StridedDiscreteDomain take_last(discrete_vector_type) const
KOKKOS_FUNCTION constexpr bool operator==(StridedDiscreteDomain const &) const
KOKKOS_FUNCTION constexpr StridedDiscreteDomain remove_first(discrete_vector_type) const
static KOKKOS_FUNCTION bool contains() noexcept
KOKKOS_FUNCTION constexpr StridedDiscreteDomain remove_last(discrete_vector_type) const
static KOKKOS_FUNCTION constexpr discrete_vector_type extents() noexcept
static KOKKOS_FUNCTION constexpr std::size_t rank()
KOKKOS_DEFAULTED_FUNCTION StridedDiscreteDomain(StridedDiscreteDomain &&x)=default
static KOKKOS_FUNCTION DiscreteVector distance_from_front(DiscreteElement<>) noexcept
KOKKOS_DEFAULTED_FUNCTION constexpr StridedDiscreteDomain()=default
KOKKOS_FUNCTION constexpr operator bool()
static KOKKOS_FUNCTION constexpr bool empty() noexcept
KOKKOS_DEFAULTED_FUNCTION StridedDiscreteDomain(StridedDiscreteDomain const &x)=default
KOKKOS_FUNCTION constexpr DiscreteElement operator()(DiscreteVector<> const &) const noexcept
static KOKKOS_FUNCTION constexpr discrete_element_type back() noexcept
KOKKOS_FUNCTION constexpr StridedDiscreteDomain(StridedDiscreteDomain< ODDims... > const &)
KOKKOS_DEFAULTED_FUNCTION ~StridedDiscreteDomain()=default
KOKKOS_DEFAULTED_FUNCTION StridedDiscreteDomain & operator=(StridedDiscreteDomain const &x)=default
KOKKOS_DEFAULTED_FUNCTION StridedDiscreteDomain & operator=(StridedDiscreteDomain const &x)=default
KOKKOS_FUNCTION constexpr discrete_vector_type extents() const noexcept
KOKKOS_FUNCTION constexpr operator bool()
KOKKOS_FUNCTION constexpr StridedDiscreteDomain take_first(discrete_vector_type n) const
KOKKOS_FUNCTION constexpr DiscreteVector< QueryDDim > extent() const noexcept
KOKKOS_FUNCTION constexpr discrete_element_type front() const noexcept
KOKKOS_FUNCTION bool contains(DElems const &... delems) const noexcept
KOKKOS_FUNCTION constexpr std::size_t size() const
KOKKOS_FUNCTION DiscreteVector< DDims... > distance_from_front(DElems const &... delems) const noexcept
KOKKOS_DEFAULTED_FUNCTION StridedDiscreteDomain(StridedDiscreteDomain &&x)=default
KOKKOS_FUNCTION constexpr discrete_vector_type strides() const noexcept
KOKKOS_DEFAULTED_FUNCTION StridedDiscreteDomain & operator=(StridedDiscreteDomain &&x)=default
KOKKOS_FUNCTION constexpr StridedDiscreteDomain remove(discrete_vector_type n1, discrete_vector_type n2) const
KOKKOS_FUNCTION constexpr StridedDiscreteDomain remove_first(discrete_vector_type n) const
KOKKOS_FUNCTION constexpr discrete_element_type back() const noexcept
KOKKOS_DEFAULTED_FUNCTION StridedDiscreteDomain()=default
KOKKOS_FUNCTION constexpr DiscreteElement< DDims... > operator()(DiscreteVector< DDims... > const &dvect) const noexcept
KOKKOS_FUNCTION constexpr decltype(auto) operator[](std::size_t n)
KOKKOS_FUNCTION constexpr StridedDiscreteDomain remove_last(discrete_vector_type n) const
KOKKOS_FUNCTION constexpr StridedDiscreteDomain take_last(discrete_vector_type n) const
KOKKOS_DEFAULTED_FUNCTION ~StridedDiscreteDomain()=default
KOKKOS_FUNCTION constexpr decltype(auto) operator[](std::size_t n) const
KOKKOS_DEFAULTED_FUNCTION StridedDiscreteDomain(StridedDiscreteDomain const &x)=default
KOKKOS_FUNCTION constexpr bool operator==(StridedDiscreteDomain< ODims... > const &other) const
static KOKKOS_FUNCTION constexpr std::size_t rank()
KOKKOS_FUNCTION constexpr StridedDiscreteDomain(DDoms const &... domains)
Construct a StridedDiscreteDomain by copies and merge of domains.
KOKKOS_FUNCTION constexpr bool empty() const noexcept
KOKKOS_FUNCTION constexpr StridedDiscreteDomain(discrete_element_type const &element_begin, discrete_vector_type const &extents, discrete_vector_type const &strides)
Construct a StridedDiscreteDomain starting from element_begin with size points.
The top-level namespace of DDC.
constexpr bool is_non_uniform_point_sampling_v
KOKKOS_FUNCTION constexpr DiscreteElement< QueryDDims... > back(SparseDiscreteDomain< DDims... > const &domain) noexcept
KOKKOS_FUNCTION constexpr DiscreteElement< QueryDDims... > front(StridedDiscreteDomain< DDims... > const &domain) noexcept
KOKKOS_FUNCTION Coordinate< typename DDim::continuous_dimension_type > rlength(DiscreteDomain< DDim > const &d)
bool is_discrete_space_initialized() noexcept
KOKKOS_FUNCTION Coordinate< typename DDim::continuous_dimension_type > coordinate(DiscreteElement< DDim > const &c)
KOKKOS_FUNCTION Coordinate< typename DDim::continuous_dimension_type > distance_at_left(DiscreteElement< DDim > i)
KOKKOS_FUNCTION Coordinate< typename DDim::continuous_dimension_type > origin() noexcept
Lower bound index of the mesh.
KOKKOS_FUNCTION constexpr SparseDiscreteDomain< QueryDDims... > select(SparseDiscreteDomain< DDims... > const &domain)
KOKKOS_FUNCTION constexpr DiscreteVector< QueryDDims... > extents(StridedDiscreteDomain< DDims... > const &domain) noexcept
KOKKOS_FUNCTION Coordinate< typename DDim::continuous_dimension_type > rmin(DiscreteDomain< DDim > const &d)
KOKKOS_FUNCTION constexpr DiscreteElement< QueryDDims... > back(StridedDiscreteDomain< DDims... > const &domain) noexcept
KOKKOS_FUNCTION constexpr StridedDiscreteDomain< QueryDDims... > select(StridedDiscreteDomain< DDims... > const &domain)
KOKKOS_FUNCTION constexpr auto remove_dims_of(StridedDiscreteDomain< DDimsA... > const &DDom_a) noexcept
Remove the dimensions DDimsB from DDom_a.
KOKKOS_FUNCTION Coordinate< typename DDim::continuous_dimension_type > distance_at_right(DiscreteElement< DDim > i)
void init_discrete_space(Args &&... args)
Initialize (emplace) a global singleton discrete space.
KOKKOS_FUNCTION constexpr auto remove_dims_of(StridedDiscreteDomain< DDimsA... > const &DDom_a, StridedDiscreteDomain< DDimsB... > const &) noexcept
KOKKOS_FUNCTION constexpr auto remove_dims_of(SparseDiscreteDomain< DDimsA... > const &DDom_a, SparseDiscreteDomain< DDimsB... > const &) noexcept
detail::ddim_impl_t< DDim, Kokkos::HostSpace > const & host_discrete_space()
KOKKOS_FUNCTION constexpr DiscreteVector< QueryDDims... > extents(SparseDiscreteDomain< DDims... > const &domain) noexcept
KOKKOS_FUNCTION constexpr auto replace_dim_of(SparseDiscreteDomain< DDimsA... > const &DDom_a, SparseDiscreteDomain< DDimsB... > const &DDom_b) noexcept
KOKKOS_FUNCTION constexpr DiscreteElement< QueryDDims... > front(SparseDiscreteDomain< DDims... > const &domain) noexcept
constexpr bool is_strided_discrete_domain_v
KOKKOS_FUNCTION DiscreteVector< ODDims... > prod(DiscreteVector< ODDims... > const &lhs, DiscreteVector< ODDims... > const &rhs) noexcept
constexpr bool is_periodic_sampling_v
KOKKOS_FUNCTION Real step() noexcept
Spacing step of the mesh.
KOKKOS_FUNCTION constexpr auto replace_dim_of(StridedDiscreteDomain< DDimsA... > const &DDom_a, StridedDiscreteDomain< DDimsB... > const &DDom_b) noexcept
constexpr bool is_sparse_discrete_domain_v
KOKKOS_FUNCTION constexpr auto remove_dims_of(SparseDiscreteDomain< DDimsA... > const &DDom_a) noexcept
Remove the dimensions DDimsB from DDom_a.
KOKKOS_FUNCTION DiscreteElement< DDim > front() noexcept
Lower bound index of the mesh.
KOKKOS_FUNCTION detail::ddim_impl_t< DDim, MemorySpace > const & discrete_space()
Arg0 init_discrete_space(std::tuple< DDimImpl, Arg0 > &&a)
Move construct a global singleton discrete space and pass through the other argument.
std::tuple< Arg0, Arg1, Args... > init_discrete_space(std::tuple< DDimImpl, Arg0, Arg1, Args... > &&a)
Move construct a global singleton discrete space and pass through remaining arguments.
KOKKOS_FUNCTION Coordinate< typename DDim::continuous_dimension_type > rmax(DiscreteDomain< DDim > const &d)
friend KOKKOS_FUNCTION constexpr StridedDiscreteDomainIterator operator-(StridedDiscreteDomainIterator i, difference_type n)
KOKKOS_FUNCTION constexpr DiscreteElement< DDim > operator*() const noexcept
KOKKOS_FUNCTION constexpr StridedDiscreteDomainIterator & operator++()
friend KOKKOS_FUNCTION constexpr StridedDiscreteDomainIterator operator+(difference_type n, StridedDiscreteDomainIterator i)
KOKKOS_FUNCTION constexpr StridedDiscreteDomainIterator & operator-=(difference_type n)
KOKKOS_FUNCTION constexpr StridedDiscreteDomainIterator operator++(int)
friend KOKKOS_FUNCTION constexpr bool operator<(StridedDiscreteDomainIterator const &xx, StridedDiscreteDomainIterator const &yy)
KOKKOS_DEFAULTED_FUNCTION StridedDiscreteDomainIterator()=default
KOKKOS_FUNCTION constexpr StridedDiscreteDomainIterator operator--(int)
friend KOKKOS_FUNCTION constexpr bool operator==(StridedDiscreteDomainIterator const &xx, StridedDiscreteDomainIterator const &yy)
KOKKOS_FUNCTION constexpr StridedDiscreteDomainIterator(DiscreteElement< DDim > value, DiscreteVector< DDim > stride)
KOKKOS_FUNCTION constexpr StridedDiscreteDomainIterator & operator+=(difference_type n)
KOKKOS_FUNCTION constexpr DiscreteElement< DDim > operator[](difference_type n) const
friend KOKKOS_FUNCTION constexpr difference_type operator-(StridedDiscreteDomainIterator const &xx, StridedDiscreteDomainIterator const &yy)
KOKKOS_FUNCTION constexpr StridedDiscreteDomainIterator & operator--()
friend KOKKOS_FUNCTION constexpr bool operator>=(StridedDiscreteDomainIterator const &xx, StridedDiscreteDomainIterator const &yy)
friend KOKKOS_FUNCTION constexpr StridedDiscreteDomainIterator operator+(StridedDiscreteDomainIterator i, difference_type n)
friend KOKKOS_FUNCTION constexpr bool operator>(StridedDiscreteDomainIterator const &xx, StridedDiscreteDomainIterator const &yy)
friend KOKKOS_FUNCTION constexpr bool operator!=(StridedDiscreteDomainIterator const &xx, StridedDiscreteDomainIterator const &yy)
friend KOKKOS_FUNCTION constexpr bool operator<=(StridedDiscreteDomainIterator const &xx, StridedDiscreteDomainIterator const &yy)