diff --git a/examples/ellipt.cc b/examples/ellipt.cc index 74e68ca045c9d979ff9747c8e118f8c4f7085791..d898f3e2a50c636458159c7b8016916fe919fb00 100644 --- a/examples/ellipt.cc +++ b/examples/ellipt.cc @@ -6,7 +6,6 @@ #include <amdis/AMDiS.hpp> #include <amdis/ProblemStat.hpp> #include <amdis/Operators.hpp> -#include <amdis/common/FieldMatVec.hpp> #include <amdis/common/Literals.hpp> #include <amdis/gridfunctions/Integrate.hpp> diff --git a/src/amdis/common/FieldMatVec.hpp b/src/amdis/common/FieldMatVec.hpp index 7d0a438f8d05e9200f4cf1bd6fce3e7d9938e50c..3367a31a133c6a4fabe5b99a5699e42ea99b67d3 100644 --- a/src/amdis/common/FieldMatVec.hpp +++ b/src/amdis/common/FieldMatVec.hpp @@ -1,29 +1,25 @@ #pragma once +#include <type_traits> + #include <dune/common/diagonalmatrix.hh> #include <dune/common/fmatrix.hh> #include <dune/common/fvector.hh> -#include <amdis/common/ConceptsBase.hpp> -#include <amdis/common/ScalarTypes.hpp> - -namespace AMDiS +namespace Dune { - using Dune::FieldVector; - using Dune::FieldMatrix; - // some arithmetic operations with FieldVector template <class T, int N, class S, - REQUIRES(Concepts::Arithmetic<S>) > + std::enable_if_t<std::is_arithmetic<S>::value,int> = 0 > FieldVector<T,N> operator*(FieldVector<T,N> v, S factor); template <class S, class T, int N, - REQUIRES(Concepts::Arithmetic<S>) > + std::enable_if_t<std::is_arithmetic<S>::value,int> = 0 > FieldVector<T,N> operator*(S factor, FieldVector<T,N> v); template <class T, int N, class S, - REQUIRES(Concepts::Arithmetic<S>) > + std::enable_if_t<std::is_arithmetic<S>::value,int> = 0 > FieldVector<T,N> operator/(FieldVector<T,N> v, S factor); template <class T> @@ -50,7 +46,7 @@ namespace AMDiS auto dot(FieldVector<T,N> const& vec1, FieldVector<S,N> const& vec2); template <class T, int N, int M, - REQUIRES( N!=1 && M!=1 )> + std::enable_if_t<( N!=1 && M!=1 ),int> = 0> auto operator*(FieldVector<T,N> const& v, FieldVector<T,M> const& w); template <class T, class S, int N> @@ -198,15 +194,15 @@ namespace AMDiS template <class T, int M, int N, class S, - REQUIRES(Concepts::Arithmetic<S>) > + std::enable_if_t<std::is_arithmetic<S>::value,int> = 0 > FieldMatrix<T,M,N> operator*(S scalar, FieldMatrix<T, M, N> A); template <class T, int M, int N, class S, - REQUIRES(Concepts::Arithmetic<S>) > + 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, class S, - REQUIRES(Concepts::Arithmetic<S>) > + std::enable_if_t<std::is_arithmetic<S>::value,int> = 0 > FieldMatrix<T,M,N> operator/(FieldMatrix<T, M, N> A, S scalar); @@ -243,8 +239,14 @@ namespace AMDiS FieldMatrix<T,M,N>& multiplies_ABt(FieldMatrix<T, M, L> const& A, FieldMatrix<T, N, L> const& B, FieldMatrix<T,M,N>& C); template <class T, int M, int N> - FieldMatrix<T,M,N>& multiplies_ABt(FieldMatrix<T, M, N> const& A, Dune::DiagonalMatrix<T, N> const& B, FieldMatrix<T,M,N>& C); + FieldMatrix<T,M,N>& multiplies_ABt(FieldMatrix<T, M, N> const& A, DiagonalMatrix<T, N> const& B, FieldMatrix<T,M,N>& C); -} // end namespace AMDiS +} // end namespace Dune + +namespace AMDiS +{ + using Dune::FieldMatrix; + using Dune::FieldVector; +} #include "FieldMatVec.inc.hpp" diff --git a/src/amdis/common/FieldMatVec.inc.hpp b/src/amdis/common/FieldMatVec.inc.hpp index b60db4cc72491bc5cb3fe4216418a1b47034ba47..19ca078a03308c2389896bb9b37833d53106f4e2 100644 --- a/src/amdis/common/FieldMatVec.inc.hpp +++ b/src/amdis/common/FieldMatVec.inc.hpp @@ -9,26 +9,26 @@ #ifndef DOXYGEN -namespace AMDiS { +namespace Dune { // some arithmetic operations with FieldVector template <class T, int N, class S, - REQUIRES_(Concepts::Arithmetic<S>) > + std::enable_if_t<std::is_arithmetic<S>::value,int> > FieldVector<T,N> operator*(FieldVector<T,N> v, S factor) { return v *= factor; } template <class S, class T, int N, - REQUIRES_(Concepts::Arithmetic<S>) > + std::enable_if_t<std::is_arithmetic<S>::value,int> > FieldVector<T,N> operator*(S factor, FieldVector<T,N> v) { return v *= factor; } template <class T, int N, class S, - REQUIRES_(Concepts::Arithmetic<S>) > + std::enable_if_t<std::is_arithmetic<S>::value,int> > FieldVector<T,N> operator/(FieldVector<T,N> v, S factor) { return v /= factor; @@ -78,7 +78,7 @@ auto dot(FieldVector<T,N> const& vec1, FieldVector<S,N> const& vec2) } template <class T, int N, int M, - REQUIRES_( N!=1 && M!=1 )> + std::enable_if_t<( N!=1 && M!=1 ),int> > auto operator*(FieldVector<T,N> const& v, FieldVector<T,M> const& w) { static_assert(M == N, "Requires vectors of the same type!"); @@ -117,13 +117,13 @@ namespace Impl template <class T, int N> T sum(FieldVector<T, N> const& x) { - return Impl::accumulate(x, T(0), Operation::Plus{}); + return Impl::accumulate(x, T(0), AMDiS::Operation::Plus{}); } template <class T, int N> T sum(FieldMatrix<T, 1, N> const& x) { - return Impl::accumulate(x, T(0), Operation::Plus{}); + return Impl::accumulate(x, T(0), AMDiS::Operation::Plus{}); } @@ -131,14 +131,14 @@ T sum(FieldMatrix<T, 1, N> const& x) template <class T, int N> auto unary_dot(FieldVector<T, N> const& x) { - auto op = [](auto const& a, auto const& b) { return a + Math::sqr(std::abs(b)); }; + auto op = [](auto const& a, auto const& b) { return a + AMDiS::Math::sqr(std::abs(b)); }; return Impl::accumulate(x, T(0), op); } template <class T, int N> auto unary_dot(FieldMatrix<T, 1, N> const& x) { - auto op = [](auto const& a, auto const& b) { return a + Math::sqr(std::abs(b)); }; + auto op = [](auto const& a, auto const& b) { return a + AMDiS::Math::sqr(std::abs(b)); }; return Impl::accumulate(x, T(0), op); } @@ -146,52 +146,52 @@ auto unary_dot(FieldMatrix<T, 1, N> const& x) template <class T, int N> auto max(FieldVector<T, N> const& x) { - return Impl::accumulate(x, std::numeric_limits<T>::lowest(), Operation::Max{}); + return Impl::accumulate(x, std::numeric_limits<T>::lowest(), AMDiS::Operation::Max{}); } template <class T, int N> auto max(FieldMatrix<T, 1, N> const& x) { - return Impl::accumulate(x, std::numeric_limits<T>::lowest(), Operation::Max{}); + return Impl::accumulate(x, std::numeric_limits<T>::lowest(), AMDiS::Operation::Max{}); } /// Minimum over all vector entries template <class T, int N> auto min(FieldVector<T, N> const& x) { - return Impl::accumulate(x, std::numeric_limits<T>::max(), Operation::Min{}); + return Impl::accumulate(x, std::numeric_limits<T>::max(), AMDiS::Operation::Min{}); } template <class T, int N> auto min(FieldMatrix<T, 1, N> const& x) { - return Impl::accumulate(x, std::numeric_limits<T>::max(), Operation::Min{}); + return Impl::accumulate(x, std::numeric_limits<T>::max(), AMDiS::Operation::Min{}); } /// Maximum of the absolute values of vector entries template <class T, int N> auto abs_max(FieldVector<T, N> const& x) { - return Impl::accumulate(x, T(0), Operation::AbsMax{}); + return Impl::accumulate(x, T(0), AMDiS::Operation::AbsMax{}); } template <class T, int N> auto abs_max(FieldMatrix<T, 1, N> const& x) { - return Impl::accumulate(x, T(0), Operation::AbsMax{}); + return Impl::accumulate(x, T(0), AMDiS::Operation::AbsMax{}); } /// Minimum of the absolute values of vector entries template <class T, int N> auto abs_min(FieldVector<T, N> const& x) { - return Impl::accumulate(x, std::numeric_limits<T>::max(), Operation::AbsMin{}); + return Impl::accumulate(x, std::numeric_limits<T>::max(), AMDiS::Operation::AbsMin{}); } template <class T, int N> auto abs_min(FieldMatrix<T, 1, N> const& x) { - return Impl::accumulate(x, std::numeric_limits<T>::max(), Operation::AbsMin{}); + return Impl::accumulate(x, std::numeric_limits<T>::max(), AMDiS::Operation::AbsMin{}); } // ---------------------------------------------------------------------------- @@ -234,14 +234,14 @@ auto two_norm(FieldMatrix<T, 1, N> const& x) template <int p, class T, int N> auto p_norm(FieldVector<T, N> const& x) { - auto op = [](auto const& a, auto const& b) { return a + Math::pow<p>(std::abs(b)); }; + auto op = [](auto const& a, auto const& b) { return a + AMDiS::Math::pow<p>(std::abs(b)); }; return std::pow( Impl::accumulate(x, T(0), op), 1.0/p ); } template <int p, class T, int N> auto p_norm(FieldMatrix<T, 1, N> const& x) { - auto op = [](auto const& a, auto const& b) { return a + Math::pow<p>(std::abs(b)); }; + auto op = [](auto const& a, auto const& b) { return a + AMDiS::Math::pow<p>(std::abs(b)); }; return std::pow( Impl::accumulate(x, T(0), op), 1.0/p ); } @@ -268,7 +268,7 @@ T distance(FieldVector<T, N> const& lhs, FieldVector<T, N> const& rhs) { T result = 0; for (int i = 0; i < N; ++i) - result += Math::sqr(lhs[i] - rhs[i]); + result += AMDiS::Math::sqr(lhs[i] - rhs[i]); return std::sqrt(result); } @@ -371,21 +371,21 @@ FieldMatrix<T,N,M> trans(FieldMatrix<T, M, N> const& A) template <class T, int M, int N, class S, - REQUIRES_(Concepts::Arithmetic<S>) > + std::enable_if_t<std::is_arithmetic<S>::value,int> > FieldMatrix<T,M,N> operator*(S scalar, FieldMatrix<T, M, N> A) { return A *= scalar; } template <class T, int M, int N, class S, - REQUIRES_(Concepts::Arithmetic<S>) > + std::enable_if_t<std::is_arithmetic<S>::value,int> > FieldMatrix<T,M,N> operator*(FieldMatrix<T, M, N> A, S scalar) { return A *= scalar; } template <class T, int M, int N, class S, - REQUIRES_(Concepts::Arithmetic<S>) > + std::enable_if_t<std::is_arithmetic<S>::value,int> > FieldMatrix<T,M,N> operator/(FieldMatrix<T, M, N> A, S scalar) { return A /= scalar; @@ -476,7 +476,7 @@ FieldMatrix<T,M,N>& multiplies_ABt(FieldMatrix<T, M, L> const& A, FieldMatrix<T } template <class T, int M, int N> -FieldMatrix<T,M,N>& multiplies_ABt(FieldMatrix<T, M, N> const& A, Dune::DiagonalMatrix<T, N> const& B, FieldMatrix<T,M,N>& C) +FieldMatrix<T,M,N>& multiplies_ABt(FieldMatrix<T, M, N> const& A, DiagonalMatrix<T, N> const& B, FieldMatrix<T,M,N>& C) { for (int m = 0; m < M; ++m) { for (int n = 0; n < N; ++n) {