Thank you for the code; it provides exactly what I was looking for. Following up on this matter, does this method not work for higher order elements? For example, using an 8-node quadrilateral, exporting to a PETSC_VIEWER_HDF5_VIZ viewer provides the correct matrix of node coordinates in geometry/vertices
(here a quadrilateral in [0, 10]) 5.0, 5.0 0.0, 0.0 10.0, 0.0 10.0, 10.0 0.0, 10.0 5.0, 0.0 10.0, 5.0 5.0, 10.0 0.0, 5.0 but the connectivity in viz/topology is 0 1 2 3 which are likely the corner nodes of the initial, first-order element, before adding extra nodes for the higher degree element. This connectivity values [0, 1, 2, 3, ...] are always the same, including for other elements, whereas the coordinates are correct E.g. for 3rd order triangle in [0, 1], coordinates are given left to right, bottom to top 0, 0 1/3, 0, 2/3, 0, 1, 0 0, 1/3 1/3, 1/3 2/3, 1/3 0, 2/3, 1/3, 2/3 0, 1 but the connectivity (viz/topology/cells) is [0, 1, 2]. Test meshes were created with gmsh from the python API, using gmsh.option.setNumber("Mesh.ElementOrder", n), for n = 1, 2, 3, ... Thank you. Noam On Friday, May 23rd, 2025 at 12:56 AM, Matthew Knepley <knep...@gmail.com> wrote: > On Thu, May 22, 2025 at 12:25 PM Noam T. <dontbugthed...@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/*(http:/*www.cse.buffalo.edu/*knepley/)__;fl0vfg!!G_uCfscf7eWS!cZvIn6-WAARgI-p1R_s8_n7yI_bYSvNOSQA6c46k1dLOGF9AxVvPAYS3bARKuXY6jcvg_zko2D-CUgfpOxYtN35083cDfLZY$ >