I’m writing a C++ VTK filter, and I’m trying to understand the idea of ghost points and how multiblock topology works.
My understanding is that in MPI mode, ExtractSurface should be ignoring boundaries between MPI ranks; i.e. it’s not supposed to identify ghost points as surface points, as suggested by the first paragraph of https://blog.kitware.com/ghost-and-blanking-visibility-changes/. I’m currently feeding data into the MPI pipeline split up into XDMF grids through vtkXdmf3Reader (which evenly distributes grids among ranks), and there’s a short data exchange step to establish the ghost points so that we have the missing points for each cell at the boundaries between domains, but ExtractSurface appears to be ignoring the point ghost array and setting a boundary between domains anyway**. Does ExtractSurface support this MPI-agnostic mode of operation? The goal is to check if the boundaries and between ranks are duplicated and flagged with vtkGhostPoints in a way that’s usable by all Paraview filters.
I also have a few followup questions about ghost point semantics:
Is each rank expected to have a copy of all the PointData associated with each of its ghost points?
How many layers of points should be duplicated (I’ve been assuming just 1 layer is enough?), and should I be working with ghost cells at all if I only have PointData?
Should a duplicated point be marked as a ghost point on both (or all) ranks it’s duplicated across, or should I mark it as a “real point” on exactly one rank?
Are ghost points intended to be a communication-free way of sharing data? (no data sharing after the initial partitioning) Or do Paraview filters handle such communication internally?
** Specifically, each rank owns a rectangular-prism-shaped block of points that shares faces with the blocks owned some other ranks. The points on these faces are being copied to adjacent blocks, and being marked as ghost points on those adjacent blocks.