Draft: Add support for partial matrix patterns to ISTLMatrixBackend and global assembler
This adds support for assembling into matrices with 'partial' pattern, i.e. matrices, whose pattern do not contain entries for all pairs of basis functions that share an element. To this end it introduces the following:
- Add
ISTLMatrixBackend::addToEntry(row,col,value)
.
This method adds a value to an entry. In contrast tomatrixBackend(row,col) += value
, the newmatrixBackend.addToEntry(row,col,value)
can ignore nonexisting entries to support e.g.DiagonalMatrix
. - Use
backend.addToEntry(row, col, value)
instead ofbackend(row, col) += value
in global assembler. - Test partial pattern with local
DiagonalMatrix
andScaledIdentityMatrix
by assembling a mass matrix.
This is currently marked WIP, because:
- I'm not fully convinced by the way this is implemented in the backend. While the current solution works, it is a little hard to understand.
- The behavior and difference of
operator()(row, col)
,operator()(row, col) const
, andaddToEntry(row,col,value)
should be documented carefully. - This only partially solves #25. While it allows to use the global operator assembler with partial pattern, this does not happen with optimal efficiency, because the global assembler still tries to write all entries (but non-existing ones are ignored by the backend).
- This needs proper testing.
An extension to at least technically allow (semi) optimal efficiency would be to let the backend fully handle the distribution of the local matrix. Then one would use something like backend.accumulateEntries(rowIndices, colIndices, localMatrix)
in the global assembler. The default implementation could do what is proposed in the present MR. But one could then provide a custom backend that only touches the needed entries. However, this custom backend would not just be a specialization for the matrix type but also rely on some knowledge of the used index scheme.