Thanks Matt, but sorry I still don't get it. Why does:

static char help[] = "Tests plex distribution and overlaps.\n";

#include <petsc/private/dmpleximpl.h>

int main (int argc, char * argv[]) {

  DM             dm;
  MPI_Comm       comm;
  PetscErrorCode ierr;

  ierr = PetscInitialize(&argc, &argv, NULL, help);if (ierr) return ierr;
  comm = PETSC_COMM_WORLD;

ierr = DMPlexCreateBoxMesh(comm, 2, PETSC_TRUE, NULL, NULL, NULL, NULL, PETSC_TRUE, &dm);CHKERRQ(ierr);
  ierr = DMSetFromOptions(dm);CHKERRQ(ierr);
  ierr = PetscObjectSetName((PetscObject) dm, "Initial DM");CHKERRQ(ierr);
  ierr = DMViewFromOptions(dm, NULL, "-initial_dm_view");CHKERRQ(ierr);


  ierr = DMDestroy(&dm);CHKERRQ(ierr);
  ierr = PetscFinalize();
  return ierr;
}

called with mpiexec -n 2 ./test_overlapV2 -initial_dm_view -dm_plex_box_faces 5,5 -dm_distribute -dm_distribute_overlap 0

give
DM Object: Initial DM 2 MPI processes
  type: plex
Initial DM in 2 dimensions:
  0-cells: 21 21
  1-cells: 45 45
  2-cells: 25 25
Labels:
  depth: 3 strata with value/size (0 (21), 1 (45), 2 (25))
  celltype: 3 strata with value/size (0 (21), 1 (45), 3 (25))
  marker: 1 strata with value/size (1 (21))
  Face Sets: 1 strata with value/size (1 (10))

which is what I expect, while

static char help[] = "Tests plex distribution and overlaps.\n";

#include <petsc/private/dmpleximpl.h>

int main (int argc, char * argv[]) {

  DM             dm, odm;
  MPI_Comm       comm;
  PetscErrorCode ierr;

  ierr = PetscInitialize(&argc, &argv, NULL, help);if (ierr) return ierr;
  comm = PETSC_COMM_WORLD;

ierr = DMPlexCreateBoxMesh(comm, 2, PETSC_TRUE, NULL, NULL, NULL, NULL, PETSC_TRUE, &dm);CHKERRQ(ierr);
  ierr = DMSetFromOptions(dm);CHKERRQ(ierr);
  odm = dm;
  DMPlexDistributeOverlap(odm, 0, NULL, &dm);
  if (!dm) {printf("Big problem\n"); dm = odm;}
  else     {DMDestroy(&odm);}
  ierr = PetscObjectSetName((PetscObject) dm, "Initial DM");CHKERRQ(ierr);
  ierr = DMViewFromOptions(dm, NULL, "-initial_dm_view");CHKERRQ(ierr);


  ierr = DMDestroy(&dm);CHKERRQ(ierr);
  ierr = PetscFinalize();
  return ierr;
}

called with mpiexec -n 2 ./test_overlapV3 -initial_dm_view -dm_plex_box_faces 5,5 -dm_distribute

gives:
DM Object: Initial DM 2 MPI processes
  type: plex
Initial DM in 2 dimensions:
  0-cells: 29 29
  1-cells: 65 65
  2-cells: 37 37
Labels:
  depth: 3 strata with value/size (0 (29), 1 (65), 2 (37))
  celltype: 3 strata with value/size (0 (29), 1 (65), 3 (37))
  marker: 1 strata with value/size (1 (27))
  Face Sets: 1 strata with value/size (1 (13))

which is not what I expect ?

Thanks,

--
Nicolas

On 31/03/2021 19:02, Matthew Knepley wrote:
Alright, I think the problem had to do with keeping track of what DM you were looking at. This code increases the overlap of an initial DM:

static char help[] = "Tests plex distribution and overlaps.\n";

#include <petsc/private/dmpleximpl.h>

int main (int argc, char * argv[]) {

   DM             dm, dm2;
   PetscInt       overlap;
   MPI_Comm       comm;
   PetscErrorCode ierr;

   ierr = PetscInitialize(&argc, &argv, NULL, help);if (ierr) return ierr;
   comm = PETSC_COMM_WORLD;

  ierr = DMPlexCreateBoxMesh(comm, 2, PETSC_TRUE, NULL, NULL, NULL, NULL, PETSC_TRUE, &dm);CHKERRQ(ierr);
   ierr = DMSetFromOptions(dm);CHKERRQ(ierr);
   ierr = PetscObjectSetName((PetscObject) dm, "Initial DM");CHKERRQ(ierr);
   ierr = DMViewFromOptions(dm, NULL, "-initial_dm_view");CHKERRQ(ierr);

   ierr = DMPlexGetOverlap(dm, &overlap);CHKERRQ(ierr);
   ierr = DMPlexDistributeOverlap(dm, overlap+1, NULL, &dm2);CHKERRQ(ierr);
  ierr = PetscObjectSetName((PetscObject) dm2, "More Overlap DM");CHKERRQ(ierr);
   ierr = DMViewFromOptions(dm2, NULL, "-over_dm_view");CHKERRQ(ierr);

   ierr = DMDestroy(&dm2);CHKERRQ(ierr);
   ierr = DMDestroy(&dm);CHKERRQ(ierr);
   ierr = PetscFinalize();
   return ierr;
}

