<div dir="ltr"><div dir="ltr">On Wed, Oct 27, 2021 at 3:15 AM Pierre Seize <<a href="mailto:pierre.seize@onera.fr">pierre.seize@onera.fr</a>> wrote:<br></div><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<div bgcolor="#FFFFFF">
<p><br>
</p>
<br>
<div>On 26/10/21 22:28, Matthew Knepley
wrote:<br>
</div>
<blockquote type="cite">
<div dir="ltr">
<div dir="ltr">On Tue, Oct 26, 2021 at 10:17 AM Pierre Seize
<<a href="mailto:pierre.seize@onera.fr" target="_blank">pierre.seize@onera.fr</a>> wrote:<br>
</div>
<div class="gmail_quote">
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<div bgcolor="#FFFFFF">
<p>Hi, I had the idea to try and renumber my mesh cells,
as I've heard it's better: "neighbouring cells are
stored next to one another, and memory access are
faster".</p>
Right now, I load the mesh then I distribute it over the
processes. I thought I'd try to permute the numbering
between those two steps :<br>
<blockquote><tt>DMPlexCreateFromFile</tt><tt><br>
</tt><tt>DMPlexGetOrdering</tt><tt><br>
</tt><tt>DMPlexPermute</tt><tt><br>
</tt><tt>DMPlexDistribute</tt></blockquote>
<p>but that gives me an error when it runs on more than
one process:</p>
<p><tt>[0]PETSC ERROR: --------------------- Error Message
--------------------------------------------------------------</tt><tt><br>
</tt><tt>[0]PETSC ERROR: No support for this operation
for this object type</tt><tt><br>
</tt><tt>[0]PETSC ERROR: Number of dofs for point 0 in
the local section should be positive</tt><tt><br>
</tt><tt>[0]PETSC ERROR: See <a href="https://petsc.org/release/faq/" target="_blank">https://petsc.org/release/faq/</a>
for trouble shooting.</tt><tt><br>
</tt><tt>[0]PETSC ERROR: Petsc Release Version 3.16.0,
unknown </tt><tt><br>
</tt><tt>[0]PETSC ERROR: ./build/bin/yanss on a named
ldmpe202z.onera by pseize Tue Oct 26 16:03:33 2021</tt><tt><br>
</tt><tt>[0]PETSC ERROR: Configure options
--PETSC_ARCH=arch-ld-gcc --download-metis
--download-parmetis --prefix=~/.local --with-cgns</tt><tt><br>
</tt><tt>[0]PETSC ERROR: #1
PetscPartitionerDMPlexPartition() at
/stck/pseize/softwares/petsc/src/dm/impls/plex/plexpartition.c:720</tt><tt><br>
</tt><tt>[0]PETSC ERROR: #2 DMPlexDistribute() at
/stck/pseize/softwares/petsc/src/dm/impls/plex/plexdistribute.c:1630</tt><tt><br>
</tt><tt>[0]PETSC ERROR: #3 MeshLoadFromFile() at
src/spatial.c:689</tt><tt><br>
</tt><tt>[0]PETSC ERROR: #4 main() at src/main.c:22</tt><tt><br>
</tt><tt>[0]PETSC ERROR: PETSc Option Table entries:</tt><tt><br>
</tt><tt>[0]PETSC ERROR: -draw_comp 0</tt><tt><br>
</tt><tt>[0]PETSC ERROR: -mesh data/box.msh</tt><tt><br>
</tt><tt>[0]PETSC ERROR: -mesh_view draw</tt><tt><br>
</tt><tt>[0]PETSC ERROR: -riemann anrs</tt><tt><br>
</tt><tt>[0]PETSC ERROR: -ts_max_steps 100</tt><tt><br>
</tt><tt>[0]PETSC ERROR: -vec_view_partition</tt><tt><br>
</tt><tt>[0]PETSC ERROR: ----------------End of Error
Message -------send entire error message to <a href="mailto:petsc-maint@mcs.anl.gov" target="_blank">petsc-maint@mcs.anl.gov</a>----------</tt><br>
<br>
</p>
<p>I checked and before I tried to reorder the mesh, the <tt>dm-></tt><tt>localSection</tt>
was <tt>NULL</tt> before entering <tt>DMPlexDistribute</tt>,
and I was able to fix the error with <tt>DMSetLocalSection(dm,
NULL)</tt> after <tt>DMPlexPermute</tt>, but it
doesn't seems it's the right way to do what I want. Does
someone have any advice ?</p>
</div>
</blockquote>
<div>Oh, this is probably me trying to be too clever. If a
local section is defined, then I try to use the number of
dofs in it to load balance better.</div>
<div>There should never be a negative number of dofs in the
local section (a global section uses this to indicate a
dof owned by another process).</div>
<div>So eliminating the local section will definitely fix that
error.</div>
<div><br>
</div>
<div>Now the question of how you got a local section.
DMPlexPermute() does not create one, so it seems like you
had one ahead of time, and that</div>
<div>the values were not valid.</div>
</div>
</div>
</blockquote>
<br>
<tt>DMPlexPermute</tt> calls <tt>DMGetLocalSection</tt>, which
creates <tt>dm->localSection</tt> if it's <tt>NULL</tt>, so
before <tt>DMPlexPermute</tt> my <tt>dm->localSection</tt> is <tt>NULL</tt>,
and after it is set. Because of that I enter the if in <tt>src/dm/impls/plex/plexpartition.c:707</tt>
and then I got the error.<br>
<tt> </tt>If i have a "wrong" <tt>dm->localSection</tt>, I
think it has to come from <tt>DMPlexPermute</tt>.<br>
<br>
<blockquote type="cite">
<div dir="ltr">
<div class="gmail_quote">
<div>Note that you can probably get rid of some of the loading
code using</div>
<div><br>
</div>
<div> DMCreate(comm, &dm);</div>
<div> DMSetType(dm, DMPLEX);</div>
<div> DMSetFromOptions(dm);</div>
<div> DMViewFromOptions(dm, NULL, "-mesh_view");</div>
<div><br>
</div>
<div>and use</div>
<div><br>
</div>
<div> -dm_plex_filename databox,msh -mesh_view</div>
</div>
</div>
</blockquote>
<br>
My loading code is already small, but just to make sure I wrote this
minimal example:<br>
<tt><br>
int main(int argc, char **argv){<br>
PetscErrorCode ierr;<br>
<br>
ierr = PetscInitialize(&argc, &argv, NULL, help); if
(ierr) return ierr;<br>
<br>
DM dm, foo_dm;<br>
ierr = DMCreate(PETSC_COMM_WORLD, &dm); CHKERRQ(ierr);<br>
ierr = DMSetType(dm, DMPLEX); CHKERRQ(ierr);<br>
ierr = DMSetFromOptions(dm); CHKERRQ(ierr);<br>
<br>
IS perm;<br>
ierr = DMPlexGetOrdering(dm, NULL, NULL, &perm);
CHKERRQ(ierr);<br>
ierr = DMPlexPermute(dm, perm, &foo_dm); CHKERRQ(ierr);<br>
if (foo_dm) {<br>
ierr = DMDestroy(&dm); CHKERRQ(ierr);<br>
dm = foo_dm;<br>
}<br>
ierr = DMPlexDistribute(dm, 2, NULL, &foo_dm);
CHKERRQ(ierr);<br>
if (foo_dm) {<br>
ierr = DMDestroy(&dm); CHKERRQ(ierr);<br>
dm = foo_dm;<br>
}<br>
<br>
ierr = ISDestroy(&perm); CHKERRQ(ierr);<br>
ierr = DMDestroy(&dm); CHKERRQ(ierr);<br>
ierr = PetscFinalize();<br>
return ierr;<br>
}</tt><br>
<br>
ran with <tt>mpiexec -n 2 ./build/bin/yanss -dm_plex_filename
data/box.msh</tt>. The mesh is a 2D box from GMSH but I've got the
same result with any mesh I've tried. It runs fine with 1 process
but gives the previous error for more processes.<br></div></blockquote><div><br></div><div>Hi Pierre,</div><div><br></div><div>You are right. This is my bug. Here is the fix:</div><div><br></div><div> <a href="https://gitlab.com/petsc/petsc/-/merge_requests/4504">https://gitlab.com/petsc/petsc/-/merge_requests/4504</a></div><div><br></div><div>Is it possible to try this branch?</div><div><br></div><div> Thanks,</div><div><br></div><div> Matt</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div bgcolor="#FFFFFF">
Pierre<br>
</div>
</blockquote></div><br clear="all"><div><br></div>-- <br><div dir="ltr" class="gmail_signature"><div dir="ltr"><div><div dir="ltr"><div><div dir="ltr"><div>What most experimenters take for granted before they begin their experiments is infinitely more interesting than any results to which their experiments lead.<br>-- Norbert Wiener</div><div><br></div><div><a href="http://www.cse.buffalo.edu/~knepley/" target="_blank">https://www.cse.buffalo.edu/~knepley/</a><br></div></div></div></div></div></div></div></div>