diff --git a/dune/matrix-vector/test/arithmetictest.cc b/dune/matrix-vector/test/arithmetictest.cc index e319d122eb0fdf6a9fa970ff602410be446cd8a6..be4ef793f1c977ab74ea0145e17c0292c835c790 100644 --- a/dune/matrix-vector/test/arithmetictest.cc +++ b/dune/matrix-vector/test/arithmetictest.cc @@ -9,7 +9,10 @@ #include <dune/common/diagonalmatrix.hh> #include <dune/common/fmatrix.hh> #include <dune/common/fvector.hh> +#include <dune/common/indices.hh> #include <dune/istl/bcrsmatrix.hh> +#include <dune/istl/multitypeblockmatrix.hh> +#include <dune/istl/multitypeblockvector.hh> #include <dune/istl/scaledidmatrix.hh> #include "common.hh" @@ -636,6 +639,37 @@ public: passed = passed and isCloseDune(scaledIdentityMatrix_check, ResultType(0)); } + // case MM += scalar*MM + { + using ResultType = Dune::MultiTypeBlockMatrix< + Dune::MultiTypeBlockVector< + Dune::FieldMatrix<FT, 1, 1>, Dune::FieldMatrix<FT, 1, 2> >, + Dune::MultiTypeBlockVector< + Dune::FieldMatrix<FT, 2, 1>, Dune::FieldMatrix<FT, 2, 2> > >; + ResultType multiTypeBlockMatrix_a, multiTypeBlockMatrix_b; + using namespace Dune::Indices; + multiTypeBlockMatrix_a[_0][_0] = {{1}}; + multiTypeBlockMatrix_a[_0][_1] = {{2, 3}}; + multiTypeBlockMatrix_a[_1][_0] = {{4}, {5}}; + multiTypeBlockMatrix_a[_1][_1] = {{6, 7}, {8, 9}}; + multiTypeBlockMatrix_b[_0][_0] = {{9}}; + multiTypeBlockMatrix_b[_0][_1] = {{8, 7}}; + multiTypeBlockMatrix_b[_1][_0] = {{6}, {5}}; + multiTypeBlockMatrix_b[_1][_1] = {{4, 3}, {2, 1}}; + addProduct(multiTypeBlockMatrix_a, scalar_b, multiTypeBlockMatrix_b); + ResultType multiTypeBlockMatrix_check; + multiTypeBlockMatrix_check[_0][_0] = {{19}}; + multiTypeBlockMatrix_check[_0][_1] = {{18, 17}}; + multiTypeBlockMatrix_check[_1][_0] = {{16}, {15}}; + multiTypeBlockMatrix_check[_1][_1] = {{14, 13}, {12, 11}}; + using namespace Dune::Hybrid; + forEach(integralRange(size(multiTypeBlockMatrix_a)), [&](auto&& i) { + forEach(integralRange(size(multiTypeBlockMatrix_a[i])), [&](auto && j) { + passed = passed and isCloseDune(multiTypeBlockMatrix_a[i][j], + multiTypeBlockMatrix_check[i][j]); + }); + }); + } // RECTANGULAR MATRICES