From 9ef820ed42f0f0670a0cb1f554b23c162a297f43 Mon Sep 17 00:00:00 2001 From: EmilyBourne Date: Mon, 22 Apr 2024 18:05:15 +0200 Subject: [PATCH] Allow the reordering of a DiscreteDomain (#420) * Add a reordered assignment operator --------- Co-authored-by: Emily Bourne Co-authored-by: Thomas Padioleau --- include/ddc/discrete_domain.hpp | 19 ++++++++++++++++++ tests/discrete_domain.cpp | 34 +++++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+) diff --git a/include/ddc/discrete_domain.hpp b/include/ddc/discrete_domain.hpp index e00689e9d..97ee21779 100644 --- a/include/ddc/discrete_domain.hpp +++ b/include/ddc/discrete_domain.hpp @@ -100,6 +100,25 @@ class DiscreteDomain KOKKOS_DEFAULTED_FUNCTION DiscreteDomain& operator=(DiscreteDomain&& x) = default; + /** + * @brief Copy a DiscreteDomain by reordering and slicing. + * + * An assign operator to build a DiscreteDomain from another compatible domain. + * A domain is compatible if it either contains the same dimensions as this + * domain (even if they are in a different order) or if it contains at + * the dimensions of this domain plus some additional dimensions which will + * be unused here. + * + * @param domain A compatible domain. + */ + template + DiscreteDomain& KOKKOS_FUNCTION operator=(DiscreteDomain const& domain) + { + m_element_begin = DiscreteElement(domain.front()); + m_element_end = m_element_begin + DiscreteVector(domain.extents()); + return *this; + } + template KOKKOS_FUNCTION constexpr bool operator==(DiscreteDomain const& other) const { diff --git a/tests/discrete_domain.cpp b/tests/discrete_domain.cpp index 66b8b4dc1..aa727ebb8 100644 --- a/tests/discrete_domain.cpp +++ b/tests/discrete_domain.cpp @@ -54,6 +54,9 @@ using DElemXYZ = ddc::DiscreteElement; using DVectXYZ = ddc::DiscreteVector; using DDomXYZ = ddc::DiscreteDomain; +using DElemZYX = ddc::DiscreteElement; +using DVectZYX = ddc::DiscreteVector; +using DDomZYX = ddc::DiscreteDomain; static DElemX constexpr lbound_x(50); static DVectX constexpr nelems_x(3); @@ -234,3 +237,34 @@ TEST(ProductMDomainTest, SliceDomainXToolate) R"rgx([Aa]ssert.*uid\(m_element_end\).*uid\(odomain\.m_element_end\).*)rgx"); #endif } + +TEST(ProductMDomainTest, Transpose3DConstructor) +{ + DDomX const dom_x(lbound_x, nelems_x); + DDomY const dom_y(lbound_y, nelems_y); + DDomZ const dom_z(lbound_z, nelems_z); + DDomXYZ const dom_x_y_z(dom_x, dom_y, dom_z); + DDomZYX const dom_z_y_x(dom_x_y_z); + EXPECT_EQ(ddc::select(dom_x_y_z.front()), ddc::select(dom_z_y_x.front())); + EXPECT_EQ(ddc::select(dom_x_y_z.front()), ddc::select(dom_z_y_x.front())); + EXPECT_EQ(ddc::select(dom_x_y_z.front()), ddc::select(dom_z_y_x.front())); + EXPECT_EQ(ddc::select(dom_x_y_z.back()), ddc::select(dom_z_y_x.back())); + EXPECT_EQ(ddc::select(dom_x_y_z.back()), ddc::select(dom_z_y_x.back())); + EXPECT_EQ(ddc::select(dom_x_y_z.back()), ddc::select(dom_z_y_x.back())); +} + +TEST(ProductMDomainTest, Transpose3DAssign) +{ + DDomX const dom_x(lbound_x, nelems_x); + DDomY const dom_y(lbound_y, nelems_y); + DDomZ const dom_z(lbound_z, nelems_z); + DDomXYZ const dom_x_y_z(dom_x, dom_y, dom_z); + DDomZYX dom_z_y_x; + dom_z_y_x = dom_x_y_z; + EXPECT_EQ(ddc::select(dom_x_y_z.front()), ddc::select(dom_z_y_x.front())); + EXPECT_EQ(ddc::select(dom_x_y_z.front()), ddc::select(dom_z_y_x.front())); + EXPECT_EQ(ddc::select(dom_x_y_z.front()), ddc::select(dom_z_y_x.front())); + EXPECT_EQ(ddc::select(dom_x_y_z.back()), ddc::select(dom_z_y_x.back())); + EXPECT_EQ(ddc::select(dom_x_y_z.back()), ddc::select(dom_z_y_x.back())); + EXPECT_EQ(ddc::select(dom_x_y_z.back()), ddc::select(dom_z_y_x.back())); +}