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, §ion));
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(§ion));
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, §ion));
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(§ion));
416df2db7a0SMatthew G. Knepley PetscCall(DMPlexSectionLoad(dm, viewer, sdm, sfXC, &gsf, &lsf));
417df2db7a0SMatthew G. Knepley /* Load as local vector */
418df2db7a0SMatthew G. Knepley PetscCall(DMGetLocalSection(sdm, §ion));
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