diff --git a/dune/matrix-vector/traits/CMakeLists.txt b/dune/matrix-vector/traits/CMakeLists.txt index fceabef21c8f600ea8b1cfcfa254d4fc2aa599d3..3914b32fe7e1f5434b82d81e1ddd22f9f1562641 100644 --- a/dune/matrix-vector/traits/CMakeLists.txt +++ b/dune/matrix-vector/traits/CMakeLists.txt @@ -1,6 +1,7 @@ #install headers install(FILES fieldtraits.hh + isquadratic.hh matrixtraits.hh scalartraits.hh utilities.hh diff --git a/dune/matrix-vector/traits/isquadratic.hh b/dune/matrix-vector/traits/isquadratic.hh new file mode 100644 index 0000000000000000000000000000000000000000..77d9a80340ddd83625c7bb6215f7d478b1c8e741 --- /dev/null +++ b/dune/matrix-vector/traits/isquadratic.hh @@ -0,0 +1,41 @@ +#ifndef DUNE_MATRIX_VECTOR_TRAITS_ISQUADRATIC_HH +#define DUNE_MATRIX_VECTOR_TRAITS_ISQUADRATIC_HH + +#include <dune/matrix-vector/traits/utilities.hh> + +/** + * \file + * \brief This may yield incorrect results for types whose ScalarTraits or + * MatrixTraits specializations are incomplete. Will report the dimension > 0 + * in case the type is detected to be symmetric. + */ + +namespace Dune { +namespace MatrixVector { +namespace Traits { + +template <class, class Enable = void> +struct IsQuadratic { + constexpr static int dimension = 0; +}; + +template <class T> +struct IsQuadratic<T, EnableScalar<T>> { + constexpr static int dimension = 1; +}; + +template <class T> +using EnableNonScalarQuadraticMatrix = + std::enable_if_t<isMatrix<T>() and (MatrixTraits<T>::rows > 1) and + MatrixTraits<T>::rows == MatrixTraits<T>::cols>; + +template <class T> +struct IsQuadratic<T, EnableNonScalarQuadraticMatrix<T>> { + constexpr static int dimension = MatrixTraits<T>::rows; +}; + +} // end namespace Traits +} // end namespace MatrixVector +} // end namespace Dune + +#endif // DUNE_MATRIX_VECTOR_TRAITS_ISQUADRATIC_HH diff --git a/dune/matrix-vector/traits/utilities.hh b/dune/matrix-vector/traits/utilities.hh index ecc17b580b11f45ae2cf34562a092288fa0a44ef..1ae672ecb54a41cf2cf5bc8a4e6951bde2734073 100644 --- a/dune/matrix-vector/traits/utilities.hh +++ b/dune/matrix-vector/traits/utilities.hh @@ -11,6 +11,9 @@ #include <dune/matrix-vector/traits/matrixtraits.hh> #include <dune/matrix-vector/traits/vectortraits.hh> +// coming below to avoid circular dependency: +// #include <dune/matrix-vector/traits/isquadratic.hh> + namespace Dune { namespace MatrixVector { @@ -82,4 +85,18 @@ constexpr auto isSparseRangeIterable() { } // end namespace MatrixVector } // end namespace Dune +#include <dune/matrix-vector/traits/isquadratic.hh> + +namespace Dune { +namespace MatrixVector { + +template <class T> +constexpr auto isQuadratic() { + return Std::bool_constant<Traits::IsQuadratic<std::decay_t<T>>::dimension>(); +} + +} // end namespace MatrixVector +} // end namespace Dune + + #endif // DUNE_MATRIX_VECTOR_TRAITS_UTILITIES_HH