xref: /petsc/src/dm/impls/plex/tests/ex21.c (revision aee58fc643cde3a74e29e886bde44205d937e3a7)
1b27d8d4cSMatthew G. Knepley static char help[] = "Tests save/load of plex/section/vec on different numbers of processes in HDF5.\n\n";
2df2db7a0SMatthew G. Knepley 
3df2db7a0SMatthew G. Knepley #include <petscdmshell.h>
4df2db7a0SMatthew G. Knepley #include <petscdmplex.h>
5df2db7a0SMatthew G. Knepley #include <petscsection.h>
6df2db7a0SMatthew G. Knepley #include <petscsf.h>
7df2db7a0SMatthew G. Knepley #include <petsclayouthdf5.h>
8df2db7a0SMatthew G. Knepley 
9df2db7a0SMatthew G. Knepley /* A six-element mesh
10df2db7a0SMatthew G. Knepley 
11df2db7a0SMatthew G. Knepley =====================
12df2db7a0SMatthew G. Knepley  Save on 2 processes
13df2db7a0SMatthew G. Knepley =====================
14df2db7a0SMatthew G. Knepley 
15df2db7a0SMatthew G. Knepley exampleDMPlex: Local numbering:
16df2db7a0SMatthew G. Knepley 
17df2db7a0SMatthew G. Knepley              7---17--8---18--9--19--(12)(24)(13)
18df2db7a0SMatthew G. Knepley              |       |       |       |       |
19df2db7a0SMatthew G. Knepley   rank 0:   20   0  21   1  22   2  (25) (3)(26)
20df2db7a0SMatthew G. Knepley              |       |       |       |       |
21df2db7a0SMatthew G. Knepley              4---14--5---15--6--16--(10)(23)(11)
22df2db7a0SMatthew G. Knepley 
23df2db7a0SMatthew G. Knepley                            (13)(25)--8--17---9--18--10--19--11
24df2db7a0SMatthew G. Knepley                              |       |       |       |       |
25df2db7a0SMatthew G. Knepley   rank 1:                  (26) (3) 20   0   21  1  22   2  23
26df2db7a0SMatthew G. Knepley                              |       |       |       |       |
27df2db7a0SMatthew G. Knepley                            (12)(24)--4--14---5--15---6--16---7
28df2db7a0SMatthew G. Knepley 
29df2db7a0SMatthew G. Knepley exampleDMPlex: globalPointNumbering:
30df2db7a0SMatthew G. Knepley 
31df2db7a0SMatthew G. Knepley              9--23--10--24--11--25--16--32--17--33--18--34--19
32df2db7a0SMatthew G. Knepley              |       |       |       |       |       |       |
33df2db7a0SMatthew G. Knepley             26   0  27   1  28   2  35   3  36   4  37   5  38
34df2db7a0SMatthew G. Knepley              |       |       |       |       |       |       |
35df2db7a0SMatthew G. Knepley              6--20---7--21---8--22--12--29--13--30--14--31--15
36df2db7a0SMatthew G. Knepley 
37df2db7a0SMatthew G. Knepley exampleSectionDM:
38df2db7a0SMatthew G. Knepley   - includesConstraints = TRUE for local section (default)
39df2db7a0SMatthew G. Knepley   - includesConstraints = FALSE for global section (default)
40df2db7a0SMatthew G. Knepley 
41df2db7a0SMatthew G. Knepley exampleSectionDM: Dofs (Field 0):
42df2db7a0SMatthew G. Knepley 
43df2db7a0SMatthew G. Knepley              0---0---0---0---0---0---2---0---0---0---0---0---0
44df2db7a0SMatthew G. Knepley              |       |       |       |       |       |       |
45df2db7a0SMatthew G. Knepley              0   0   0   0   0   0   0   2   0   0   0   0   0
46df2db7a0SMatthew G. Knepley              |       |       |       |       |       |       |
47df2db7a0SMatthew G. Knepley              0---0---0---0---0---0---0---0---0---0---0---0---0
48df2db7a0SMatthew G. Knepley 
49df2db7a0SMatthew G. Knepley exampleSectionDM: Dofs (Field 1):      constrained
50df2db7a0SMatthew G. Knepley                                       /
51df2db7a0SMatthew G. Knepley              0---0---0---0---0---0---1---0---0---0---0---0---0
52df2db7a0SMatthew G. Knepley              |       |       |       |       |       |       |
53df2db7a0SMatthew G. Knepley              0   0   0   0   0   0   2   0   0   1   0   0   0
54df2db7a0SMatthew G. Knepley              |       |       |       |       |       |       |
55df2db7a0SMatthew G. Knepley              0---0---0---0---0---0---0---0---0---0---0---0---0
56df2db7a0SMatthew G. Knepley 
57df2db7a0SMatthew G. Knepley exampleSectionDM: Offsets (total) in global section:
58df2db7a0SMatthew G. Knepley 
59df2db7a0SMatthew G. Knepley              0---0---0---0---0---0---3---5---5---5---5---5---5
60df2db7a0SMatthew G. Knepley              |       |       |       |       |       |       |
61df2db7a0SMatthew G. Knepley              0   0   0   0   0   0   5   0   7   2   7   3   7
62df2db7a0SMatthew G. Knepley              |       |       |       |       |       |       |
63df2db7a0SMatthew G. Knepley              0---0---0---0---0---0---3---5---3---5---3---5---3
64df2db7a0SMatthew G. Knepley 
65df2db7a0SMatthew G. Knepley exampleVec: Values (Field 0):          (1.3, 1.4)
66df2db7a0SMatthew G. Knepley                                       /
67df2db7a0SMatthew G. Knepley              +-------+-------+-------*-------+-------+-------+
68df2db7a0SMatthew G. Knepley              |       |       |       |       |       |       |
69df2db7a0SMatthew G. Knepley              |       |       |       |   * (1.0, 1.1)|       |
70df2db7a0SMatthew G. Knepley              |       |       |       |       |       |       |
71df2db7a0SMatthew G. Knepley              +-------+-------+-------+-------+-------+-------+
72df2db7a0SMatthew G. Knepley 
73df2db7a0SMatthew G. Knepley exampleVec: Values (Field 1):          (1.5,) constrained
74df2db7a0SMatthew G. Knepley                                       /
75df2db7a0SMatthew G. Knepley              +-------+-------+-------*-------+-------+-------+
76df2db7a0SMatthew G. Knepley              |       |       |       |       |       |       |
77df2db7a0SMatthew G. Knepley              |       |    (1.6, 1.7) *       |   * (1.2,)    |
78df2db7a0SMatthew G. Knepley              |       |       |       |       |       |       |
79df2db7a0SMatthew G. Knepley              +-------+-------+-------+-------+-------+-------+
80df2db7a0SMatthew G. Knepley 
81df2db7a0SMatthew G. Knepley exampleVec: as global vector
82df2db7a0SMatthew G. Knepley 
83df2db7a0SMatthew G. Knepley   rank 0: []
840318f8a0SStefano Zampini   rank 1: [1.0, 1.1, 1.2, 1.3, 1.4, 1.6, 1.7]
85df2db7a0SMatthew G. Knepley 
86df2db7a0SMatthew G. Knepley =====================
87df2db7a0SMatthew G. Knepley  Load on 3 Processes
88df2db7a0SMatthew G. Knepley =====================
89df2db7a0SMatthew G. Knepley 
90df2db7a0SMatthew G. Knepley exampleDMPlex: Loaded/Distributed:
91df2db7a0SMatthew G. Knepley 
92df2db7a0SMatthew G. Knepley              5--13---6--14--(8)(18)(10)
93df2db7a0SMatthew G. Knepley              |       |       |       |
94df2db7a0SMatthew G. Knepley   rank 0:   15   0   16  1  (19)(2)(20)
95df2db7a0SMatthew G. Knepley              |       |       |       |
96df2db7a0SMatthew G. Knepley              3--11---4--12--(7)(17)-(9)
97df2db7a0SMatthew G. Knepley 
98df2db7a0SMatthew G. Knepley                     (9)(21)--5--15---7--18-(12)(24)(13)
99df2db7a0SMatthew G. Knepley                      |       |       |       |       |
100df2db7a0SMatthew G. Knepley   rank 1:          (22) (2) 16   0  19   1 (25) (3)(26)
101df2db7a0SMatthew G. Knepley                      |       |       |       |       |
102df2db7a0SMatthew G. Knepley                     (8)(20)--4--14---6--17-(10)(23)(11)
103df2db7a0SMatthew G. Knepley 
104df2db7a0SMatthew G. Knepley                                +-> (10)(19)--6--13---7--14---8
105df2db7a0SMatthew G. Knepley                        permute |     |       |       |       |
106df2db7a0SMatthew G. Knepley   rank 2:                      +-> (20) (2) 15   0  16   1  17
107df2db7a0SMatthew G. Knepley                                      |       |       |       |
108df2db7a0SMatthew G. Knepley                                     (9)(18)--3--11---4--12---5
109df2db7a0SMatthew G. Knepley 
110df2db7a0SMatthew G. Knepley exampleSectionDM:
111df2db7a0SMatthew G. Knepley   - includesConstraints = TRUE for local section (default)
112df2db7a0SMatthew G. Knepley   - includesConstraints = FALSE for global section (default)
113df2db7a0SMatthew G. Knepley 
114df2db7a0SMatthew G. Knepley exampleVec: as local vector:
115df2db7a0SMatthew G. Knepley 
116df2db7a0SMatthew G. Knepley   rank 0: [1.3, 1.4, 1.5, 1.6, 1.7]
117df2db7a0SMatthew G. Knepley   rank 1: [1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7]
118df2db7a0SMatthew G. Knepley   rank 2: [1.2, 1.0, 1.1, 1.6, 1.7, 1.3, 1.4, 1.5]
119df2db7a0SMatthew G. Knepley 
120df2db7a0SMatthew G. Knepley exampleVec: as global vector:
121df2db7a0SMatthew G. Knepley 
122df2db7a0SMatthew G. Knepley   rank 0: []
123df2db7a0SMatthew G. Knepley   rank 1: [1.0, 1.1, 1.3, 1.4, 1.6, 1.7]
124df2db7a0SMatthew G. Knepley   rank 2: [1.2]
125df2db7a0SMatthew G. Knepley 
126df2db7a0SMatthew G. Knepley */
127df2db7a0SMatthew G. Knepley 
128df2db7a0SMatthew G. Knepley typedef struct {
129df2db7a0SMatthew G. Knepley   char      fname[PETSC_MAX_PATH_LEN]; /* Output mesh filename */
130df2db7a0SMatthew G. Knepley   PetscBool shell;                     /* Use DMShell to wrap sections */
131df2db7a0SMatthew G. Knepley } AppCtx;
132df2db7a0SMatthew G. Knepley 
ProcessOptions(MPI_Comm comm,AppCtx * options)133d71ae5a4SJacob Faibussowitsch PetscErrorCode ProcessOptions(MPI_Comm comm, AppCtx *options)
134d71ae5a4SJacob Faibussowitsch {
135df2db7a0SMatthew G. Knepley   PetscBool flg;
136df2db7a0SMatthew G. Knepley 
137df2db7a0SMatthew G. Knepley   PetscFunctionBegin;
138df2db7a0SMatthew G. Knepley   options->fname[0] = '\0';
139d0609cedSBarry Smith   PetscOptionsBegin(comm, "", "DMPlex View/Load Test Options", "DMPLEX");
140df2db7a0SMatthew G. Knepley   PetscCall(PetscOptionsString("-fname", "The output mesh file", "ex12.c", options->fname, options->fname, sizeof(options->fname), &flg));
141df2db7a0SMatthew G. Knepley   PetscCall(PetscOptionsBool("-shell", "Use DMShell to wrap sections", "ex12.c", options->shell, &options->shell, NULL));
142d0609cedSBarry Smith   PetscOptionsEnd();
1433ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
144df2db7a0SMatthew G. Knepley }
145df2db7a0SMatthew G. Knepley 
main(int argc,char ** argv)146d71ae5a4SJacob Faibussowitsch int main(int argc, char **argv)
147d71ae5a4SJacob Faibussowitsch {
148df2db7a0SMatthew G. Knepley   MPI_Comm          comm;
149df2db7a0SMatthew G. Knepley   PetscMPIInt       size, rank, mycolor;
150df2db7a0SMatthew G. Knepley   const char        exampleDMPlexName[]    = "exampleDMPlex";
151df2db7a0SMatthew G. Knepley   const char        exampleSectionDMName[] = "exampleSectionDM";
152df2db7a0SMatthew G. Knepley   const char        exampleVecName[]       = "exampleVec";
153df2db7a0SMatthew G. Knepley   PetscScalar       constraintValue        = 1.5;
154df2db7a0SMatthew G. Knepley   PetscViewerFormat format                 = PETSC_VIEWER_HDF5_PETSC;
155df2db7a0SMatthew G. Knepley   AppCtx            user;
156df2db7a0SMatthew G. Knepley 
157327415f7SBarry Smith   PetscFunctionBeginUser;
158df2db7a0SMatthew G. Knepley   PetscCall(PetscInitialize(&argc, &argv, NULL, help));
159df2db7a0SMatthew G. Knepley   PetscCall(ProcessOptions(PETSC_COMM_WORLD, &user));
160df2db7a0SMatthew G. Knepley   PetscCallMPI(MPI_Comm_size(PETSC_COMM_WORLD, &size));
161df2db7a0SMatthew G. Knepley   PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank));
16208401ef6SPierre Jolivet   PetscCheck(size >= 3, PETSC_COMM_WORLD, PETSC_ERR_WRONG_MPI_SIZE, "Example only works with three or more processes");
163df2db7a0SMatthew G. Knepley 
164df2db7a0SMatthew G. Knepley   /* Save */
165df2db7a0SMatthew G. Knepley   mycolor = (PetscMPIInt)(rank >= 2);
166df2db7a0SMatthew G. Knepley   PetscCallMPI(MPI_Comm_split(PETSC_COMM_WORLD, mycolor, rank, &comm));
167df2db7a0SMatthew G. Knepley   if (mycolor == 0) {
168df2db7a0SMatthew G. Knepley     DM          dm;
169df2db7a0SMatthew G. Knepley     PetscViewer viewer;
170df2db7a0SMatthew G. Knepley 
171df2db7a0SMatthew G. Knepley     PetscCall(PetscViewerHDF5Open(comm, user.fname, FILE_MODE_WRITE, &viewer));
172df2db7a0SMatthew G. Knepley     /* Save exampleDMPlex */
173df2db7a0SMatthew G. Knepley     {
174df2db7a0SMatthew G. Knepley       DM             pdm;
175df2db7a0SMatthew G. Knepley       const PetscInt faces[2] = {6, 1};
176df2db7a0SMatthew G. Knepley       PetscSF        sf;
177df2db7a0SMatthew G. Knepley       PetscInt       overlap = 1;
178df2db7a0SMatthew G. Knepley 
179*42108689Sksagiyam       PetscCall(DMPlexCreateBoxMesh(comm, 2, PETSC_FALSE, faces, NULL, NULL, NULL, PETSC_TRUE, 0, PETSC_TRUE, &dm));
180df2db7a0SMatthew G. Knepley       PetscCall(DMPlexDistribute(dm, overlap, &sf, &pdm));
181df2db7a0SMatthew G. Knepley       if (pdm) {
182df2db7a0SMatthew G. Knepley         PetscCall(DMDestroy(&dm));
183df2db7a0SMatthew G. Knepley         dm = pdm;
184df2db7a0SMatthew G. Knepley       }
185df2db7a0SMatthew G. Knepley       PetscCall(PetscSFDestroy(&sf));
186df2db7a0SMatthew G. Knepley       PetscCall(PetscObjectSetName((PetscObject)dm, exampleDMPlexName));
187df2db7a0SMatthew G. Knepley       PetscCall(PetscViewerPushFormat(viewer, format));
188df2db7a0SMatthew G. Knepley       PetscCall(DMPlexTopologyView(dm, viewer));
189df2db7a0SMatthew G. Knepley       PetscCall(DMPlexLabelsView(dm, viewer));
190df2db7a0SMatthew G. Knepley       PetscCall(PetscViewerPopFormat(viewer));
191df2db7a0SMatthew G. Knepley     }
192df2db7a0SMatthew G. Knepley     /* Save coordinates */
193df2db7a0SMatthew G. Knepley     PetscCall(PetscViewerPushFormat(viewer, format));
194df2db7a0SMatthew G. Knepley     PetscCall(DMPlexCoordinatesView(dm, viewer));
195df2db7a0SMatthew G. Knepley     PetscCall(PetscViewerPopFormat(viewer));
196df2db7a0SMatthew G. Knepley     /* Save exampleVec */
197df2db7a0SMatthew G. Knepley     {
198df2db7a0SMatthew G. Knepley       PetscInt     pStart = -1, pEnd = -1;
199df2db7a0SMatthew G. Knepley       DM           sdm;
200df2db7a0SMatthew G. Knepley       PetscSection section, gsection;
201df2db7a0SMatthew G. Knepley       PetscBool    includesConstraints = PETSC_FALSE;
202df2db7a0SMatthew G. Knepley       Vec          vec;
203df2db7a0SMatthew G. Knepley       PetscScalar *array = NULL;
204df2db7a0SMatthew G. Knepley 
205df2db7a0SMatthew G. Knepley       /* Create section */
206df2db7a0SMatthew G. Knepley       PetscCall(PetscSectionCreate(comm, &section));
207df2db7a0SMatthew G. Knepley       PetscCall(PetscSectionSetNumFields(section, 2));
208df2db7a0SMatthew G. Knepley       PetscCall(DMPlexGetChart(dm, &pStart, &pEnd));
209df2db7a0SMatthew G. Knepley       PetscCall(PetscSectionSetChart(section, pStart, pEnd));
210df2db7a0SMatthew G. Knepley       switch (rank) {
211df2db7a0SMatthew G. Knepley       case 0:
212df2db7a0SMatthew G. Knepley         PetscCall(PetscSectionSetDof(section, 3, 2));
213df2db7a0SMatthew G. Knepley         PetscCall(PetscSectionSetDof(section, 12, 3));
214df2db7a0SMatthew G. Knepley         PetscCall(PetscSectionSetDof(section, 25, 2));
215df2db7a0SMatthew G. Knepley         PetscCall(PetscSectionSetConstraintDof(section, 12, 1));
216df2db7a0SMatthew G. Knepley         PetscCall(PetscSectionSetFieldDof(section, 3, 0, 2));
217df2db7a0SMatthew G. Knepley         PetscCall(PetscSectionSetFieldDof(section, 12, 0, 2));
218df2db7a0SMatthew G. Knepley         PetscCall(PetscSectionSetFieldDof(section, 12, 1, 1));
219df2db7a0SMatthew G. Knepley         PetscCall(PetscSectionSetFieldDof(section, 25, 1, 2));
220df2db7a0SMatthew G. Knepley         PetscCall(PetscSectionSetFieldConstraintDof(section, 12, 1, 1));
221df2db7a0SMatthew G. Knepley         break;
222df2db7a0SMatthew G. Knepley       case 1:
223df2db7a0SMatthew G. Knepley         PetscCall(PetscSectionSetDof(section, 0, 2));
224df2db7a0SMatthew G. Knepley         PetscCall(PetscSectionSetDof(section, 1, 1));
225df2db7a0SMatthew G. Knepley         PetscCall(PetscSectionSetDof(section, 8, 3));
226df2db7a0SMatthew G. Knepley         PetscCall(PetscSectionSetDof(section, 20, 2));
227df2db7a0SMatthew G. Knepley         PetscCall(PetscSectionSetConstraintDof(section, 8, 1));
228df2db7a0SMatthew G. Knepley         PetscCall(PetscSectionSetFieldDof(section, 0, 0, 2));
229df2db7a0SMatthew G. Knepley         PetscCall(PetscSectionSetFieldDof(section, 8, 0, 2));
230df2db7a0SMatthew G. Knepley         PetscCall(PetscSectionSetFieldDof(section, 1, 1, 1));
231df2db7a0SMatthew G. Knepley         PetscCall(PetscSectionSetFieldDof(section, 8, 1, 1));
232df2db7a0SMatthew G. Knepley         PetscCall(PetscSectionSetFieldDof(section, 20, 1, 2));
233df2db7a0SMatthew G. Knepley         PetscCall(PetscSectionSetFieldConstraintDof(section, 8, 1, 1));
234df2db7a0SMatthew G. Knepley         break;
235df2db7a0SMatthew G. Knepley       }
236df2db7a0SMatthew G. Knepley       PetscCall(PetscSectionSetUp(section));
237df2db7a0SMatthew G. Knepley       {
238df2db7a0SMatthew G. Knepley         const PetscInt indices[]  = {2};
239df2db7a0SMatthew G. Knepley         const PetscInt indices1[] = {0};
240df2db7a0SMatthew G. Knepley 
241df2db7a0SMatthew G. Knepley         switch (rank) {
242df2db7a0SMatthew G. Knepley         case 0:
243df2db7a0SMatthew G. Knepley           PetscCall(PetscSectionSetConstraintIndices(section, 12, indices));
244df2db7a0SMatthew G. Knepley           PetscCall(PetscSectionSetFieldConstraintIndices(section, 12, 1, indices1));
245df2db7a0SMatthew G. Knepley           break;
246df2db7a0SMatthew G. Knepley         case 1:
247df2db7a0SMatthew G. Knepley           PetscCall(PetscSectionSetConstraintIndices(section, 8, indices));
248df2db7a0SMatthew G. Knepley           PetscCall(PetscSectionSetFieldConstraintIndices(section, 8, 1, indices1));
249df2db7a0SMatthew G. Knepley           break;
250df2db7a0SMatthew G. Knepley         }
251df2db7a0SMatthew G. Knepley       }
252df2db7a0SMatthew G. Knepley       if (user.shell) {
253df2db7a0SMatthew G. Knepley         PetscSF sf;
254df2db7a0SMatthew G. Knepley 
255df2db7a0SMatthew G. Knepley         PetscCall(DMShellCreate(comm, &sdm));
256df2db7a0SMatthew G. Knepley         PetscCall(DMGetPointSF(dm, &sf));
257df2db7a0SMatthew G. Knepley         PetscCall(DMSetPointSF(sdm, sf));
2589371c9d4SSatish Balay       } else {
259df2db7a0SMatthew G. Knepley         PetscCall(DMClone(dm, &sdm));
260df2db7a0SMatthew G. Knepley       }
261df2db7a0SMatthew G. Knepley       PetscCall(PetscObjectSetName((PetscObject)sdm, exampleSectionDMName));
262df2db7a0SMatthew G. Knepley       PetscCall(DMSetLocalSection(sdm, section));
263df2db7a0SMatthew G. Knepley       PetscCall(PetscSectionDestroy(&section));
264df2db7a0SMatthew G. Knepley       PetscCall(DMPlexSectionView(dm, viewer, sdm));
265df2db7a0SMatthew G. Knepley       /* Create global vector */
266df2db7a0SMatthew G. Knepley       PetscCall(DMGetGlobalSection(sdm, &gsection));
267df2db7a0SMatthew G. Knepley       PetscCall(PetscSectionGetIncludesConstraints(gsection, &includesConstraints));
268df2db7a0SMatthew G. Knepley       if (user.shell) {
269df2db7a0SMatthew G. Knepley         PetscInt n = -1;
270df2db7a0SMatthew G. Knepley 
271df2db7a0SMatthew G. Knepley         PetscCall(VecCreate(comm, &vec));
272df2db7a0SMatthew G. Knepley         if (includesConstraints) PetscCall(PetscSectionGetStorageSize(gsection, &n));
273df2db7a0SMatthew G. Knepley         else PetscCall(PetscSectionGetConstrainedStorageSize(gsection, &n));
274df2db7a0SMatthew G. Knepley         PetscCall(VecSetSizes(vec, n, PETSC_DECIDE));
275df2db7a0SMatthew G. Knepley         PetscCall(VecSetUp(vec));
276df2db7a0SMatthew G. Knepley       } else {
277df2db7a0SMatthew G. Knepley         PetscCall(DMGetGlobalVector(sdm, &vec));
278df2db7a0SMatthew G. Knepley       }
279df2db7a0SMatthew G. Knepley       PetscCall(PetscObjectSetName((PetscObject)vec, exampleVecName));
280df2db7a0SMatthew G. Knepley       PetscCall(VecGetArrayWrite(vec, &array));
281df2db7a0SMatthew G. Knepley       if (includesConstraints) {
282df2db7a0SMatthew G. Knepley         switch (rank) {
283d71ae5a4SJacob Faibussowitsch         case 0:
284d71ae5a4SJacob Faibussowitsch           break;
285df2db7a0SMatthew G. Knepley         case 1:
286df2db7a0SMatthew G. Knepley           array[0] = 1.0;
287df2db7a0SMatthew G. Knepley           array[1] = 1.1;
288df2db7a0SMatthew G. Knepley           array[2] = 1.2;
289df2db7a0SMatthew G. Knepley           array[3] = 1.3;
290df2db7a0SMatthew G. Knepley           array[4] = 1.4;
291df2db7a0SMatthew G. Knepley           array[5] = 1.5;
292df2db7a0SMatthew G. Knepley           array[6] = 1.6;
293df2db7a0SMatthew G. Knepley           array[7] = 1.7;
294df2db7a0SMatthew G. Knepley           break;
295df2db7a0SMatthew G. Knepley         }
296df2db7a0SMatthew G. Knepley       } else {
297df2db7a0SMatthew G. Knepley         switch (rank) {
298d71ae5a4SJacob Faibussowitsch         case 0:
299d71ae5a4SJacob Faibussowitsch           break;
300df2db7a0SMatthew G. Knepley         case 1:
301df2db7a0SMatthew G. Knepley           array[0] = 1.0;
302df2db7a0SMatthew G. Knepley           array[1] = 1.1;
303df2db7a0SMatthew G. Knepley           array[2] = 1.2;
304df2db7a0SMatthew G. Knepley           array[3] = 1.3;
305df2db7a0SMatthew G. Knepley           array[4] = 1.4;
306df2db7a0SMatthew G. Knepley           array[5] = 1.6;
307df2db7a0SMatthew G. Knepley           array[6] = 1.7;
308df2db7a0SMatthew G. Knepley           break;
309df2db7a0SMatthew G. Knepley         }
310df2db7a0SMatthew G. Knepley       }
311df2db7a0SMatthew G. Knepley       PetscCall(VecRestoreArrayWrite(vec, &array));
312df2db7a0SMatthew G. Knepley       PetscCall(DMPlexGlobalVectorView(dm, viewer, sdm, vec));
313df2db7a0SMatthew G. Knepley       if (user.shell) {
314df2db7a0SMatthew G. Knepley         PetscCall(VecDestroy(&vec));
315df2db7a0SMatthew G. Knepley       } else {
316df2db7a0SMatthew G. Knepley         PetscCall(DMRestoreGlobalVector(sdm, &vec));
317df2db7a0SMatthew G. Knepley       }
318df2db7a0SMatthew G. Knepley       PetscCall(DMDestroy(&sdm));
319df2db7a0SMatthew G. Knepley     }
320df2db7a0SMatthew G. Knepley     PetscCall(PetscViewerDestroy(&viewer));
321df2db7a0SMatthew G. Knepley     PetscCall(DMDestroy(&dm));
322df2db7a0SMatthew G. Knepley   }
323df2db7a0SMatthew G. Knepley   PetscCallMPI(MPI_Comm_free(&comm));
324df2db7a0SMatthew G. Knepley   /* Load */
325df2db7a0SMatthew G. Knepley   mycolor = (PetscMPIInt)(rank >= 3);
326df2db7a0SMatthew G. Knepley   PetscCallMPI(MPI_Comm_split(PETSC_COMM_WORLD, mycolor, rank, &comm));
327df2db7a0SMatthew G. Knepley   if (mycolor == 0) {
328df2db7a0SMatthew G. Knepley     DM          dm;
329df2db7a0SMatthew G. Knepley     PetscSF     sfXC;
330df2db7a0SMatthew G. Knepley     PetscViewer viewer;
331df2db7a0SMatthew G. Knepley 
332df2db7a0SMatthew G. Knepley     PetscCall(PetscViewerHDF5Open(comm, user.fname, FILE_MODE_READ, &viewer));
333df2db7a0SMatthew G. Knepley     /* Load exampleDMPlex */
334df2db7a0SMatthew G. Knepley     {
335df2db7a0SMatthew G. Knepley       PetscSF sfXB, sfBC;
336df2db7a0SMatthew G. Knepley 
337df2db7a0SMatthew G. Knepley       PetscCall(DMCreate(comm, &dm));
338df2db7a0SMatthew G. Knepley       PetscCall(DMSetType(dm, DMPLEX));
339df2db7a0SMatthew G. Knepley       PetscCall(PetscObjectSetName((PetscObject)dm, exampleDMPlexName));
340df2db7a0SMatthew G. Knepley       /* sfXB: X -> B                         */
341df2db7a0SMatthew G. Knepley       /* X: set of globalPointNumbers, [0, N) */
342df2db7a0SMatthew G. Knepley       /* B: loaded naive in-memory plex       */
343df2db7a0SMatthew G. Knepley       PetscCall(PetscViewerPushFormat(viewer, format));
344df2db7a0SMatthew G. Knepley       PetscCall(DMPlexTopologyLoad(dm, viewer, &sfXB));
345df2db7a0SMatthew G. Knepley       PetscCall(PetscViewerPopFormat(viewer));
346df2db7a0SMatthew G. Knepley       {
347df2db7a0SMatthew G. Knepley         DM               distributedDM;
348df2db7a0SMatthew G. Knepley         PetscInt         overlap = 1;
349df2db7a0SMatthew G. Knepley         PetscPartitioner part;
350df2db7a0SMatthew G. Knepley 
351df2db7a0SMatthew G. Knepley         PetscCall(DMPlexGetPartitioner(dm, &part));
352df2db7a0SMatthew G. Knepley         PetscCall(PetscPartitionerSetFromOptions(part));
353df2db7a0SMatthew G. Knepley         /* sfBC: B -> C                    */
354df2db7a0SMatthew G. Knepley         /* B: loaded naive in-memory plex  */
355df2db7a0SMatthew G. Knepley         /* C: redistributed good in-memory */
356df2db7a0SMatthew G. Knepley         PetscCall(DMPlexDistribute(dm, overlap, &sfBC, &distributedDM));
357df2db7a0SMatthew G. Knepley         if (distributedDM) {
358df2db7a0SMatthew G. Knepley           PetscCall(DMDestroy(&dm));
359df2db7a0SMatthew G. Knepley           dm = distributedDM;
360df2db7a0SMatthew G. Knepley         }
361df2db7a0SMatthew G. Knepley         PetscCall(PetscObjectSetName((PetscObject)dm, exampleDMPlexName));
362df2db7a0SMatthew G. Knepley       }
363df2db7a0SMatthew G. Knepley       /* sfXC: X -> C */
364df2db7a0SMatthew G. Knepley       PetscCall(PetscSFCompose(sfXB, sfBC, &sfXC));
365df2db7a0SMatthew G. Knepley       PetscCall(PetscSFDestroy(&sfXB));
366df2db7a0SMatthew G. Knepley       PetscCall(PetscSFDestroy(&sfBC));
367df2db7a0SMatthew G. Knepley     }
368df2db7a0SMatthew G. Knepley     /* Load labels */
369df2db7a0SMatthew G. Knepley     PetscCall(PetscViewerPushFormat(viewer, format));
370df2db7a0SMatthew G. Knepley     PetscCall(DMPlexLabelsLoad(dm, viewer, sfXC));
371df2db7a0SMatthew G. Knepley     PetscCall(PetscViewerPopFormat(viewer));
372df2db7a0SMatthew G. Knepley     /* Load coordinates */
373df2db7a0SMatthew G. Knepley     PetscCall(PetscViewerPushFormat(viewer, format));
374df2db7a0SMatthew G. Knepley     PetscCall(DMPlexCoordinatesLoad(dm, viewer, sfXC));
375df2db7a0SMatthew G. Knepley     PetscCall(PetscViewerPopFormat(viewer));
376df2db7a0SMatthew G. Knepley     PetscCall(PetscObjectSetName((PetscObject)dm, "Load: DM (with coordinates)"));
377df2db7a0SMatthew G. Knepley     PetscCall(DMViewFromOptions(dm, NULL, "-dm_view"));
378df2db7a0SMatthew G. Knepley     PetscCall(PetscObjectSetName((PetscObject)dm, exampleDMPlexName));
379df2db7a0SMatthew G. Knepley     /* Load exampleVec */
380df2db7a0SMatthew G. Knepley     {
381df2db7a0SMatthew G. Knepley       DM           sdm;
382df2db7a0SMatthew G. Knepley       PetscSection section, gsection;
383df2db7a0SMatthew G. Knepley       IS           perm;
384df2db7a0SMatthew G. Knepley       PetscBool    includesConstraints = PETSC_FALSE;
385df2db7a0SMatthew G. Knepley       Vec          vec;
386df2db7a0SMatthew G. Knepley       PetscSF      lsf, gsf;
387df2db7a0SMatthew G. Knepley 
388df2db7a0SMatthew G. Knepley       if (user.shell) {
389df2db7a0SMatthew G. Knepley         PetscSF sf;
390df2db7a0SMatthew G. Knepley 
391df2db7a0SMatthew G. Knepley         PetscCall(DMShellCreate(comm, &sdm));
392df2db7a0SMatthew G. Knepley         PetscCall(DMGetPointSF(dm, &sf));
393df2db7a0SMatthew G. Knepley         PetscCall(DMSetPointSF(sdm, sf));
394df2db7a0SMatthew G. Knepley       } else {
395df2db7a0SMatthew G. Knepley         PetscCall(DMClone(dm, &sdm));
396df2db7a0SMatthew G. Knepley       }
397df2db7a0SMatthew G. Knepley       PetscCall(PetscObjectSetName((PetscObject)sdm, exampleSectionDMName));
398df2db7a0SMatthew G. Knepley       PetscCall(PetscSectionCreate(comm, &section));
399df2db7a0SMatthew G. Knepley       {
400df2db7a0SMatthew G. Knepley         PetscInt  pStart = -1, pEnd = -1, p = -1;
401df2db7a0SMatthew G. Knepley         PetscInt *pinds = NULL;
402df2db7a0SMatthew G. Knepley 
403df2db7a0SMatthew G. Knepley         PetscCall(DMPlexGetChart(dm, &pStart, &pEnd));
404df2db7a0SMatthew G. Knepley         PetscCall(PetscMalloc1(pEnd - pStart, &pinds));
405df2db7a0SMatthew G. Knepley         for (p = 0; p < pEnd - pStart; ++p) pinds[p] = p;
4069371c9d4SSatish Balay         if (rank == 2) {
4079371c9d4SSatish Balay           pinds[10] = 20;
4089371c9d4SSatish Balay           pinds[20] = 10;
4099371c9d4SSatish Balay         }
410df2db7a0SMatthew G. Knepley         PetscCall(ISCreateGeneral(comm, pEnd - pStart, pinds, PETSC_OWN_POINTER, &perm));
411df2db7a0SMatthew G. Knepley       }
412df2db7a0SMatthew G. Knepley       PetscCall(PetscSectionSetPermutation(section, perm));
413df2db7a0SMatthew G. Knepley       PetscCall(ISDestroy(&perm));
414df2db7a0SMatthew G. Knepley       PetscCall(DMSetLocalSection(sdm, section));
415df2db7a0SMatthew G. Knepley       PetscCall(PetscSectionDestroy(&section));
416df2db7a0SMatthew G. Knepley       PetscCall(DMPlexSectionLoad(dm, viewer, sdm, sfXC, &gsf, &lsf));
417df2db7a0SMatthew G. Knepley       /* Load as local vector */
418df2db7a0SMatthew G. Knepley       PetscCall(DMGetLocalSection(sdm, &section));
419df2db7a0SMatthew G. Knepley       PetscCall(PetscObjectSetName((PetscObject)section, "Load: local section"));
420df2db7a0SMatthew G. Knepley       PetscCall(PetscSectionView(section, PETSC_VIEWER_STDOUT_(comm)));
421df2db7a0SMatthew G. Knepley       PetscCall(PetscSectionGetIncludesConstraints(section, &includesConstraints));
422df2db7a0SMatthew G. Knepley       if (user.shell) {
423df2db7a0SMatthew G. Knepley         PetscInt m = -1;
424df2db7a0SMatthew G. Knepley 
425df2db7a0SMatthew G. Knepley         PetscCall(VecCreate(comm, &vec));
426df2db7a0SMatthew G. Knepley         if (includesConstraints) PetscCall(PetscSectionGetStorageSize(section, &m));
427df2db7a0SMatthew G. Knepley         else PetscCall(PetscSectionGetConstrainedStorageSize(section, &m));
428df2db7a0SMatthew G. Knepley         PetscCall(VecSetSizes(vec, m, PETSC_DECIDE));
429df2db7a0SMatthew G. Knepley         PetscCall(VecSetUp(vec));
430df2db7a0SMatthew G. Knepley       } else {
431df2db7a0SMatthew G. Knepley         PetscCall(DMGetLocalVector(sdm, &vec));
432df2db7a0SMatthew G. Knepley       }
433df2db7a0SMatthew G. Knepley       PetscCall(PetscObjectSetName((PetscObject)vec, exampleVecName));
434df2db7a0SMatthew G. Knepley       PetscCall(VecSet(vec, constraintValue));
435df2db7a0SMatthew G. Knepley       PetscCall(DMPlexLocalVectorLoad(dm, viewer, sdm, lsf, vec));
436df2db7a0SMatthew G. Knepley       PetscCall(PetscSFDestroy(&lsf));
437df2db7a0SMatthew G. Knepley       if (user.shell) {
438df2db7a0SMatthew G. Knepley         PetscCall(VecView(vec, PETSC_VIEWER_STDOUT_(comm)));
439df2db7a0SMatthew G. Knepley         PetscCall(VecDestroy(&vec));
440df2db7a0SMatthew G. Knepley       } else {
441df2db7a0SMatthew G. Knepley         PetscCall(DMRestoreLocalVector(sdm, &vec));
442df2db7a0SMatthew G. Knepley       }
443df2db7a0SMatthew G. Knepley       /* Load as global vector */
444df2db7a0SMatthew G. Knepley       PetscCall(DMGetGlobalSection(sdm, &gsection));
445df2db7a0SMatthew G. Knepley       PetscCall(PetscObjectSetName((PetscObject)gsection, "Load: global section"));
446df2db7a0SMatthew G. Knepley       PetscCall(PetscSectionView(gsection, PETSC_VIEWER_STDOUT_(comm)));
447df2db7a0SMatthew G. Knepley       PetscCall(PetscSectionGetIncludesConstraints(gsection, &includesConstraints));
448df2db7a0SMatthew G. Knepley       if (user.shell) {
449df2db7a0SMatthew G. Knepley         PetscInt m = -1;
450df2db7a0SMatthew G. Knepley 
451df2db7a0SMatthew G. Knepley         PetscCall(VecCreate(comm, &vec));
452df2db7a0SMatthew G. Knepley         if (includesConstraints) PetscCall(PetscSectionGetStorageSize(gsection, &m));
453df2db7a0SMatthew G. Knepley         else PetscCall(PetscSectionGetConstrainedStorageSize(gsection, &m));
454df2db7a0SMatthew G. Knepley         PetscCall(VecSetSizes(vec, m, PETSC_DECIDE));
455df2db7a0SMatthew G. Knepley         PetscCall(VecSetUp(vec));
456df2db7a0SMatthew G. Knepley       } else {
457df2db7a0SMatthew G. Knepley         PetscCall(DMGetGlobalVector(sdm, &vec));
458df2db7a0SMatthew G. Knepley       }
459df2db7a0SMatthew G. Knepley       PetscCall(PetscObjectSetName((PetscObject)vec, exampleVecName));
460df2db7a0SMatthew G. Knepley       PetscCall(DMPlexGlobalVectorLoad(dm, viewer, sdm, gsf, vec));
461df2db7a0SMatthew G. Knepley       PetscCall(PetscSFDestroy(&gsf));
462df2db7a0SMatthew G. Knepley       PetscCall(VecView(vec, PETSC_VIEWER_STDOUT_(comm)));
463df2db7a0SMatthew G. Knepley       if (user.shell) {
464df2db7a0SMatthew G. Knepley         PetscCall(VecDestroy(&vec));
465df2db7a0SMatthew G. Knepley       } else {
466df2db7a0SMatthew G. Knepley         PetscCall(DMRestoreGlobalVector(sdm, &vec));
467df2db7a0SMatthew G. Knepley       }
468df2db7a0SMatthew G. Knepley       PetscCall(DMDestroy(&sdm));
469df2db7a0SMatthew G. Knepley     }
470df2db7a0SMatthew G. Knepley     PetscCall(PetscViewerDestroy(&viewer));
471df2db7a0SMatthew G. Knepley     PetscCall(PetscSFDestroy(&sfXC));
472df2db7a0SMatthew G. Knepley     PetscCall(DMDestroy(&dm));
473df2db7a0SMatthew G. Knepley   }
474df2db7a0SMatthew G. Knepley   PetscCallMPI(MPI_Comm_free(&comm));
475df2db7a0SMatthew G. Knepley 
476df2db7a0SMatthew G. Knepley   /* Finalize */
477df2db7a0SMatthew G. Knepley   PetscCall(PetscFinalize());
478df2db7a0SMatthew G. Knepley   return 0;
479df2db7a0SMatthew G. Knepley }
480df2db7a0SMatthew G. Knepley 
481df2db7a0SMatthew G. Knepley /*TEST
482df2db7a0SMatthew G. Knepley 
483df2db7a0SMatthew G. Knepley   build:
484df2db7a0SMatthew G. Knepley     requires: hdf5
485df2db7a0SMatthew G. Knepley   testset:
486df2db7a0SMatthew G. Knepley     suffix: 0
487df2db7a0SMatthew G. Knepley     requires: !complex
488df2db7a0SMatthew G. Knepley     nsize: 4
489df2db7a0SMatthew G. Knepley     args: -fname ex12_dump.h5 -shell {{True False}separate output} -dm_view ascii::ascii_info_detail
490df2db7a0SMatthew G. Knepley     args: -dm_plex_view_hdf5_storage_version 2.0.0
491df2db7a0SMatthew G. Knepley     test:
492df2db7a0SMatthew G. Knepley       suffix: parmetis
493df2db7a0SMatthew G. Knepley       requires: parmetis
494df2db7a0SMatthew G. Knepley       args: -petscpartitioner_type parmetis
495df2db7a0SMatthew G. Knepley     test:
496df2db7a0SMatthew G. Knepley       suffix: ptscotch
497df2db7a0SMatthew G. Knepley       requires: ptscotch
498df2db7a0SMatthew G. Knepley       args: -petscpartitioner_type ptscotch
499df2db7a0SMatthew G. Knepley 
500df2db7a0SMatthew G. Knepley TEST*/
501