[petsc-users] Element connectivity of a DMPlex
Matthew Knepley
knepley at gmail.com
Thu May 22 19:56:27 CDT 2025
On Thu, May 22, 2025 at 12:25 PM Noam T. <dontbugthedevs at proton.me> wrote:
> Hello,
>
> Thank you the various options.
>
> Use case here would be obtaining the exact output generated by option 1),
> DMView() with PETSC_VIEWER_HDF5_VIZ; in particular, the matrix generated
> under /viz/topology/cells.
>
> There are several ways you might do this. It helps to know what you are
> aiming for.
>
> 1) If you just want this output, it might be easier to just DMView() with
> the PETSC_VIEWER_HDF5_VIZ format, since that just outputs the cell-vertex
> topology and coordinates
>
>
> Is it possible to get this information in memory, onto a Mat, Vec or some
> other Int array object directly? it would be handy to have it in order to
> manipulate it and/or save it to a different format/file. Saving to an HDF5
> and loading it again seems redundant.
>
>
> 2) You can call DMPlexUninterpolate() to produce a mesh with just cells
> and vertices, and output it in any format.
>
> 3) If you want it in memory, but still with global indices (I don't
> understand this use case), then you can use DMPlexCreatePointNumbering()
> for an overall global numbering, or DMPlexCreateCellNumbering() and
> DMPlexCreateVertexNumbering() for separate global numberings.
>
>
> Perhaps I missed it, but getting the connectivity matrix in
> /viz/topology/cells/ did not seem directly trivial to me from the list of
> global indices returned by DMPlexGetCell/Point/VertexNumbering() (i.e. I
> assume all the operations done when calling DMView()).
>
Something like
DMPlexGetHeightStratum(dm, 0, &cStart, &cEnd);
DMPlexGetDepthStratum(dm, 0, &vStart, &vEnd);
DMPlexGetVertexNumbering(dm, &globalVertexNumbers);
ISGetIndices(globalVertexNumbers, &gv);
for (PetscInt c = cStart; c < cEnd; ++c) {
PetscInt *closure = NULL;
DMPlexGetTransitiveClosure(dm, c, PETSC_TRUE, &Ncl, &closure);
for (PetscInt cl = 0; c < Ncl * 2; cl += 2) {
if (closure[cl] < vStart || closure[cl] >= vEnd) continue;
const PetscInt v = gv[closure[cl]] < 0 ? -(gv[closure[cl]] + 1) :
gv[closure[cl]];
// Do something with v
}
DMPlexRestoreTransitiveClosure(dm, c, PETSC_TRUE, &Ncl, &closure);
}
ISRestoreIndices(globalVertexNumbers, &gv);
ISDestroy(&globalVertexNumbers);
Thanks,
Matt
> Thanks,
> Noam.
>
--
What most experimenters take for granted before they begin their
experiments is infinitely more interesting than any results to which their
experiments lead.
-- Norbert Wiener
https://urldefense.us/v3/__https://www.cse.buffalo.edu/*knepley/__;fg!!G_uCfscf7eWS!c-kIsacyZtVK0QT5hSQ6TYjx-_vFWjrr6SXhV0Q8o9GcMLSLwko9mlT7CXjpNSVCT4bRPKeSkCoQJMg2SkFk$ <https://urldefense.us/v3/__http://www.cse.buffalo.edu/*knepley/__;fg!!G_uCfscf7eWS!c-kIsacyZtVK0QT5hSQ6TYjx-_vFWjrr6SXhV0Q8o9GcMLSLwko9mlT7CXjpNSVCT4bRPKeSkCoQJGpFQC8u$ >
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20250522/c15245d1/attachment.html>
More information about the petsc-users
mailing list