and when we run it we get the expected result

master *:~/Downloads/tmp/Nicolas$ /PETSc3/petsc/apple/bin/mpiexec -n 2 ./test_overlap -initial_dm_view -dm_plex_box_faces 5,5 -dm_distribute -dm_distribute_overlap 1 -over_dm_view
DM Object: Initial DM 2 MPI processes
   type: plex
Initial DM in 2 dimensions:
   0-cells: 29 29
   1-cells: 65 65
   2-cells: 37 37
Labels:
   depth: 3 strata with value/size (0 (29), 1 (65), 2 (37))
   celltype: 3 strata with value/size (0 (29), 1 (65), 3 (37))
   marker: 1 strata with value/size (1 (27))
   Face Sets: 1 strata with value/size (1 (13))
DM Object: More Overlap DM 2 MPI processes
   type: plex
More Overlap DM in 2 dimensions:
   0-cells: 36 36
   1-cells: 85 85
   2-cells: 50 50
Labels:
   depth: 3 strata with value/size (0 (36), 1 (85), 2 (50))
   celltype: 3 strata with value/size (0 (36), 1 (85), 3 (50))
   marker: 1 strata with value/size (1 (40))
   Face Sets: 1 strata with value/size (1 (20))

   Thanks,

      Matt

On Wed, Mar 31, 2021 at 12:57 PM Matthew Knepley <[email protected] <mailto:[email protected]>> wrote:

    Okay, let me show a really simple example that gives the expected
    result before I figure out what is going wrong for you. This code

    static char help[] = "Tests plex distribution and overlaps.\n";

    #include <petsc/private/dmpleximpl.h>

    int main (int argc, char * argv[]) {
       DM                    dm;
       MPI_Comm       comm;
       PetscErrorCode ierr;

       ierr = PetscInitialize(&argc, &argv, NULL, help);if (ierr) return
    ierr;
       comm = PETSC_COMM_WORLD;

       ierr = DMPlexCreateBoxMesh(comm, 2, PETSC_TRUE, NULL, NULL, NULL,
    NULL, PETSC_TRUE, &dm);CHKERRQ(ierr);
       ierr = DMSetFromOptions(dm);CHKERRQ(ierr);
       ierr = PetscObjectSetName((PetscObject) dm, "Initial
    DM");CHKERRQ(ierr);
       ierr = DMViewFromOptions(dm, NULL, "-initial_dm_view");CHKERRQ(ierr);
       ierr = DMDestroy(&dm);CHKERRQ(ierr);
       ierr = PetscFinalize();
       return ierr;
    }

    can do all the overlap tests. For example, you can run it naively
    and get a serial mesh

    master *:~/Downloads/tmp/Nicolas$ /PETSc3/petsc/apple/bin/mpiexec -n
    2 ./test_overlap -initial_dm_view -dm_plex_box_faces 5,5
    DM Object: Initial DM 2 MPI processes
       type: plex
    Initial DM in 2 dimensions:
       0-cells: 36 0
       1-cells: 85 0
       2-cells: 50 0
    Labels:
       celltype: 3 strata with value/size (0 (36), 3 (50), 1 (85))
       depth: 3 strata with value/size (0 (36), 1 (85), 2 (50))
       marker: 1 strata with value/size (1 (40))
       Face Sets: 1 strata with value/size (1 (20))

    Then run it telling Plex to distribute after creating the mesh

    master *:~/Downloads/tmp/Nicolas$ /PETSc3/petsc/apple/bin/mpiexec -n
    2 ./test_overlap -initial_dm_view -dm_plex_box_faces 5,5 -dm_distribute
    DM Object: Initial DM 2 MPI processes
       type: plex
    Initial DM in 2 dimensions:
       0-cells: 21 21
       1-cells: 45 45
       2-cells: 25 25
    Labels:
       depth: 3 strata with value/size (0 (21), 1 (45), 2 (25))
       celltype: 3 strata with value/size (0 (21), 1 (45), 3 (25))
       marker: 1 strata with value/size (1 (21))
       Face Sets: 1 strata with value/size (1 (10))

    The get the same thing back with overlap = 0

    master *:~/Downloads/tmp/Nicolas$ /PETSc3/petsc/apple/bin/mpiexec -n
    2 ./test_overlap -initial_dm_view -dm_plex_box_faces 5,5
    -dm_distribute -dm_distribute_overlap 0
    DM Object: Initial DM 2 MPI processes
       type: plex
    Initial DM in 2 dimensions:
       0-cells: 21 21
       1-cells: 45 45
       2-cells: 25 25
    Labels:
       depth: 3 strata with value/size (0 (21), 1 (45), 2 (25))
       celltype: 3 strata with value/size (0 (21), 1 (45), 3 (25))
       marker: 1 strata with value/size (1 (21))
       Face Sets: 1 strata with value/size (1 (10))

    and get larger local meshes with overlap = 1

    master *:~/Downloads/tmp/Nicolas$ /PETSc3/petsc/apple/bin/mpiexec -n
    2 ./test_overlap -initial_dm_view -dm_plex_box_faces 5,5
    -dm_distribute -dm_distribute_overlap 1
    DM Object: Initial DM 2 MPI processes
       type: plex
    Initial DM in 2 dimensions:
       0-cells: 29 29
       1-cells: 65 65
       2-cells: 37 37
    Labels:
       depth: 3 strata with value/size (0 (29), 1 (65), 2 (37))
       celltype: 3 strata with value/size (0 (29), 1 (65), 3 (37))
       marker: 1 strata with value/size (1 (27))
       Face Sets: 1 strata with value/size (1 (13))

       Thanks,

          Matt

    On Wed, Mar 31, 2021 at 12:22 PM Nicolas Barral
    <[email protected]
    <mailto:[email protected]>> wrote:



        @+

-- Nicolas

        On 31/03/2021 17:51, Matthew Knepley wrote:
         > On Sat, Mar 27, 2021 at 9:27 AM Nicolas Barral
         > <[email protected]
        <mailto:[email protected]>
         > <mailto:[email protected]
        <mailto:[email protected]>>> wrote:
         >
         >     Hi all,
         >
         >     First, I'm not sure I understand what the overlap
        parameter in
         >     DMPlexDistributeOverlap does. I tried the following:
        generate a small
         >     mesh on 1 rank with DMPlexCreateBoxMesh, then distribute
        it with
         >     DMPlexDistribute. At this point I have two nice
        partitions, with shared
         >     vertices and no overlapping cells. Then I call
        DMPlexDistributeOverlap
         >     with the overlap parameter set to 0 or 1, and get the
        same resulting
         >     plex in both cases. Why is that ?
         >
         >
         > The overlap parameter says how many cell adjacencies to go
        out. You
         > should not get the same
         > mesh out. We have lots of examples that use this. If you send
        your small
         > example, I can probably
         > tell you what is happening.
         >

        Ok so I do have a small example on that and the DMClone thing I
        set up
        to understand! I attach it to the email.

        For the overlap, you can change the overlap constant at the top
        of the
        file. With OVERLAP=0 or 1, the distributed overlapping mesh
        (shown using
        -over_dm_view, it's DMover) are the same, and different from the
        mesh
        before distributing the overlap (shown using -distrib_dm_view). For
        larger overlap values they're different.

        The process is:
        1/ create a DM dm on 1 rank
        2/ clone dm into dm2
        3/ distribute dm
        4/ clone dm into dm3
        5/ distribute dm overlap

        I print all the DMs after each step. dm has a distributed
        overlap, dm2
        is not distributed, dm3 is distributed but without overlap. Since
        distribute and distributeOverlap create new DMs, I don't seem
        have a
        problem with the shallow copies.


         >     Second, I'm wondering what would be a good way to handle
        two overlaps
         >     and associated local vectors. In my adaptation code, the
        remeshing
         >     library requires a non-overlapping mesh, while the
        refinement criterion
         >     computation is based on hessian computations, which
        require a layer of
         >     overlap. What I can do is clone the dm before
        distributing the overlap,
         >     then manage two independent plex objects with their own
        local sections
         >     etc. and copy/trim local vectors manually. Is there a
        more automatic
         >     way
         >     to do this ?
         >
         >
         > DMClone() is a shallow copy, so that will not work. You would
        maintain
         > two different Plexes, overlapping
         > and non-overlapping, with their own sections and vecs. Are
        you sure you
         > need to keep around the non-overlapping one?
         > Maybe if I understood what operations you want to work, I
        could say
         > something more definitive.
         >
        I need to be able to pass the non-overlapping mesh to the
        remesher. I
        can either maintain 2 plexes, or trim the overlapping plex when
        I create
        the arrays I give to the remesher. I'm not sure which is the
        best/worst ?

        Thanks

-- Nicolas


         >    Thanks,
         >
         >       Matt
         >
         >     Thanks
         >
         >     --
         >     Nicolas
         >
         >
         >
         > --
         > 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://www.cse.buffalo.edu/~knepley/
        <http://www.cse.buffalo.edu/~knepley/>



-- 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://www.cse.buffalo.edu/~knepley/
    <http://www.cse.buffalo.edu/~knepley/>



--
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://www.cse.buffalo.edu/~knepley/ <http://www.cse.buffalo.edu/~knepley/>

Reply via email to