GenEO for nonoverlapping grids
This builds on top of @peter 's work in order to provide a GenEO preconditioner without requiring a grid with native overlap support.
@peter 's overlaptools allow building artificial overlaps by identifying overlap purely on an algebraic level and exchanging corresponding matrix entries. The input is a nonoverlapping discretization matrix per subdomain, assumed to add up to the global discretization matrix. The output are the respective matrices extended by entries for overlap with neighbors. Also, a partition of unity can be created in a purely algebraic way.
I made some modifications allowing to pass arbitrary local matrices to specific neighbors when constructing overlaps, currently necessitating forked communicators from dune-common. This allows in particular to accurately assemble outer boundaries of overlap regions. The issue are DOFs located on the overlap boundary; Those cannot be drawn from neighbor's discretization matrices, since their interior DOFs will always be integrals including elements extending beyond the overlap in question. Therefore, my approach is to on each subdomain assemble one matrix per neighbor, restricting assembly to exactly the overlap region via suitable EntitySets. Those restricted matrices can then be used as a source for neighbors to construct their overlaps exactly.
Based on this, I added a modified version of the existing GenEO code, which works on these artificial overlaps. It can immediately be applied to for example a parallel UG grid. Another benefit is that, since everything is based on modified EntitySets anyways, I could now incorporate the entire setup of both additional matrices needed for the GenEO eigenproblem into the preconditioner itself. Internally, this works by taking a full operator, but restricting assembly via EntitySets as needed. As a result, the preconditioner is now very easy to apply, requiring only to use a specific EntitySet, passing the discretization matrix and the corresponding GridOperator, and setting a few parameters like overlap size and number of eigenvectors or threshold respectively.
@anne.reinarz and I already added an interface to this in dune-composites, which is working for simple test cases, and we'll soon investigate more complex setups.