diff --git a/src/amdis/common/FieldMatVec.hpp b/src/amdis/common/FieldMatVec.hpp index 3367a31a133c6a4fabe5b99a5699e42ea99b67d3..86492c9dad4e063c49c2736a69f34f09e3c7ab96 100644 --- a/src/amdis/common/FieldMatVec.hpp +++ b/src/amdis/common/FieldMatVec.hpp @@ -10,6 +10,9 @@ namespace Dune { // some arithmetic operations with FieldVector + template <class T, int N> + FieldVector<T,N> operator-(FieldVector<T,N> v); + template <class T, int N, class S, std::enable_if_t<std::is_arithmetic<S>::value,int> = 0 > FieldVector<T,N> operator*(FieldVector<T,N> v, S factor); @@ -201,6 +204,25 @@ namespace Dune std::enable_if_t<std::is_arithmetic<S>::value,int> = 0 > FieldMatrix<T,M,N> operator*(FieldMatrix<T, M, N> A, S scalar); + template <class T, int M, int N > + FieldMatrix<T,M,N> operator*(FieldMatrix<T,1,1> scalar, FieldMatrix<T, M, N> A); + + template <class T, int M, int N > + FieldMatrix<T,M,N> operator*(FieldMatrix<T, M, N> A, FieldMatrix<T,1,1> scalar); + + template <class T, int N, int M> + FieldMatrix<T,N,M> operator*(FieldVector<T,1> scalar, FieldMatrix<T,N,M> mat); + + template <class T, int N> + FieldMatrix<T,N,1> operator*(FieldVector<T,1> scalar, FieldMatrix<T,N,1> mat); + + template <class T, int N, int M> + FieldMatrix<T,N,M> operator*(FieldMatrix<T,N,M> mat, FieldVector<T,1> scalar); + + template <class T, int N> + FieldMatrix<T,N,1> operator*(FieldMatrix<T,N,1> mat, FieldVector<T,1> scalar); + + template <class T, int M, int N, class S, std::enable_if_t<std::is_arithmetic<S>::value,int> = 0 > FieldMatrix<T,M,N> operator/(FieldMatrix<T, M, N> A, S scalar); @@ -216,12 +238,6 @@ namespace Dune template <class T, int N, int M> FieldVector<T,N> operator*(FieldMatrix<T,N,M> const& mat, FieldVector<T,M> const& vec); - template <class T, int N, int M> - FieldMatrix<T,N,M> operator*(FieldMatrix<T,N,M> mat, FieldVector<T,1> const& scalar); - - template <class T, int N> - FieldMatrix<T,N,1> operator*(FieldMatrix<T,N,1> mat, FieldVector<T,1> const& scalar); - template <class T, int M, int N, int L> @@ -241,6 +257,16 @@ namespace Dune template <class T, int M, int N> FieldMatrix<T,M,N>& multiplies_ABt(FieldMatrix<T, M, N> const& A, DiagonalMatrix<T, N> const& B, FieldMatrix<T,M,N>& C); + + template <class T, int N> + T const& at(FieldMatrix<T,N,1> const& vec, std::size_t i); + + template <class T, int M> + T const& at(FieldMatrix<T,1,M> const& vec, std::size_t i); + + template <class T, int N> + T const& at(FieldVector<T,N> const& vec, std::size_t i); + } // end namespace Dune namespace AMDiS diff --git a/src/amdis/common/FieldMatVec.inc.hpp b/src/amdis/common/FieldMatVec.inc.hpp index 19ca078a03308c2389896bb9b37833d53106f4e2..e974e4eca0f129606e3181264b19b5d7797520ec 100644 --- a/src/amdis/common/FieldMatVec.inc.hpp +++ b/src/amdis/common/FieldMatVec.inc.hpp @@ -13,6 +13,12 @@ namespace Dune { // some arithmetic operations with FieldVector +template <class T, int N> +FieldVector<T,N> operator-(FieldVector<T,N> v) +{ + return v *= -1; +} + template <class T, int N, class S, std::enable_if_t<std::is_arithmetic<S>::value,int> > FieldVector<T,N> operator*(FieldVector<T,N> v, S factor) @@ -384,6 +390,42 @@ FieldMatrix<T,M,N> operator*(FieldMatrix<T, M, N> A, S scalar) return A *= scalar; } +template <class T, int N, int M> +FieldMatrix<T,N,M> operator*(FieldMatrix<T,1,1> scalar, FieldMatrix<T,N,M> mat) +{ + return mat *= scalar[0][0]; +} + +template <class T, int N, int M> +FieldMatrix<T,N,M> operator*(FieldMatrix<T,N,M> mat, FieldMatrix<T,1,1> scalar) +{ + return mat *= scalar[0][0]; +} + +template <class T, int N, int M> +FieldMatrix<T,N,M> operator*(FieldVector<T,1> scalar, FieldMatrix<T,N,M> mat) +{ + return mat *= scalar[0]; +} + +template <class T, int N> +FieldMatrix<T,N,1> operator*(FieldVector<T,1> scalar, FieldMatrix<T,N,1> mat) +{ + return mat *= scalar[0]; +} + +template <class T, int N, int M> +FieldMatrix<T,N,M> operator*(FieldMatrix<T,N,M> mat, FieldVector<T,1> scalar) +{ + return mat *= scalar[0]; +} + +template <class T, int N> +FieldMatrix<T,N,1> operator*(FieldMatrix<T,N,1> mat, FieldVector<T,1> scalar) +{ + return mat *= scalar[0]; +} + template <class T, int M, int N, class S, std::enable_if_t<std::is_arithmetic<S>::value,int> > FieldMatrix<T,M,N> operator/(FieldMatrix<T, M, N> A, S scalar) @@ -410,18 +452,6 @@ FieldVector<T,N> operator*(FieldMatrix<T,N,M> const& mat, FieldVector<T,M> const return Dune::FMatrixHelp::mult(mat, vec); } -template <class T, int N, int M> -FieldMatrix<T,N,M> operator*(FieldMatrix<T,N,M> mat, FieldVector<T,1> const& scalar) -{ - return mat *= scalar[0]; -} - -template <class T, int N> -FieldMatrix<T,N,1> operator*(FieldMatrix<T,N,1> mat, FieldVector<T,1> const& scalar) -{ - return mat *= scalar[0]; -} - template <class T, int M, int N, int L> @@ -486,6 +516,25 @@ FieldMatrix<T,M,N>& multiplies_ABt(FieldMatrix<T, M, N> const& A, DiagonalMatri return C; } + +template <class T, int N> +T const& at(FieldMatrix<T,N,1> const& vec, std::size_t i) +{ + return vec[i][0]; +} + +template <class T, int M> +T const& at(FieldMatrix<T,1,M> const& vec, std::size_t i) +{ + return vec[0][i]; +} + +template <class T, int N> +T const& at(FieldVector<T,N> const& vec, std::size_t i) +{ + return vec[i]; +} + } // end namespace AMDiS #endif