From 475b73d79b204270181c9ce0e5ddb9a24ed60aa3 Mon Sep 17 00:00:00 2001 From: Stephane Del Pino <stephane.delpino44@gmail.com> Date: Mon, 11 Jun 2018 14:38:54 +0200 Subject: [PATCH] Few clean-up in TinyMatrix Now det for arbitrary dimension is only available to floating point types. --- src/algebra/TinyMatrix.hpp | 96 +++++++++++++++++++++----------------- 1 file changed, 53 insertions(+), 43 deletions(-) diff --git a/src/algebra/TinyMatrix.hpp b/src/algebra/TinyMatrix.hpp index 577bd4fa0..9a9e9aa22 100644 --- a/src/algebra/TinyMatrix.hpp +++ b/src/algebra/TinyMatrix.hpp @@ -52,11 +52,11 @@ public: TinyMatrix AB; for (size_t i=0; i<N; ++i) { for (size_t j=0; j<N; ++j) { - T sum = A(i,0)*B(0,j); - for (size_t k=1; k<N; ++k) { - sum += A(i,k)*B(k,j); - } - AB(i,j) = sum; + T sum = A(i,0)*B(0,j); + for (size_t k=1; k<N; ++k) { + sum += A(i,k)*B(k,j); + } + AB(i,j) = sum; } } return std::move(AB); @@ -71,7 +71,7 @@ public: for (size_t i=0; i<N; ++i) { T sum = A(i,0)*x[0]; for (size_t j=1; j<N; ++j) { - sum += A(i,j)*x[j]; + sum += A(i,j)*x[j]; } Ax[i] = sum; } @@ -83,22 +83,37 @@ public: friend std::ostream& operator<<(std::ostream& os, const TinyMatrix& A) { if constexpr(N==1) { - os << A(0,0); + os << A(0,0); } else { os << '['; for (size_t i=0; i<N; ++i) { - os << '(' << A(i,0); - for (size_t j=1; j<N; ++j) { - os << ',' << A(i,j); - } - os << ')'; + os << '(' << A(i,0); + for (size_t j=1; j<N; ++j) { + os << ',' << A(i,j); + } + os << ')'; } os << ']'; } return os; } + KOKKOS_INLINE_FUNCTION + bool operator==(const TinyMatrix& A) const + { + for (size_t i=0; i<N*N; ++i) { + if (m_values[i] != A.m_values[i]) return false; + } + return true; + } + + KOKKOS_INLINE_FUNCTION + bool operator!=(const TinyMatrix& A) const + { + return not this->operator==(A); + } + KOKKOS_INLINE_FUNCTION TinyMatrix operator+(const TinyMatrix& A) const { @@ -167,14 +182,14 @@ public: static_assert(std::is_arithmetic<T>(),"Cannot assign 'identity' value for non-arithmetic types"); for (size_t i=0; i<N; ++i) { for (size_t j=0; j<N; ++j) { - m_values[_index(i,j)] = (i==j) ? 1 : 0; + m_values[_index(i,j)] = (i==j) ? 1 : 0; } } return *this; } KOKKOS_INLINE_FUNCTION - const TinyMatrix& operator=(const TinyMatrix& A) + TinyMatrix& operator=(const TinyMatrix& A) { for (size_t i=0; i<N*N; ++i) { m_values[i] = A.m_values[i]; @@ -194,10 +209,7 @@ public: } KOKKOS_INLINE_FUNCTION - TinyMatrix() - { - ; - } + TinyMatrix()=default; KOKKOS_INLINE_FUNCTION TinyMatrix(const ZeroType& z) @@ -214,7 +226,7 @@ public: static_assert(std::is_arithmetic<T>(),"Cannot construct from 'identity' value for non-arithmetic types"); for (size_t i=0; i<N; ++i) { for (size_t j=0; j<N; ++j) { - m_values[_index(i,j)] = (i==j) ? 1 : 0; + m_values[_index(i,j)] = (i==j) ? 1 : 0; } } } @@ -231,16 +243,13 @@ public: TinyMatrix(TinyMatrix&& A) = default; KOKKOS_INLINE_FUNCTION - ~TinyMatrix() - { - ; - } + ~TinyMatrix()=default; }; template <size_t N, typename T> KOKKOS_INLINE_FUNCTION TinyMatrix<N,T> tensorProduct(const TinyVector<N,T>& x, - const TinyVector<N,T>& y) + const TinyVector<N,T>& y) { TinyMatrix<N,T> A; for (size_t i=0; i<N; ++i) { @@ -256,39 +265,40 @@ KOKKOS_INLINE_FUNCTION T det(const TinyMatrix<N,T>& A) { static_assert(std::is_arithmetic<T>::value, "determinent is not defined for non arithmetic types"); + static_assert(std::is_floating_point<T>::value, "determinent for arbitrary dimension N is defined for floating point types only"); TinyMatrix<N,T> M = A; - TinyVector<N, int> index; - for (int i=0; i<N; ++i) index[i]=i; + TinyVector<N, size_t> index; + for (size_t i=0; i<N; ++i) index[i]=i; T determinent = 1; - for (int i=0; i<N; ++i) { - for (int j=i; j<N; ++j) { - int l = j; - const int J = index[j]; - for (int k=j+1; k<N; ++k) { - if (std::abs(M(index[k],i)) > std::abs(M(J,i))) { - l=k; - } + for (size_t i=0; i<N; ++i) { + for (size_t j=i; j<N; ++j) { + size_t l = j; + const size_t J = index[j]; + for (size_t k=j+1; k<N; ++k) { + if (std::abs(M(index[k],i)) > std::abs(M(J,i))) { + l=k; + } } if (l != j) { - std::swap(index[l], index[j]); - determinent *= -1; + std::swap(index[l], index[j]); + determinent *= -1; } } - const int I = index[i]; + const size_t I = index[i]; if (M(I,i)==0) return 0; - double inv_Mii = 1./M(I,i); - for (int k=i+1; k<N; ++k) { - const int K = index[k]; + const T inv_Mii = 1./M(I,i); + for (size_t k=i+1; k<N; ++k) { + const size_t K = index[k]; const T factor = M(K,i)*inv_Mii; - for (int l=i+1; l<N; ++l) { - M(K,l) -= factor*M(I,l); + for (size_t l=i+1; l<N; ++l) { + M(K,l) -= factor*M(I,l); } } } - for (int i=0; i<N; ++i) { + for (size_t i=0; i<N; ++i) { determinent *= M(index[i],i); } return determinent; -- GitLab