<div dir="ltr">Dear PETSc users,<div><br></div><div>I am tinkering with DMPlex. I am trying to import a .msh file with some labelling over it (the mesh is 3D. Some are labels over points within a 3D volume, others are labels over points lying on a surface for boundary conditions). However, this is what I get in the preamble of my msh file for the "PhysicalNames" part:</div><div><br></div>





<p class="gmail-p1" style="margin:0px;font-variant-numeric:normal;font-variant-east-asian:normal;font-variant-alternates:normal;font-size-adjust:none;font-kerning:auto;font-feature-settings:normal;font-stretch:normal;font-size:13px;line-height:normal;font-family:"Helvetica Neue"">$PhysicalNames</p>
<p class="gmail-p1" style="margin:0px;font-variant-numeric:normal;font-variant-east-asian:normal;font-variant-alternates:normal;font-size-adjust:none;font-kerning:auto;font-feature-settings:normal;font-stretch:normal;font-size:13px;line-height:normal;font-family:"Helvetica Neue"">6</p>
<p class="gmail-p1" style="margin:0px;font-variant-numeric:normal;font-variant-east-asian:normal;font-variant-alternates:normal;font-size-adjust:none;font-kerning:auto;font-feature-settings:normal;font-stretch:normal;font-size:13px;line-height:normal;font-family:"Helvetica Neue"">2 4 "surf1"</p>
<p class="gmail-p1" style="margin:0px;font-variant-numeric:normal;font-variant-east-asian:normal;font-variant-alternates:normal;font-size-adjust:none;font-kerning:auto;font-feature-settings:normal;font-stretch:normal;font-size:13px;line-height:normal;font-family:"Helvetica Neue"">2 5 "surf2"</p>
<p class="gmail-p1" style="margin:0px;font-variant-numeric:normal;font-variant-east-asian:normal;font-variant-alternates:normal;font-size-adjust:none;font-kerning:auto;font-feature-settings:normal;font-stretch:normal;font-size:13px;line-height:normal;font-family:"Helvetica Neue"">2 6 "boundary"</p>
<p class="gmail-p1" style="margin:0px;font-variant-numeric:normal;font-variant-east-asian:normal;font-variant-alternates:normal;font-size-adjust:none;font-kerning:auto;font-feature-settings:normal;font-stretch:normal;font-size:13px;line-height:normal;font-family:"Helvetica Neue"">3 1 "vol1"</p>
<p class="gmail-p1" style="margin:0px;font-variant-numeric:normal;font-variant-east-asian:normal;font-variant-alternates:normal;font-size-adjust:none;font-kerning:auto;font-feature-settings:normal;font-stretch:normal;font-size:13px;line-height:normal;font-family:"Helvetica Neue"">3 2 "vol2"</p>
<p class="gmail-p1" style="margin:0px;font-variant-numeric:normal;font-variant-east-asian:normal;font-variant-alternates:normal;font-size-adjust:none;font-kerning:auto;font-feature-settings:normal;font-stretch:normal;font-size:13px;line-height:normal;font-family:"Helvetica Neue"">3 3 "vol3"</p>
<div><span style="font-family:"Helvetica Neue";font-size:13px">$EndPhysicalNames</span> </div><div><br></div><div>I import the mesh through a function which should create a distributed mesh through all the MPI processes:</div><div><br></div><div>PetscErrorCode ImportMsh(const char meshname[], DM *dm) {<br>    PetscErrorCode ierr;<br>    DM distributedDM = NULL;<br><br>    // Create a DMPlex object and set its type<br>    ierr = DMCreate(PETSC_COMM_WORLD, dm); CHKERRQ(ierr);<br>    ierr = DMSetType(*dm, DMPLEX); CHKERRQ(ierr);<br><br>    // Import the mesh from an external gmsh file<br>    ierr = DMPlexCreateGmshFromFile(PETSC_COMM_WORLD, meshname, PETSC_TRUE, dm); CHKERRQ(ierr);<br><br>    // Distribute the mesh across processors<br>    ierr = DMPlexDistribute(*dm, 0, NULL, &distributedDM); CHKERRQ(ierr);<br>    if (distributedDM) {<br>        ierr = DMDestroy(dm); CHKERRQ(ierr);<br>        *dm = distributedDM;<br>    }</div><div><br></div><div>    // View DMPlex<br>    DMView(*dm,PETSC_VIEWER_STDOUT_WORLD);<br>    return ierr;<br>}<br></div><div><br></div><div>The output of DMView with 1 processor is the following:</div><div><br></div><div>DM Object: DM_0x12a623ae0_0 1 MPI process<br>  type: plex<br>DM_0x12a623ae0_0 in 3 dimensions:<br>  Number of 0-cells per rank: 730<br>  Number of 1-cells per rank: 4010<br>  Number of 2-cells per rank: 6100<br>  Number of 3-cells per rank: 2819<br>Labels:<br>  celltype: 4 strata with value/size (0 (730), 6 (2819), 3 (6100), 1 (4010))<br>  depth: 4 strata with value/size (0 (730), 1 (4010), 2 (6100), 3 (2819))<br>  Cell Sets: 3 strata with value/size (2 (311), 3 (322), 1 (2186))<br>  Face Sets: 3 strata with value/size (6 (924), 4 (516), 5 (4))<br></div><div><br></div><div>While for 2 processes i get:</div><div><br></div><div>DM Object: Parallel Mesh 2 MPI processes<br>  type: plex<br>Parallel Mesh in 3 dimensions:<br>  Number of 0-cells per rank: 625 713<br>  Number of 1-cells per rank: 2792 3187<br>  Number of 2-cells per rank: 3546 3759<br>  Number of 3-cells per rank: 1410 1409<br>Labels:<br>  depth: 4 strata with value/size (0 (625), 1 (2792), 2 (3546), 3 (1410))<br>  celltype: 4 strata with value/size (0 (625), 1 (2792), 3 (3546), 6 (1410))<br>  Cell Sets: 3 strata with value/size (1 (777), 2 (311), 3 (322))<br>  Face Sets: 3 strata with value/size (4 (516), 5 (4), 6 (247))<br></div><div><br></div><div><b>First question: </b>Where are the labels I gave in the .msh file? My interpretation here is that they are the numbers in brackets: for example, 6 (924) means that 924 Face elements are marked with 6, which corresponds to "boundary" in my .msh file. However, in the 2 processors DMView I get different number of elements. Again, my intuition is that only proc 0 labels are printed.</div><div><br></div><div><b>Second question: </b>Suppose I wanted to fill a matrix only in the entries corresponding to the nodes of the elements marked with 5, namely "surf2". How can I do that?</div><div><br></div><div>So far, I have used<br>ierr = DMPlexGetDepthStratum(dm, 2, &pStart, &pEnd); CHKERRQ(ierr); </div><div><br></div><div>in order to get pStart and pEnd for the stratum related to faces (2).</div><div><br></div><div>Then I looped over p from pStart to pEnd in order to select the faces which are marked with 5 (I cannot access directly to points since they do not seem to be marked at all).</div><div>For the selected faces, I used</div><div>ierr = DMPlexGetConeSize(dm, p, &coneSize1); CHKERRQ(ierr);<br>ierr = DMPlexGetCone(dm, p, &cone); CHKERRQ(ierr);<br></div><div><br></div><div>in order to retrieve the edges associated to each marked face, then I used again GetConeSize and GetCone in order to access the vertices and managed to build an IS object with the points I need (using also ISSortRemoveDups to remove duplicates). But here I am stuck, since printing this IS gives the right number of vertices, but with different local numberings depending on the number of processors used and with a variable offset depending on the local DAG associated to the local DMPlex. </div><div>I wonder if there exists a less cumbersome way to perform this task...</div><div><br></div><div>Thank you in advance,</div><div>Edoardo</div></div>