xref: /petsc/src/dm/impls/plex/tests/ex21.c (revision d0609ced746bc51b019815ca91d747429db24893)
1df2db7a0SMatthew G. Knepley static char help[] = "Tests save/load of plex/section/vec 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: []
84df2db7a0SMatthew G. Knepley   rakn 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 
133df2db7a0SMatthew G. Knepley PetscErrorCode ProcessOptions(MPI_Comm comm, AppCtx *options)
134df2db7a0SMatthew G. Knepley {
135df2db7a0SMatthew G. Knepley   PetscBool       flg;
136df2db7a0SMatthew G. Knepley 
137df2db7a0SMatthew G. Knepley   PetscFunctionBegin;
138df2db7a0SMatthew G. Knepley   options->fname[0] = '\0';
139*d0609cedSBarry 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));
142*d0609cedSBarry Smith   PetscOptionsEnd();
143df2db7a0SMatthew G. Knepley   PetscFunctionReturn(0);
144df2db7a0SMatthew G. Knepley }
145df2db7a0SMatthew G. Knepley 
146df2db7a0SMatthew G. Knepley int main(int argc, char **argv)
147df2db7a0SMatthew G. Knepley {
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 
157df2db7a0SMatthew G. Knepley   PetscCall(PetscInitialize(&argc, &argv, NULL, help));
158df2db7a0SMatthew G. Knepley   PetscCall(ProcessOptions(PETSC_COMM_WORLD, &user));
159df2db7a0SMatthew G. Knepley   PetscCallMPI(MPI_Comm_size(PETSC_COMM_WORLD, &size));
160df2db7a0SMatthew G. Knepley   PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank));
16108401ef6SPierre Jolivet   PetscCheck(size >= 3,PETSC_COMM_WORLD, PETSC_ERR_WRONG_MPI_SIZE, "Example only works with three or more processes");
162df2db7a0SMatthew G. Knepley 
163df2db7a0SMatthew G. Knepley   /* Save */
164df2db7a0SMatthew G. Knepley   mycolor = (PetscMPIInt)(rank >= 2);
165df2db7a0SMatthew G. Knepley   PetscCallMPI(MPI_Comm_split(PETSC_COMM_WORLD, mycolor, rank, &comm));
166df2db7a0SMatthew G. Knepley   if (mycolor == 0) {
167df2db7a0SMatthew G. Knepley     DM           dm;
168df2db7a0SMatthew G. Knepley     PetscViewer  viewer;
169df2db7a0SMatthew G. Knepley 
170df2db7a0SMatthew G. Knepley     PetscCall(PetscViewerHDF5Open(comm, user.fname, FILE_MODE_WRITE, &viewer));
171df2db7a0SMatthew G. Knepley     /* Save exampleDMPlex */
172df2db7a0SMatthew G. Knepley     {
173df2db7a0SMatthew G. Knepley       DM              pdm;
174df2db7a0SMatthew G. Knepley       const PetscInt  faces[2] = {6, 1};
175df2db7a0SMatthew G. Knepley       PetscSF         sf;
176df2db7a0SMatthew G. Knepley       PetscInt        overlap = 1;
177df2db7a0SMatthew G. Knepley 
178df2db7a0SMatthew G. Knepley       PetscCall(DMPlexCreateBoxMesh(comm, 2, PETSC_FALSE, faces, NULL, NULL, NULL, PETSC_TRUE, &dm));
179df2db7a0SMatthew G. Knepley       PetscCall(DMPlexDistribute(dm, overlap, &sf, &pdm));
180df2db7a0SMatthew G. Knepley       if (pdm) {
181df2db7a0SMatthew G. Knepley         PetscCall(DMDestroy(&dm));
182df2db7a0SMatthew G. Knepley         dm = pdm;
183df2db7a0SMatthew G. Knepley       }
184df2db7a0SMatthew G. Knepley       PetscCall(PetscSFDestroy(&sf));
185df2db7a0SMatthew G. Knepley       PetscCall(PetscObjectSetName((PetscObject)dm, exampleDMPlexName));
186df2db7a0SMatthew G. Knepley       PetscCall(PetscViewerPushFormat(viewer, format));
187df2db7a0SMatthew G. Knepley       PetscCall(DMPlexTopologyView(dm, viewer));
188df2db7a0SMatthew G. Knepley       PetscCall(DMPlexLabelsView(dm, viewer));
189df2db7a0SMatthew G. Knepley       PetscCall(PetscViewerPopFormat(viewer));
190df2db7a0SMatthew G. Knepley     }
191df2db7a0SMatthew G. Knepley     /* Save coordinates */
192df2db7a0SMatthew G. Knepley     PetscCall(PetscViewerPushFormat(viewer, format));
193df2db7a0SMatthew G. Knepley     PetscCall(DMPlexCoordinatesView(dm, viewer));
194df2db7a0SMatthew G. Knepley     PetscCall(PetscViewerPopFormat(viewer));
195df2db7a0SMatthew G. Knepley     /* Save exampleVec */
196df2db7a0SMatthew G. Knepley     {
197df2db7a0SMatthew G. Knepley       PetscInt      pStart = -1, pEnd = -1;
198df2db7a0SMatthew G. Knepley       DM            sdm;
199df2db7a0SMatthew G. Knepley       PetscSection  section, gsection;
200df2db7a0SMatthew G. Knepley       PetscBool     includesConstraints = PETSC_FALSE;
201df2db7a0SMatthew G. Knepley       Vec           vec;
202df2db7a0SMatthew G. Knepley       PetscScalar  *array = NULL;
203df2db7a0SMatthew G. Knepley 
204df2db7a0SMatthew G. Knepley       /* Create section */
205df2db7a0SMatthew G. Knepley       PetscCall(PetscSectionCreate(comm, &section));
206df2db7a0SMatthew G. Knepley       PetscCall(PetscSectionSetNumFields(section, 2));
207df2db7a0SMatthew G. Knepley       PetscCall(DMPlexGetChart(dm, &pStart, &pEnd));
208df2db7a0SMatthew G. Knepley       PetscCall(PetscSectionSetChart(section, pStart, pEnd));
209df2db7a0SMatthew G. Knepley       switch (rank) {
210df2db7a0SMatthew G. Knepley       case 0:
211df2db7a0SMatthew G. Knepley         PetscCall(PetscSectionSetDof(section, 3, 2));
212df2db7a0SMatthew G. Knepley         PetscCall(PetscSectionSetDof(section, 12, 3));
213df2db7a0SMatthew G. Knepley         PetscCall(PetscSectionSetDof(section, 25, 2));
214df2db7a0SMatthew G. Knepley         PetscCall(PetscSectionSetConstraintDof(section, 12, 1));
215df2db7a0SMatthew G. Knepley         PetscCall(PetscSectionSetFieldDof(section, 3, 0, 2));
216df2db7a0SMatthew G. Knepley         PetscCall(PetscSectionSetFieldDof(section, 12, 0, 2));
217df2db7a0SMatthew G. Knepley         PetscCall(PetscSectionSetFieldDof(section, 12, 1, 1));
218df2db7a0SMatthew G. Knepley         PetscCall(PetscSectionSetFieldDof(section, 25, 1, 2));
219df2db7a0SMatthew G. Knepley         PetscCall(PetscSectionSetFieldConstraintDof(section, 12, 1, 1));
220df2db7a0SMatthew G. Knepley         break;
221df2db7a0SMatthew G. Knepley       case 1:
222df2db7a0SMatthew G. Knepley         PetscCall(PetscSectionSetDof(section, 0, 2));
223df2db7a0SMatthew G. Knepley         PetscCall(PetscSectionSetDof(section, 1, 1));
224df2db7a0SMatthew G. Knepley         PetscCall(PetscSectionSetDof(section, 8, 3));
225df2db7a0SMatthew G. Knepley         PetscCall(PetscSectionSetDof(section, 20, 2));
226df2db7a0SMatthew G. Knepley         PetscCall(PetscSectionSetConstraintDof(section, 8, 1));
227df2db7a0SMatthew G. Knepley         PetscCall(PetscSectionSetFieldDof(section, 0, 0, 2));
228df2db7a0SMatthew G. Knepley         PetscCall(PetscSectionSetFieldDof(section, 8, 0, 2));
229df2db7a0SMatthew G. Knepley         PetscCall(PetscSectionSetFieldDof(section, 1, 1, 1));
230df2db7a0SMatthew G. Knepley         PetscCall(PetscSectionSetFieldDof(section, 8, 1, 1));
231df2db7a0SMatthew G. Knepley         PetscCall(PetscSectionSetFieldDof(section, 20, 1, 2));
232df2db7a0SMatthew G. Knepley         PetscCall(PetscSectionSetFieldConstraintDof(section, 8, 1, 1));
233df2db7a0SMatthew G. Knepley         break;
234df2db7a0SMatthew G. Knepley       }
235df2db7a0SMatthew G. Knepley       PetscCall(PetscSectionSetUp(section));
236df2db7a0SMatthew G. Knepley       {
237df2db7a0SMatthew G. Knepley         const PetscInt indices[] = {2};
238df2db7a0SMatthew G. Knepley         const PetscInt indices1[] = {0};
239df2db7a0SMatthew G. Knepley 
240df2db7a0SMatthew G. Knepley         switch (rank) {
241df2db7a0SMatthew G. Knepley         case 0:
242df2db7a0SMatthew G. Knepley           PetscCall(PetscSectionSetConstraintIndices(section, 12, indices));
243df2db7a0SMatthew G. Knepley           PetscCall(PetscSectionSetFieldConstraintIndices(section, 12, 1, indices1));
244df2db7a0SMatthew G. Knepley           break;
245df2db7a0SMatthew G. Knepley         case 1:
246df2db7a0SMatthew G. Knepley           PetscCall(PetscSectionSetConstraintIndices(section, 8, indices));
247df2db7a0SMatthew G. Knepley           PetscCall(PetscSectionSetFieldConstraintIndices(section, 8, 1, indices1));
248df2db7a0SMatthew G. Knepley           break;
249df2db7a0SMatthew G. Knepley         }
250df2db7a0SMatthew G. Knepley       }
251df2db7a0SMatthew G. Knepley       if (user.shell) {
252df2db7a0SMatthew G. Knepley         PetscSF  sf;
253df2db7a0SMatthew G. Knepley 
254df2db7a0SMatthew G. Knepley         PetscCall(DMShellCreate(comm, &sdm));
255df2db7a0SMatthew G. Knepley         PetscCall(DMGetPointSF(dm, &sf));
256df2db7a0SMatthew G. Knepley         PetscCall(DMSetPointSF(sdm, sf));
257df2db7a0SMatthew G. Knepley       }
258df2db7a0SMatthew G. Knepley       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) {
283df2db7a0SMatthew G. Knepley         case 0:
284df2db7a0SMatthew G. Knepley           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) {
298df2db7a0SMatthew G. Knepley         case 0:
299df2db7a0SMatthew G. Knepley           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       PetscCall(PetscObjectSetName((PetscObject)dm, exampleDMPlexName));
347df2db7a0SMatthew G. Knepley       {
348df2db7a0SMatthew G. Knepley         DM               distributedDM;
349df2db7a0SMatthew G. Knepley         PetscInt         overlap = 1;
350df2db7a0SMatthew G. Knepley         PetscPartitioner part;
351df2db7a0SMatthew G. Knepley 
352df2db7a0SMatthew G. Knepley         PetscCall(DMPlexGetPartitioner(dm, &part));
353df2db7a0SMatthew G. Knepley         PetscCall(PetscPartitionerSetFromOptions(part));
354df2db7a0SMatthew G. Knepley         /* sfBC: B -> C                    */
355df2db7a0SMatthew G. Knepley         /* B: loaded naive in-memory plex  */
356df2db7a0SMatthew G. Knepley         /* C: redistributed good in-memory */
357df2db7a0SMatthew G. Knepley         PetscCall(DMPlexDistribute(dm, overlap, &sfBC, &distributedDM));
358df2db7a0SMatthew G. Knepley         if (distributedDM) {
359df2db7a0SMatthew G. Knepley           PetscCall(DMDestroy(&dm));
360df2db7a0SMatthew G. Knepley           dm = distributedDM;
361df2db7a0SMatthew G. Knepley         }
362df2db7a0SMatthew G. Knepley         PetscCall(PetscObjectSetName((PetscObject)dm, exampleDMPlexName));
363df2db7a0SMatthew G. Knepley       }
364df2db7a0SMatthew G. Knepley       /* sfXC: X -> C */
365df2db7a0SMatthew G. Knepley       PetscCall(PetscSFCompose(sfXB, sfBC, &sfXC));
366df2db7a0SMatthew G. Knepley       PetscCall(PetscSFDestroy(&sfXB));
367df2db7a0SMatthew G. Knepley       PetscCall(PetscSFDestroy(&sfBC));
368df2db7a0SMatthew G. Knepley     }
369df2db7a0SMatthew G. Knepley     /* Load labels */
370df2db7a0SMatthew G. Knepley     PetscCall(PetscViewerPushFormat(viewer, format));
371df2db7a0SMatthew G. Knepley     PetscCall(DMPlexLabelsLoad(dm, viewer, sfXC));
372df2db7a0SMatthew G. Knepley     PetscCall(PetscViewerPopFormat(viewer));
373df2db7a0SMatthew G. Knepley     /* Load coordinates */
374df2db7a0SMatthew G. Knepley     PetscCall(PetscViewerPushFormat(viewer, format));
375df2db7a0SMatthew G. Knepley     PetscCall(DMPlexCoordinatesLoad(dm, viewer, sfXC));
376df2db7a0SMatthew G. Knepley     PetscCall(PetscViewerPopFormat(viewer));
377df2db7a0SMatthew G. Knepley     PetscCall(PetscObjectSetName((PetscObject)dm, "Load: DM (with coordinates)"));
378df2db7a0SMatthew G. Knepley     PetscCall(DMViewFromOptions(dm, NULL, "-dm_view"));
379df2db7a0SMatthew G. Knepley     PetscCall(PetscObjectSetName((PetscObject)dm, exampleDMPlexName));
380df2db7a0SMatthew G. Knepley     /* Load exampleVec */
381df2db7a0SMatthew G. Knepley     {
382df2db7a0SMatthew G. Knepley       DM            sdm;
383df2db7a0SMatthew G. Knepley       PetscSection  section, gsection;
384df2db7a0SMatthew G. Knepley       IS            perm;
385df2db7a0SMatthew G. Knepley       PetscBool     includesConstraints = PETSC_FALSE;
386df2db7a0SMatthew G. Knepley       Vec           vec;
387df2db7a0SMatthew G. Knepley       PetscSF       lsf, gsf;
388df2db7a0SMatthew G. Knepley 
389df2db7a0SMatthew G. Knepley       if (user.shell) {
390df2db7a0SMatthew G. Knepley         PetscSF  sf;
391df2db7a0SMatthew G. Knepley 
392df2db7a0SMatthew G. Knepley         PetscCall(DMShellCreate(comm, &sdm));
393df2db7a0SMatthew G. Knepley         PetscCall(DMGetPointSF(dm, &sf));
394df2db7a0SMatthew G. Knepley         PetscCall(DMSetPointSF(sdm, sf));
395df2db7a0SMatthew G. Knepley       } else {
396df2db7a0SMatthew G. Knepley         PetscCall(DMClone(dm, &sdm));
397df2db7a0SMatthew G. Knepley       }
398df2db7a0SMatthew G. Knepley       PetscCall(PetscObjectSetName((PetscObject)sdm, exampleSectionDMName));
399df2db7a0SMatthew G. Knepley       PetscCall(PetscSectionCreate(comm, &section));
400df2db7a0SMatthew G. Knepley       {
401df2db7a0SMatthew G. Knepley         PetscInt      pStart = -1, pEnd = -1, p = -1;
402df2db7a0SMatthew G. Knepley         PetscInt     *pinds = NULL;
403df2db7a0SMatthew G. Knepley 
404df2db7a0SMatthew G. Knepley         PetscCall(DMPlexGetChart(dm, &pStart, &pEnd));
405df2db7a0SMatthew G. Knepley         PetscCall(PetscMalloc1(pEnd - pStart, &pinds));
406df2db7a0SMatthew G. Knepley         for (p = 0; p < pEnd - pStart; ++p) pinds[p] = p;
407df2db7a0SMatthew G. Knepley         if (rank == 2) {pinds[10] = 20; pinds[20] = 10;}
408df2db7a0SMatthew G. Knepley         PetscCall(ISCreateGeneral(comm, pEnd - pStart, pinds, PETSC_OWN_POINTER, &perm));
409df2db7a0SMatthew G. Knepley       }
410df2db7a0SMatthew G. Knepley       PetscCall(PetscSectionSetPermutation(section, perm));
411df2db7a0SMatthew G. Knepley       PetscCall(ISDestroy(&perm));
412df2db7a0SMatthew G. Knepley       PetscCall(DMSetLocalSection(sdm, section));
413df2db7a0SMatthew G. Knepley       PetscCall(PetscSectionDestroy(&section));
414df2db7a0SMatthew G. Knepley       PetscCall(DMPlexSectionLoad(dm, viewer, sdm, sfXC, &gsf, &lsf));
415df2db7a0SMatthew G. Knepley       /* Load as local vector */
416df2db7a0SMatthew G. Knepley       PetscCall(DMGetLocalSection(sdm, &section));
417df2db7a0SMatthew G. Knepley       PetscCall(PetscObjectSetName((PetscObject)section, "Load: local section"));
418df2db7a0SMatthew G. Knepley       PetscCall(PetscSectionView(section, PETSC_VIEWER_STDOUT_(comm)));
419df2db7a0SMatthew G. Knepley       PetscCall(PetscSectionGetIncludesConstraints(section, &includesConstraints));
420df2db7a0SMatthew G. Knepley       if (user.shell) {
421df2db7a0SMatthew G. Knepley         PetscInt  m = -1;
422df2db7a0SMatthew G. Knepley 
423df2db7a0SMatthew G. Knepley         PetscCall(VecCreate(comm, &vec));
424df2db7a0SMatthew G. Knepley         if (includesConstraints) PetscCall(PetscSectionGetStorageSize(section, &m));
425df2db7a0SMatthew G. Knepley         else PetscCall(PetscSectionGetConstrainedStorageSize(section, &m));
426df2db7a0SMatthew G. Knepley         PetscCall(VecSetSizes(vec, m, PETSC_DECIDE));
427df2db7a0SMatthew G. Knepley         PetscCall(VecSetUp(vec));
428df2db7a0SMatthew G. Knepley       } else {
429df2db7a0SMatthew G. Knepley         PetscCall(DMGetLocalVector(sdm, &vec));
430df2db7a0SMatthew G. Knepley       }
431df2db7a0SMatthew G. Knepley       PetscCall(PetscObjectSetName((PetscObject)vec, exampleVecName));
432df2db7a0SMatthew G. Knepley       PetscCall(VecSet(vec, constraintValue));
433df2db7a0SMatthew G. Knepley       PetscCall(DMPlexLocalVectorLoad(dm, viewer, sdm, lsf, vec));
434df2db7a0SMatthew G. Knepley       PetscCall(PetscSFDestroy(&lsf));
435df2db7a0SMatthew G. Knepley       if (user.shell) {
436df2db7a0SMatthew G. Knepley         PetscCall(VecView(vec, PETSC_VIEWER_STDOUT_(comm)));
437df2db7a0SMatthew G. Knepley         PetscCall(VecDestroy(&vec));
438df2db7a0SMatthew G. Knepley       } else {
439df2db7a0SMatthew G. Knepley         PetscCall(DMRestoreLocalVector(sdm, &vec));
440df2db7a0SMatthew G. Knepley       }
441df2db7a0SMatthew G. Knepley       /* Load as global vector */
442df2db7a0SMatthew G. Knepley       PetscCall(DMGetGlobalSection(sdm, &gsection));
443df2db7a0SMatthew G. Knepley       PetscCall(PetscObjectSetName((PetscObject)gsection, "Load: global section"));
444df2db7a0SMatthew G. Knepley       PetscCall(PetscSectionView(gsection, PETSC_VIEWER_STDOUT_(comm)));
445df2db7a0SMatthew G. Knepley       PetscCall(PetscSectionGetIncludesConstraints(gsection, &includesConstraints));
446df2db7a0SMatthew G. Knepley       if (user.shell) {
447df2db7a0SMatthew G. Knepley         PetscInt  m = -1;
448df2db7a0SMatthew G. Knepley 
449df2db7a0SMatthew G. Knepley         PetscCall(VecCreate(comm, &vec));
450df2db7a0SMatthew G. Knepley         if (includesConstraints) PetscCall(PetscSectionGetStorageSize(gsection, &m));
451df2db7a0SMatthew G. Knepley         else PetscCall(PetscSectionGetConstrainedStorageSize(gsection, &m));
452df2db7a0SMatthew G. Knepley         PetscCall(VecSetSizes(vec, m, PETSC_DECIDE));
453df2db7a0SMatthew G. Knepley         PetscCall(VecSetUp(vec));
454df2db7a0SMatthew G. Knepley       } else {
455df2db7a0SMatthew G. Knepley         PetscCall(DMGetGlobalVector(sdm, &vec));
456df2db7a0SMatthew G. Knepley       }
457df2db7a0SMatthew G. Knepley       PetscCall(PetscObjectSetName((PetscObject)vec, exampleVecName));
458df2db7a0SMatthew G. Knepley       PetscCall(DMPlexGlobalVectorLoad(dm, viewer, sdm, gsf, vec));
459df2db7a0SMatthew G. Knepley       PetscCall(PetscSFDestroy(&gsf));
460df2db7a0SMatthew G. Knepley       PetscCall(VecView(vec, PETSC_VIEWER_STDOUT_(comm)));
461df2db7a0SMatthew G. Knepley       if (user.shell) {
462df2db7a0SMatthew G. Knepley         PetscCall(VecDestroy(&vec));
463df2db7a0SMatthew G. Knepley       } else {
464df2db7a0SMatthew G. Knepley         PetscCall(DMRestoreGlobalVector(sdm, &vec));
465df2db7a0SMatthew G. Knepley       }
466df2db7a0SMatthew G. Knepley       PetscCall(DMDestroy(&sdm));
467df2db7a0SMatthew G. Knepley     }
468df2db7a0SMatthew G. Knepley     PetscCall(PetscViewerDestroy(&viewer));
469df2db7a0SMatthew G. Knepley     PetscCall(PetscSFDestroy(&sfXC));
470df2db7a0SMatthew G. Knepley     PetscCall(DMDestroy(&dm));
471df2db7a0SMatthew G. Knepley   }
472df2db7a0SMatthew G. Knepley   PetscCallMPI(MPI_Comm_free(&comm));
473df2db7a0SMatthew G. Knepley 
474df2db7a0SMatthew G. Knepley   /* Finalize */
475df2db7a0SMatthew G. Knepley   PetscCall(PetscFinalize());
476df2db7a0SMatthew G. Knepley   return 0;
477df2db7a0SMatthew G. Knepley }
478df2db7a0SMatthew G. Knepley 
479df2db7a0SMatthew G. Knepley /*TEST
480df2db7a0SMatthew G. Knepley 
481df2db7a0SMatthew G. Knepley   build:
482df2db7a0SMatthew G. Knepley     requires: hdf5
483df2db7a0SMatthew G. Knepley   testset:
484df2db7a0SMatthew G. Knepley     suffix: 0
485df2db7a0SMatthew G. Knepley     requires: !complex
486df2db7a0SMatthew G. Knepley     nsize: 4
487df2db7a0SMatthew G. Knepley     args: -fname ex12_dump.h5 -shell {{True False}separate output} -dm_view ascii::ascii_info_detail
488df2db7a0SMatthew G. Knepley     args: -dm_plex_view_hdf5_storage_version 2.0.0
489df2db7a0SMatthew G. Knepley     test:
490df2db7a0SMatthew G. Knepley       suffix: parmetis
491df2db7a0SMatthew G. Knepley       requires: parmetis
492df2db7a0SMatthew G. Knepley       args: -petscpartitioner_type parmetis
493df2db7a0SMatthew G. Knepley     test:
494df2db7a0SMatthew G. Knepley       suffix: ptscotch
495df2db7a0SMatthew G. Knepley       requires: ptscotch
496df2db7a0SMatthew G. Knepley       args: -petscpartitioner_type ptscotch
497df2db7a0SMatthew G. Knepley 
498df2db7a0SMatthew G. Knepley TEST*/
499