xref: /petsc/src/dm/impls/plex/tests/ex51.c (revision d71ae5a4db6382e7f06317b8d368875286fe9008)
1 static char help[] = "Tests save/load plex with distribution in HDF5.\n\n";
2 
3 #include <petscdmplex.h>
4 #include <petscsf.h>
5 #include <petsclayouthdf5.h>
6 
7 typedef struct {
8   char fname[PETSC_MAX_PATH_LEN]; /* Output mesh filename */
9 } AppCtx;
10 
11 PetscErrorCode ProcessOptions(MPI_Comm comm, AppCtx *options)
12 {
13   PetscBool flg;
14 
15   PetscFunctionBegin;
16   options->fname[0] = '\0';
17   PetscOptionsBegin(comm, "", "DMPlex View/Load Test Options", "DMPLEX");
18   PetscCall(PetscOptionsString("-fname", "The output mesh file", "ex51.c", options->fname, options->fname, sizeof(options->fname), &flg));
19   PetscOptionsEnd();
20   PetscFunctionReturn(0);
21 }
22 
23 int main(int argc, char **argv)
24 {
25   const char        exampleDMPlexName[]       = "exampleDMPlex";
26   const char        exampleDistributionName[] = "exampleDistribution";
27   PetscViewerFormat format                    = PETSC_VIEWER_HDF5_PETSC;
28   AppCtx            user;
29 
30   PetscCall(PetscInitialize(&argc, &argv, NULL, help));
31   PetscCall(ProcessOptions(PETSC_COMM_WORLD, &user));
32   /* Save */
33   {
34     DM          dm;
35     PetscViewer viewer;
36 
37     PetscCall(PetscViewerHDF5Open(PETSC_COMM_WORLD, user.fname, FILE_MODE_WRITE, &viewer));
38     /* Save exampleDMPlex */
39     {
40       DM               pdm;
41       PetscPartitioner part;
42       const PetscInt   faces[2] = {6, 1};
43       PetscSF          sf;
44       PetscInt         overlap = 1;
45 
46       PetscCall(DMPlexCreateBoxMesh(PETSC_COMM_WORLD, 2, PETSC_FALSE, faces, NULL, NULL, NULL, PETSC_TRUE, &dm));
47       PetscCall(DMPlexGetPartitioner(dm, &part));
48       PetscCall(PetscPartitionerSetFromOptions(part));
49       PetscCall(DMPlexDistribute(dm, overlap, &sf, &pdm));
50       if (pdm) {
51         PetscCall(DMDestroy(&dm));
52         dm = pdm;
53       }
54       PetscCall(PetscSFDestroy(&sf));
55       PetscCall(PetscObjectSetName((PetscObject)dm, exampleDMPlexName));
56       PetscCall(DMPlexDistributionSetName(dm, exampleDistributionName));
57       PetscCall(PetscViewerPushFormat(viewer, format));
58       PetscCall(DMPlexTopologyView(dm, viewer));
59       PetscCall(DMPlexLabelsView(dm, viewer));
60       PetscCall(PetscViewerPopFormat(viewer));
61     }
62     /* Save coordinates */
63     PetscCall(PetscViewerPushFormat(viewer, format));
64     PetscCall(DMPlexCoordinatesView(dm, viewer));
65     PetscCall(PetscViewerPopFormat(viewer));
66     PetscCall(PetscObjectSetName((PetscObject)dm, "Save: DM"));
67     PetscCall(DMViewFromOptions(dm, NULL, "-dm_view"));
68     PetscCall(DMDestroy(&dm));
69     PetscCall(PetscViewerDestroy(&viewer));
70   }
71   /* Load */
72   {
73     DM          dm;
74     PetscSF     sfXC;
75     PetscViewer viewer;
76 
77     PetscCall(PetscViewerHDF5Open(PETSC_COMM_WORLD, user.fname, FILE_MODE_READ, &viewer));
78     /* Load exampleDMPlex */
79     PetscCall(DMCreate(PETSC_COMM_WORLD, &dm));
80     PetscCall(DMSetType(dm, DMPLEX));
81     PetscCall(PetscObjectSetName((PetscObject)dm, exampleDMPlexName));
82     PetscCall(DMPlexDistributionSetName(dm, exampleDistributionName));
83     /* sfXC: X -> C                         */
84     /* X: set of globalPointNumbers, [0, N) */
85     /* C: loaded in-memory plex             */
86     PetscCall(PetscViewerPushFormat(viewer, format));
87     PetscCall(DMPlexTopologyLoad(dm, viewer, &sfXC));
88     PetscCall(PetscViewerPopFormat(viewer));
89     /* Do not distribute (Already distributed just like the saved plex) */
90     /* Load labels */
91     PetscCall(DMPlexLabelsLoad(dm, viewer, sfXC));
92     /* Load coordinates */
93     PetscCall(PetscViewerPushFormat(viewer, format));
94     PetscCall(DMPlexCoordinatesLoad(dm, viewer, sfXC));
95     PetscCall(PetscViewerPopFormat(viewer));
96     PetscCall(DMSetFromOptions(dm));
97     /* Print the exact same plex as the saved one */
98     PetscCall(PetscObjectSetName((PetscObject)dm, "Load: DM"));
99     PetscCall(DMViewFromOptions(dm, NULL, "-dm_view"));
100     PetscCall(PetscSFDestroy(&sfXC));
101     PetscCall(DMDestroy(&dm));
102     PetscCall(PetscViewerDestroy(&viewer));
103   }
104   /* Finalize */
105   PetscCall(PetscFinalize());
106   return 0;
107 }
108 
109 /*TEST
110 
111   build:
112     requires: hdf5
113     requires: !complex
114   test:
115     suffix: 0
116     requires: parmetis
117     nsize: {{1 2 4}separate output}
118     args: -fname ex51_dump.h5 -dm_view ascii::ascii_info_detail
119     args: -petscpartitioner_type parmetis
120     args: -dm_plex_view_hdf5_storage_version 2.0.0
121 
122 TEST*/
123