Hi Blaise,
On Thu, 16 Feb 2023 at 15:17, Blaise Bourdin <[email protected]> wrote:
>
> Hi,
>
> I am trying to implement a non-local finite elements reconstruction operator
> in parallel.
>
> Given a dmplex distributed with an overlap, is there a way to figure out
> which cells are in the overlap and which are not?
Yes. Get the pointSF of the DM, and the cell chart
DMPlexGetPointSF(dm, &sf);
DMPlexGetHeightStratum(dm, 0, &cstart, &cend);
Now get the graph (specifically ilocal of the sf):
PetscSFGetGraph(sf, NULL, &nleaves, &ilocal, NULL);
Now any value of ilocal that lies in [cstart, cend) is a cell which is
not owned by this process (i.e. in the overlap). Note that ilocal can
be NULL which just means it is the identity map [0, ..., nleaves), so
you just intersect [cstart, cend) with [0, nleaves) in that case to
find the overlap cells.
But that is very unlikely to be true, so:
for (PetscInt i = 0; i < nleaves; i++) {
if (cstart <= ilocal[i] && ilocal[i] < cend) {
// i is an overlap cell
}
}
> Alternatively, suppose that I distribute the same DM with and without an
> overlap. Is there any warranty that the distributions are compatible (i.e.
> coincide when the overlap is ignored)? If this is the case, can I assume that
> the non-overlap cells are numbered first in the overlapped dm?
If you do:
DMPlexDistribute(dm, 0, &migrationSF, ¶lleldm);
DMPlexDistributeOverlap(paralleldm, 1, &migrationSF2, &overlapdm);
Then paralleldm and overlapdm will be compatible, and I think it is
still the case that the overlap cells are numbered last (and
contiguously).
If you just do DMPlexDistribute(dm, 1, &migrationSF, &overlapdm) then
you obviously don't have the non-overlapped one to compare, but it is
in this case still true that the overlap cells are numbered last.
Thanks,
Lawrence