See image attached.
Connectivity of the top mesh (first order triangle), can be obtained with the 
code shared before.
Connectivity of the bottom mesh (second order triangle) is what I would be 
interested in obtaining.

However, given your clarification on what the Plex and the PetscSection handle, 
it might not work; I am trying to get form the Plex what's only available from 
the PetscSection.

The purpose of this extended connectivity is plotting; in particular, using VTU 
files, where the "connectivity" of cells is required, and the extra nodes would 
be needed when using higher-order elements (e.g. VTK_QUADRATIC_TRIANGLE, 
VTK_QUADRATIC_QUAD, etc).

Perhaps I am over complicating things, and all this information can be obtained 
in a different, simpler way.

Thanks.
Noam
On Tuesday, June 17th, 2025 at 5:42 PM, Matthew Knepley <knep...@gmail.com> 
wrote:

> On Tue, Jun 17, 2025 at 12:43 PM Noam T. <dontbugthed...@proton.me> wrote:
>
>> Thank you. For now, I am dealing with vertices only.
>>
>> Perhaps I did not explain myself properly, or I misunderstood your response.
>> What I meant to say is, given an element of order higher than one, the 
>> connectivity matrix I obtain this way only contains as many entries as the 
>> first order element: 3 for a triangle, 4 for a tetrahedron, etc.
>>
>> Looking at the closure of any cell in the mesh, this is also the 
>> case.However, the nodes are definitely present; e.g. from
>>
>> DMPlexGetCellCoordinates(dm, cell, NULL, nc, NULL, NULL)
>>
>> nc returns the expected value (12 for a 2nd order 6-node planar triangle, 30 
>> for a 2nd order 10-node tetrahedron, etc).
>>
>> The question is, are the indices of these extra nodes obtainable in a 
>> similar way as with the code shared before? So that one can have e.g. [0, 1, 
>> 2, 3, 4, 5] for a second order triangle, not just [0, 1, 2].
>
> I am having a hard time understanding what you are after. I think this is 
> because many FEM approaches confuse topology with analysis.
>
> The Plex stores topology, and you can retrieve adjacencies between any two 
> mesh points.
>
> The PetscSection maps mesh points (cells, faces, edges , vertices) to sets of 
> dofs. This is how higher order elements are implemented. Thus, we do not have 
> to change topology to get different function spaces.
>
> The intended interface is for you to call DMPlexVecGetClosure() to get the 
> closure of a cell (or face, or edge). You can also call 
> DMPlexGetClosureIndices(), but index wrangling is what I intended to 
> eliminate.
>
> What exactly are you looking for here?
>
> Thanks,
>
> Matt
>
>> Thank you.
>> Noam
>> On Friday, June 13th, 2025 at 3:05 PM, Matthew Knepley <knep...@gmail.com> 
>> wrote:
>>
>>> On Thu, Jun 12, 2025 at 4:26 PM Noam T. <dontbugthed...@proton.me> wrote:
>>>
>>>> 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
>>>
>>> If you wanted to include edges/faces, you could do it. First, you would 
>>> need to decide how you would number things For example, would you number 
>>> all points contiguously, or separately number cells, vertices, faces and 
>>> edges. Second, you would check for faces/edges in the closure loop. Right 
>>> now, we only check for vertices.
>>>
>>> I would say that this is what convinced me not to do FEM this way.
>>>
>>> Thanks,
>>>
>>> Matt
>>>
>>>> (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!fRqwbCoztVyyzAJCKwByl_ypV2r7m5XCOxm8fu0m5Tu0Fp8Ghj8I_m2t3XrOU9m7STyykqh6j29GaFAsb7TDQa2L3jVTMgl9$
>>>>>  
>>>
>>> --
>>>
>>> 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!fRqwbCoztVyyzAJCKwByl_ypV2r7m5XCOxm8fu0m5Tu0Fp8Ghj8I_m2t3XrOU9m7STyykqh6j29GaFAsb7TDQa2L3jVTMgl9$
>>>  
>
> --
>
> 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!fRqwbCoztVyyzAJCKwByl_ypV2r7m5XCOxm8fu0m5Tu0Fp8Ghj8I_m2t3XrOU9m7STyykqh6j29GaFAsb7TDQa2L3jVTMgl9$
>  

Attachment: connectivity.pdf
Description: Adobe PDF document

Reply via email to