diff --git a/src/algebra/TinyMatrix.hpp b/src/algebra/TinyMatrix.hpp index a4499baa4677f09bc7edd3c1e3c59d41c9b3557d..0635f1b32b12d29bbbaa85273d6c49d92aba12ca 100644 --- a/src/algebra/TinyMatrix.hpp +++ b/src/algebra/TinyMatrix.hpp @@ -11,7 +11,7 @@ #include <iostream> template <size_t N, typename T = double> -class TinyMatrix +class [[nodiscard]] TinyMatrix { public: using data_type = T; @@ -21,15 +21,13 @@ class TinyMatrix static_assert((N > 0), "TinyMatrix size must be strictly positive"); PUGS_FORCEINLINE - constexpr size_t - _index(size_t i, size_t j) const noexcept // LCOV_EXCL_LINE (due to forced inline) + constexpr size_t _index(size_t i, size_t j) const noexcept // LCOV_EXCL_LINE (due to forced inline) { return i * N + j; } template <typename... Args> - PUGS_FORCEINLINE constexpr void - _unpackVariadicInput(const T& t, Args&&... args) noexcept + PUGS_FORCEINLINE constexpr void _unpackVariadicInput(const T& t, Args&&... args) noexcept { m_values[N * N - 1 - sizeof...(args)] = t; if constexpr (sizeof...(args) > 0) { @@ -39,8 +37,7 @@ class TinyMatrix public: PUGS_INLINE - constexpr TinyMatrix - operator-() const + constexpr TinyMatrix operator-() const { TinyMatrix opposed; for (size_t i = 0; i < N * N; ++i) { @@ -50,23 +47,20 @@ class TinyMatrix } PUGS_INLINE - constexpr friend TinyMatrix - operator*(const T& t, const TinyMatrix& A) + constexpr friend TinyMatrix operator*(const T& t, const TinyMatrix& A) { TinyMatrix B = A; return B *= t; } PUGS_INLINE - constexpr friend TinyMatrix - operator*(const T& t, TinyMatrix&& A) + constexpr friend TinyMatrix operator*(const T& t, TinyMatrix&& A) { return std::move(A *= t); } PUGS_INLINE - constexpr TinyMatrix& - operator*=(const T& t) + constexpr TinyMatrix& operator*=(const T& t) { for (size_t i = 0; i < N * N; ++i) { m_values[i] *= t; @@ -75,8 +69,7 @@ class TinyMatrix } PUGS_INLINE - constexpr TinyMatrix - operator*(const TinyMatrix& B) const + constexpr TinyMatrix operator*(const TinyMatrix& B) const { const TinyMatrix& A = *this; TinyMatrix AB; @@ -93,8 +86,7 @@ class TinyMatrix } PUGS_INLINE - constexpr TinyVector<N, T> - operator*(const TinyVector<N, T>& x) const + constexpr TinyVector<N, T> operator*(const TinyVector<N, T>& x) const { const TinyMatrix& A = *this; TinyVector<N, T> Ax; @@ -109,8 +101,7 @@ class TinyMatrix } PUGS_INLINE - constexpr friend std::ostream& - operator<<(std::ostream& os, const TinyMatrix& A) + constexpr friend std::ostream& operator<<(std::ostream& os, const TinyMatrix& A) { if constexpr (N == 1) { os << A(0, 0); @@ -129,8 +120,7 @@ class TinyMatrix } PUGS_INLINE - constexpr bool - operator==(const TinyMatrix& A) const + constexpr bool operator==(const TinyMatrix& A) const { for (size_t i = 0; i < N * N; ++i) { if (m_values[i] != A.m_values[i]) @@ -140,15 +130,13 @@ class TinyMatrix } PUGS_INLINE - constexpr bool - operator!=(const TinyMatrix& A) const + constexpr bool operator!=(const TinyMatrix& A) const { return not this->operator==(A); } PUGS_INLINE - constexpr TinyMatrix - operator+(const TinyMatrix& A) const + constexpr TinyMatrix operator+(const TinyMatrix& A) const { TinyMatrix sum; for (size_t i = 0; i < N * N; ++i) { @@ -158,8 +146,7 @@ class TinyMatrix } PUGS_INLINE - constexpr TinyMatrix - operator+(TinyMatrix&& A) const + constexpr TinyMatrix operator+(TinyMatrix&& A) const { for (size_t i = 0; i < N * N; ++i) { A.m_values[i] += m_values[i]; @@ -168,8 +155,7 @@ class TinyMatrix } PUGS_INLINE - constexpr TinyMatrix - operator-(const TinyMatrix& A) const + constexpr TinyMatrix operator-(const TinyMatrix& A) const { TinyMatrix difference; for (size_t i = 0; i < N * N; ++i) { @@ -179,8 +165,7 @@ class TinyMatrix } PUGS_INLINE - constexpr TinyMatrix - operator-(TinyMatrix&& A) const + constexpr TinyMatrix operator-(TinyMatrix&& A) const { for (size_t i = 0; i < N * N; ++i) { A.m_values[i] = m_values[i] - A.m_values[i]; @@ -189,8 +174,7 @@ class TinyMatrix } PUGS_INLINE - constexpr TinyMatrix& - operator+=(const TinyMatrix& A) + constexpr TinyMatrix& operator+=(const TinyMatrix& A) { for (size_t i = 0; i < N * N; ++i) { m_values[i] += A.m_values[i]; @@ -199,8 +183,7 @@ class TinyMatrix } PUGS_INLINE - constexpr void - operator+=(const volatile TinyMatrix& A) volatile + constexpr void operator+=(const volatile TinyMatrix& A) volatile { for (size_t i = 0; i < N * N; ++i) { m_values[i] += A.m_values[i]; @@ -208,8 +191,7 @@ class TinyMatrix } PUGS_INLINE - constexpr TinyMatrix& - operator-=(const TinyMatrix& A) + constexpr TinyMatrix& operator-=(const TinyMatrix& A) { for (size_t i = 0; i < N * N; ++i) { m_values[i] -= A.m_values[i]; @@ -218,16 +200,14 @@ class TinyMatrix } PUGS_INLINE - constexpr T& - operator()(size_t i, size_t j) noexcept(NO_ASSERT) + constexpr T& operator()(size_t i, size_t j) noexcept(NO_ASSERT) { Assert((i < N) and (j < N)); return m_values[_index(i, j)]; } PUGS_INLINE - constexpr const T& - operator()(size_t i, size_t j) const noexcept(NO_ASSERT) + constexpr const T& operator()(size_t i, size_t j) const noexcept(NO_ASSERT) { Assert((i < N) and (j < N)); return m_values[_index(i, j)]; @@ -299,7 +279,7 @@ class TinyMatrix constexpr TinyMatrix(const TinyMatrix&) noexcept = default; PUGS_INLINE - TinyMatrix(TinyMatrix&& A) noexcept = default; + TinyMatrix(TinyMatrix && A) noexcept = default; PUGS_INLINE ~TinyMatrix() = default; diff --git a/src/algebra/TinyVector.hpp b/src/algebra/TinyVector.hpp index 07690a826ef13040e42baca75daac425fa199333..3f3c10920f5ae75c6b37a0761393cad19a77786b 100644 --- a/src/algebra/TinyVector.hpp +++ b/src/algebra/TinyVector.hpp @@ -11,7 +11,7 @@ #include <cmath> template <size_t N, typename T = double> -class TinyVector +class [[nodiscard]] TinyVector { public: inline static constexpr size_t Dimension = N; @@ -22,8 +22,7 @@ class TinyVector static_assert((N > 0), "TinyVector size must be strictly positive"); template <typename... Args> - PUGS_FORCEINLINE constexpr void - _unpackVariadicInput(const T& t, Args&&... args) noexcept + PUGS_FORCEINLINE constexpr void _unpackVariadicInput(const T& t, Args&&... args) noexcept { m_values[N - 1 - sizeof...(args)] = t; if constexpr (sizeof...(args) > 0) { @@ -33,8 +32,7 @@ class TinyVector public: PUGS_INLINE - constexpr TinyVector - operator-() const + constexpr TinyVector operator-() const { TinyVector opposed; for (size_t i = 0; i < N; ++i) { @@ -44,15 +42,13 @@ class TinyVector } PUGS_INLINE - constexpr size_t - dimension() const + constexpr size_t dimension() const { return N; } PUGS_INLINE - constexpr bool - operator==(const TinyVector& v) const + constexpr bool operator==(const TinyVector& v) const { for (size_t i = 0; i < N; ++i) { if (m_values[i] != v.m_values[i]) @@ -62,8 +58,7 @@ class TinyVector } PUGS_INLINE - constexpr bool - operator!=(const TinyVector& v) const + constexpr bool operator!=(const TinyVector& v) const { return not this->operator==(v); } @@ -79,8 +74,7 @@ class TinyVector } PUGS_INLINE - constexpr TinyVector& - operator*=(const T& t) + constexpr TinyVector& operator*=(const T& t) { for (size_t i = 0; i < N; ++i) { m_values[i] *= t; @@ -103,8 +97,7 @@ class TinyVector } PUGS_INLINE - constexpr friend std::ostream& - operator<<(std::ostream& os, const TinyVector& v) + constexpr friend std::ostream& operator<<(std::ostream& os, const TinyVector& v) { os << '(' << v.m_values[0]; for (size_t i = 1; i < N; ++i) { @@ -115,8 +108,7 @@ class TinyVector } PUGS_INLINE - constexpr TinyVector - operator+(const TinyVector& v) const + constexpr TinyVector operator+(const TinyVector& v) const { TinyVector sum; for (size_t i = 0; i < N; ++i) { @@ -126,8 +118,7 @@ class TinyVector } PUGS_INLINE - constexpr TinyVector - operator+(TinyVector&& v) const + constexpr TinyVector operator+(TinyVector&& v) const { for (size_t i = 0; i < N; ++i) { v.m_values[i] += m_values[i]; @@ -136,8 +127,7 @@ class TinyVector } PUGS_INLINE - constexpr TinyVector - operator-(const TinyVector& v) const + constexpr TinyVector operator-(const TinyVector& v) const { TinyVector difference; for (size_t i = 0; i < N; ++i) { @@ -147,8 +137,7 @@ class TinyVector } PUGS_INLINE - constexpr TinyVector - operator-(TinyVector&& v) const + constexpr TinyVector operator-(TinyVector&& v) const { for (size_t i = 0; i < N; ++i) { v.m_values[i] = m_values[i] - v.m_values[i]; @@ -157,8 +146,7 @@ class TinyVector } PUGS_INLINE - constexpr TinyVector& - operator+=(const TinyVector& v) + constexpr TinyVector& operator+=(const TinyVector& v) { for (size_t i = 0; i < N; ++i) { m_values[i] += v.m_values[i]; @@ -167,8 +155,7 @@ class TinyVector } PUGS_INLINE - constexpr void - operator+=(const volatile TinyVector& v) volatile + constexpr void operator+=(const volatile TinyVector& v) volatile { for (size_t i = 0; i < N; ++i) { m_values[i] += v.m_values[i]; @@ -176,8 +163,7 @@ class TinyVector } PUGS_INLINE - constexpr TinyVector& - operator-=(const TinyVector& v) + constexpr TinyVector& operator-=(const TinyVector& v) { for (size_t i = 0; i < N; ++i) { m_values[i] -= v.m_values[i]; @@ -241,7 +227,7 @@ class TinyVector constexpr TinyVector(const TinyVector&) noexcept = default; PUGS_INLINE - constexpr TinyVector(TinyVector&& v) noexcept = default; + constexpr TinyVector(TinyVector && v) noexcept = default; PUGS_INLINE ~TinyVector() noexcept = default; diff --git a/src/utils/Array.hpp b/src/utils/Array.hpp index 42ae7f61c375a9cb544020063f827c43dcf5e143..73f820949dbb8e60e031a53065130ff62ca95157 100644 --- a/src/utils/Array.hpp +++ b/src/utils/Array.hpp @@ -10,7 +10,7 @@ #include <algorithm> template <typename DataType> -class Array +class [[nodiscard]] Array { public: using data_type = DataType; @@ -23,15 +23,12 @@ class Array friend Array<std::add_const_t<DataType>>; public: - PUGS_INLINE - size_t - size() const noexcept + PUGS_INLINE size_t size() const noexcept { return m_values.extent(0); } - friend PUGS_INLINE Array<std::remove_const_t<DataType>> - copy(const Array<DataType>& source) + friend PUGS_INLINE Array<std::remove_const_t<DataType>> copy(const Array<DataType>& source) { Array<std::remove_const_t<DataType>> image(source.size()); Kokkos::deep_copy(image.m_values, source.m_values); @@ -42,16 +39,14 @@ class Array template <typename DataType2, typename... RT> friend PUGS_INLINE Array<DataType2> encapsulate(const Kokkos::View<DataType2*, RT...>& values); - PUGS_INLINE - DataType& operator[](index_type i) const noexcept(NO_ASSERT) + PUGS_INLINE DataType& operator[](index_type i) const noexcept(NO_ASSERT) { Assert(i < m_values.extent(0)); return m_values[i]; } PUGS_INLINE - void - fill(const DataType& data) const + void fill(const DataType& data) const { static_assert(not std::is_const<DataType>(), "Cannot modify Array of const"); @@ -61,8 +56,7 @@ class Array } template <typename DataType2> - PUGS_INLINE Array& - operator=(const Array<DataType2>& array) noexcept + PUGS_INLINE Array& operator=(const Array<DataType2>& array) noexcept { // ensures that DataType is the same as source DataType2 static_assert(std::is_same<std::remove_const_t<DataType>, std::remove_const_t<DataType2>>(), @@ -94,14 +88,13 @@ class Array Array(const Array&) = default; template <typename DataType2> - PUGS_INLINE - Array(const Array<DataType2>& array) noexcept + PUGS_INLINE Array(const Array<DataType2>& array) noexcept { this->operator=(array); } PUGS_INLINE - Array(Array&&) = default; + Array(Array &&) = default; PUGS_INLINE ~Array() = default; diff --git a/src/utils/Messenger.hpp b/src/utils/Messenger.hpp index 437ea62a0d734274900c8af1b474749813e1aeaa..cfe312a0884ae0718ee76c41855ce8b063fecffd 100644 --- a/src/utils/Messenger.hpp +++ b/src/utils/Messenger.hpp @@ -168,7 +168,7 @@ class Messenger typename RecvArrayType, typename... SendT, typename... RecvT> - RecvArrayType<RecvT...> + void _allToAll(const SendArrayType<SendT...>& sent_array, RecvArrayType<RecvT...>& recv_array) const { #ifdef PUGS_HAS_MPI @@ -189,7 +189,6 @@ class Messenger #else // PUGS_HAS_MPI value_copy(sent_array, recv_array); #endif // PUGS_HAS_MPI - return recv_array; } template <template <typename... SendT> typename SendArrayType, diff --git a/tests/test_Array.cpp b/tests/test_Array.cpp index 3b8dd45878d07747cae3b4e761266c8d9bf14293..0071da34de3f6c5ae3173cb282a5a995462b47c5 100644 --- a/tests/test_Array.cpp +++ b/tests/test_Array.cpp @@ -197,6 +197,23 @@ TEST_CASE("Array", "[utils]") } } + SECTION("checking for Kokkos::View encaspulation") + { + { + Kokkos::View<double*> kokkos_view("anonymous", 10); + for (size_t i = 0; i < kokkos_view.size(); ++i) { + kokkos_view[i] = i; + } + + Array array = encapsulate(kokkos_view); + + REQUIRE(array.size() == kokkos_view.size()); + for (size_t i = 0; i < array.size(); ++i) { + REQUIRE(&array[i] == &kokkos_view[i]); + } + } + } + #ifndef NDEBUG SECTION("checking for bounds violation") {