diff --git a/ProcessLib/LocalAssemblerTraits.h b/ProcessLib/LocalAssemblerTraits.h index 136f3da60cdc5852c6df3c0fd6532b02fff10d32..531b61f1fc5bc15aa0047d91c27e763214c22656 100644 --- a/ProcessLib/LocalAssemblerTraits.h +++ b/ProcessLib/LocalAssemblerTraits.h @@ -64,152 +64,116 @@ public: //! per node. using LaplaceMatrix = Matrix<Dim*NodalDOF, Dim*NodalDOF>; - - //! Get a block \c Dim x \c Dim whose upper left corner is at \c top and \c left. - template<typename Mat> - static - typename std::enable_if<NodalDOF != 0, - decltype(std::declval<const Mat>().template block<Dim, Dim>(0u, 0u)) - >::type - blockDimDim(Mat const& mat, - unsigned top, unsigned left, unsigned nrows, unsigned ncols) - { - assert(nrows==Dim && ncols==Dim); - (void) nrows; (void) ncols; - return mat.template block<Dim, Dim>(top, left); - } - //! Get a block \c Dim x \c Dim whose upper left corner is at \c top and \c left. - template<typename Mat> - static - typename std::enable_if<NodalDOF == 0, - decltype(std::declval<const Mat>().block(0u, 0u, 0u, 0u)) - >::type - blockDimDim(Mat const& mat, - unsigned top, unsigned left, unsigned nrows, unsigned ncols) - { - assert(nrows == ncols); - return mat.block(top, left, nrows, ncols); - } - //! Get a block \c Dim x \c Dim whose upper left corner is at \c top and \c left. - template<typename Mat> - static - typename std::enable_if<NodalDOF != 0, - decltype(std::declval<Mat>().template block<Dim, Dim>(0u, 0u)) - >::type - blockDimDim(Mat& mat, - unsigned top, unsigned left, unsigned nrows, unsigned ncols) + //! Get a block \c Dim x \c Dim whose upper left corner is at \c top and \c + //! left. + template <typename Mat> + static auto blockDimDim(Mat const& mat, unsigned top, unsigned left, + unsigned nrows, unsigned ncols) { - assert(nrows==Dim && ncols==Dim); - (void) nrows; (void) ncols; - return mat.template block<Dim, Dim>(top, left); - } - //! Get a block \c Dim x \c Dim whose upper left corner is at \c top and \c left. - template<typename Mat> - static - typename std::enable_if<NodalDOF == 0, - decltype(std::declval<Mat>().block(0u, 0u, 0u, 0u)) - >::type - blockDimDim(Mat& mat, - unsigned top, unsigned left, unsigned nrows, unsigned ncols) - { - assert(nrows == ncols); - return mat.block(top, left, nrows, ncols); + if constexpr (NodalDOF != 0) + { + assert(nrows == Dim && ncols == Dim); + (void)nrows; + (void)ncols; + return mat.template block<Dim, Dim>(top, left); + } + else + { + assert(nrows == ncols); + return mat.block(top, left, nrows, ncols); + } } - //! Get a block \c NNodes x \c NNodes whose upper left corner is at \c top and \c left. - template<typename Mat> - static - typename std::enable_if<NodalDOF != 0, - decltype(std::declval<const Mat>().template block<NNodes, NNodes>(0u, 0u)) - >::type - blockShpShp(Mat const& mat, - unsigned top, unsigned left, unsigned nrows, unsigned ncols) - { - assert(nrows==NNodes && ncols==NNodes); - (void) nrows; (void) ncols; - return mat.template block<NNodes, NNodes>(top, left); - } - //! Get a block \c NNodes x \c NNodes whose upper left corner is at \c top and \c left. - template<typename Mat> - static - typename std::enable_if<NodalDOF == 0, - decltype(std::declval<const Mat>().block(0u, 0u, 0u, 0u)) - >::type - blockShpShp(Mat const& mat, - unsigned top, unsigned left, unsigned nrows, unsigned ncols) + //! Get a block \c Dim x \c Dim whose upper left corner is at \c top and \c + //! left. + template <typename Mat> + static auto blockDimDim(Mat& mat, unsigned top, unsigned left, + unsigned nrows, unsigned ncols) { - assert(nrows == ncols); - return mat.block(top, left, nrows, ncols); - } - //! Get a block \c NNodes x \c NNodes whose upper left corner is at \c top and \c left. - template<typename Mat> - static - typename std::enable_if<NodalDOF != 0, - decltype(std::declval<Mat>().template block<NNodes, NNodes>(0u, 0u)) - >::type - blockShpShp(Mat& mat, - unsigned top, unsigned left, unsigned nrows, unsigned ncols) - { - assert(nrows==NNodes && ncols==NNodes); - (void) nrows; (void) ncols; - return mat.template block<NNodes, NNodes>(top, left); - } - //! Get a block \c NNodes x \c NNodes whose upper left corner is at \c top and \c left. - template<typename Mat> - static - typename std::enable_if<NodalDOF == 0, - decltype(std::declval<Mat>().block(0u, 0u, 0u, 0u)) - >::type - blockShpShp(Mat& mat, - unsigned top, unsigned left, unsigned nrows, unsigned ncols) - { - assert(nrows == ncols); - return mat.block(top, left, nrows, ncols); + if constexpr (NodalDOF != 0) + { + assert(nrows == Dim && ncols == Dim); + (void)nrows; + (void)ncols; + return mat.template block<Dim, Dim>(top, left); + } + else + { + assert(nrows == ncols); + return mat.block(top, left, nrows, ncols); + } } - //! Get a block \c NNodes x 1 starting at the \c top'th row. - template<typename Vec> - static - typename std::enable_if<NodalDOF != 0, - decltype(std::declval<const Vec>().template block<NNodes, 1>(0u, 0u)) - >::type - blockShp(Vec const& vec, unsigned top, unsigned nrows) + //! Get a block \c NNodes x \c NNodes whose upper left corner is at \c top + //! and \c left. + template <typename Mat> + static auto blockShpShp(Mat const& mat, unsigned top, unsigned left, + unsigned nrows, unsigned ncols) { - assert(nrows==NNodes); - (void) nrows; - return vec.template block<NNodes, 1>(top, 0); + if constexpr (NodalDOF != 0) + { + assert(nrows == NNodes && ncols == NNodes); + (void)nrows; + (void)ncols; + return mat.template block<NNodes, NNodes>(top, left); + } + else + { + assert(nrows == ncols); + return mat.block(top, left, nrows, ncols); + } } - //! Get a block \c NNodes x 1 starting at the \c top'th row. - template<typename Vec> - static - typename std::enable_if<NodalDOF == 0, - decltype(std::declval<const Vec>().block(0u, 0u, 0u, 0u)) - >::type - blockShp(Vec const& vec, unsigned top, unsigned nrows) + + //! Get a block \c NNodes x \c NNodes whose upper left corner is at \c top + //! and \c left. + template <typename Mat> + static auto blockShpShp(Mat& mat, unsigned top, unsigned left, + unsigned nrows, unsigned ncols) { - return vec.block(top, 0, nrows, 1); + if constexpr (NodalDOF != 0) + { + assert(nrows == NNodes && ncols == NNodes); + (void)nrows; + (void)ncols; + return mat.template block<NNodes, NNodes>(top, left); + } + else + { + assert(nrows == ncols); + return mat.block(top, left, nrows, ncols); + } } + //! Get a block \c NNodes x 1 starting at the \c top'th row. - template<typename Vec> - static - typename std::enable_if<NodalDOF != 0, - decltype(std::declval<Vec>().template block<NNodes, 1>(0u, 0u)) - >::type - blockShp(Vec& vec, unsigned top, unsigned nrows) + template <typename Vec> + static auto blockShp(Vec const& vec, unsigned top, unsigned nrows) { - assert(nrows==NNodes); - (void) nrows; - return vec.template block<NNodes, 1>(top, 0); + if constexpr (NodalDOF != 0) + { + assert(nrows == NNodes); + (void)nrows; + return vec.template block<NNodes, 1>(top, 0); + } + else + { + return vec.block(top, 0, nrows, 1); + } } + //! Get a block \c NNodes x 1 starting at the \c top'th row. - template<typename Vec> - static - typename std::enable_if<NodalDOF == 0, - decltype(std::declval<Vec>().block(0u, 0u, 0u, 0u)) - >::type - blockShp(Vec& vec, unsigned top, unsigned nrows) + template <typename Vec> + static auto blockShp(Vec& vec, unsigned top, unsigned nrows) { - return vec.block(top, 0, nrows, 1); + if constexpr (NodalDOF != 0) + { + assert(nrows == NNodes); + (void)nrows; + return vec.template block<NNodes, 1>(top, 0); + } + else + { + return vec.block(top, 0, nrows, 1); + } } };