37 using MatrixBlock =
typename Dune::FieldMatrix<Scalar, 1, 1>;
50 const auto numRows = getNumRows_(A);
53 auto M = BCRSMatrix(numRows, numRows, BCRSMatrix::random);
56 setOccupationPattern_(M, A);
70 static void setOccupationPattern_(BCRSMatrix& M,
const MultiTypeBlockMatrix& A)
73 const auto numRows = M.N();
74 Dune::MatrixIndexSet occupationPattern;
75 occupationPattern.resize(numRows, numRows);
78 auto addIndices = [&](
const auto& subMatrix,
const std::size_t startRow,
const std::size_t startCol)
81 using Magnitude =
typename Dune::FieldTraits<Scalar>::real_type;
82 static const Magnitude eps =
getParam<Magnitude>(
"MatrixConverter.DeletePatternEntriesBelowAbsThreshold", -1.0);
84 using BlockType =
typename std::decay_t<
decltype(subMatrix)>::block_type;
85 const auto blockSizeI = BlockType::rows;
86 const auto blockSizeJ = BlockType::cols;
87 for(
auto row = subMatrix.begin(); row != subMatrix.end(); ++row)
88 for(
auto col = row->begin(); col != row->end(); ++col)
89 for(std::size_t i = 0; i < blockSizeI; ++i)
90 for(std::size_t j = 0; j < blockSizeJ; ++j)
91 if(abs(subMatrix[row.index()][col.index()][i][j]) > eps)
92 occupationPattern.add(startRow + row.index()*blockSizeI + i, startCol + col.index()*blockSizeJ + j);
96 using namespace Dune::Hybrid;
97 std::size_t rowIndex = 0;
98 forEach(std::make_index_sequence<MultiTypeBlockMatrix::N()>(), [&A, &addIndices, &rowIndex, numRows](
const auto i)
100 std::size_t colIndex = 0;
101 forEach(A[i], [&](
const auto& subMatrix)
103 addIndices(subMatrix, rowIndex, colIndex);
105 using SubBlockType =
typename std::decay_t<
decltype(subMatrix)>::block_type;
107 colIndex += SubBlockType::cols * subMatrix.M();
110 if(colIndex == numRows)
111 rowIndex += SubBlockType::rows * subMatrix.N();
115 occupationPattern.exportIdx(M);
124 static void copyValues_(BCRSMatrix& M,
const MultiTypeBlockMatrix& A)
127 const auto numRows = M.N();
130 auto copyValues = [&](
const auto& subMatrix,
const std::size_t startRow,
const std::size_t startCol)
133 using Magnitude =
typename Dune::FieldTraits<Scalar>::real_type;
134 static const Magnitude eps =
getParam<Magnitude>(
"MatrixConverter.DeletePatternEntriesBelowAbsThreshold", -1.0);
136 using BlockType =
typename std::decay_t<
decltype(subMatrix)>::block_type;
137 const auto blockSizeI = BlockType::rows;
138 const auto blockSizeJ = BlockType::cols;
139 for (
auto row = subMatrix.begin(); row != subMatrix.end(); ++row)
140 for (
auto col = row->begin(); col != row->end(); ++col)
141 for (std::size_t i = 0; i < blockSizeI; ++i)
142 for (std::size_t j = 0; j < blockSizeJ; ++j)
143 if(abs(subMatrix[row.index()][col.index()][i][j]) > eps)
144 M[startRow + row.index()*blockSizeI + i][startCol + col.index()*blockSizeJ + j] = subMatrix[row.index()][col.index()][i][j];
148 using namespace Dune::Hybrid;
149 std::size_t rowIndex = 0;
150 forEach(std::make_index_sequence<MultiTypeBlockMatrix::N()>(), [&A, ©Values, &rowIndex, numRows](
const auto i)
152 std::size_t colIndex = 0;
153 forEach(A[i], [&](
const auto& subMatrix)
155 copyValues(subMatrix, rowIndex, colIndex);
157 using SubBlockType =
typename std::decay_t<
decltype(subMatrix)>::block_type;
159 colIndex += SubBlockType::cols * subMatrix.M();
162 if(colIndex == numRows)
163 rowIndex += SubBlockType::rows * subMatrix.N();
173 static std::size_t getNumRows_(
const MultiTypeBlockMatrix& A)
176 std::size_t numRows = 0;
177 Dune::Hybrid::forEach(Dune::Hybrid::elementAt(A, Dune::Indices::_0), [&numRows](
const auto& subMatrixInFirstRow)
180 const auto numEq = std::decay_t<
decltype(subMatrixInFirstRow)>::block_type::cols;
181 numRows += numEq * subMatrixInFirstRow.M();