Actual source code: ex5.c
1: static char help[] = "Tests PetscSectionView()/Load() with HDF5.\n\n";
3: #include <petscdmshell.h>
4: #include <petscdmplex.h>
5: #include <petscsection.h>
6: #include <petscsf.h>
7: #include <petsclayouthdf5.h>
9: /* Save/Load abstract sections
11: =====================
12: Save on 2 processes
13: =====================
15: section:
16: 0 1 2 3
17: rank 0: Dof (Field 0) 2 3 5 7
18: Dof (Field 1) 1 0 0 0
20: 0 1 2
21: rank 1: Dof (Field 0) 7 5 11 <- DoF 7 is constrained
22: Dof (Field 1) 0 0 2
24: sf:
25: [0] 3 <- (1, 0)
26: [1] 1 <- (0, 2)
28: global section (includesConstraints = PETSC_FALSE):
29: 0 1 2 3
30: rank 0: Dof (Field 0) 2 3 5 -8
31: Off (Field 0) 0 3 6 -12
32: Dof (Field 1) 1 0 0 -1
33: Off (Field 1) 2 6 11 -19
35: 0 1 2
36: rank 1: Dof (Field 0) 7 -6 11
37: Off (Field 0) 11 -7 18
38: Dof (Field 1) 0 -1 2
39: Off (Field 1) 18 -12 28
41: global section (includesConstraints = PETSC_TRUE):
42: 0 1 2 3
43: rank 0: Dof (Field 0) 2 3 5 -8
44: Off (Field 0) 0 3 6 -12
45: Dof (Field 1) 1 0 0 -1
46: Off (Field 1) 2 6 11 -19
48: 0 1 2
49: rank 1: Dof (Field 0) 7 -6 11
50: Off (Field 0) 11 -7 18
51: Dof (Field 1) 0 -1 2
52: Off (Field 1) 18 -12 29
54: =====================
55: Load on 3 Processes
56: =====================
58: (Set chartSize = 4, 0, 1 for rank 0, 1, 2, respectively)
60: global section (includesConstraints = PETSC_FALSE):
62: rank 0: Dof (Field 0) 2 3 5 7
63: Off (Field 0) 0 3 6 11
64: Dof (Field 1) 1 0 0 0
65: Off (Field 1) 2 6 11 18
67: rank 1: Dof (Field 0)
68: Dof (Field 1)
70: rank 2: Dof (Field 0) 11
71: Off (Field 0) 18
72: Dof (Field 1) 2
73: Off (Field 1) 28
75: global section (includesConstraints = PETSC_TRUE):
77: rank 0: Dof (Field 0) 2 3 5 7
78: Off (Field 0) 0 3 6 11
79: Dof (Field 1) 1 0 0 0
80: Off (Field 1) 2 6 11 18
82: rank 1: Dof (Field 0)
83: Dof (Field 1)
85: rank 2: Dof (Field 0) 11
86: Off (Field 0) 18
87: Dof (Field 1) 2
88: Off (Field 1) 29
89: */
91: typedef struct {
92: char fname[PETSC_MAX_PATH_LEN]; /* Output mesh filename */
93: PetscBool includes_constraints; /* Flag for if global section is to include constrained DoFs or not */
94: } AppCtx;
96: PetscErrorCode ProcessOptions(MPI_Comm comm, AppCtx *options)
97: {
98: PetscErrorCode ierr;
100: options->fname[0] = '\0';
101: options->includes_constraints = PETSC_TRUE;
102: PetscOptionsBegin(comm, "", "PetscSectionView()/Load() in HDF5 Test Options", "DMPLEX");
103: PetscOptionsString("-fname", "The output file", "ex5.c", options->fname, options->fname, sizeof(options->fname), NULL);
104: PetscOptionsBool("-includes_constraints", "Flag for if global section is to include constrained DoFs or not", "ex5.c", options->includes_constraints, &options->includes_constraints, NULL);
105: PetscOptionsEnd();
106: return 0;
107: }
109: int main(int argc, char **argv)
110: {
111: MPI_Comm comm;
112: PetscMPIInt size, rank, mycolor;
113: AppCtx user;
115: PetscInitialize(&argc, &argv, NULL, help);
116: ProcessOptions(PETSC_COMM_WORLD, &user);
117: MPI_Comm_size(PETSC_COMM_WORLD, &size);
118: MPI_Comm_rank(PETSC_COMM_WORLD, &rank);
121: /* Save */
122: mycolor = (PetscMPIInt)(rank >= 2);
123: MPI_Comm_split(PETSC_COMM_WORLD, mycolor, rank, &comm);
124: if (mycolor == 0) {
125: PetscSection section, gsection;
126: PetscSF sf;
127: PetscInt nroots = -1, nleaves = -1, *ilocal;
128: PetscSFNode *iremote;
129: PetscViewer viewer;
131: /* Create section */
132: PetscSectionCreate(comm, §ion);
133: PetscSectionSetNumFields(section, 2);
134: switch (rank) {
135: case 0:
136: PetscSectionSetChart(section, 0, 4);
137: PetscSectionSetDof(section, 0, 3);
138: PetscSectionSetDof(section, 1, 3);
139: PetscSectionSetDof(section, 2, 5);
140: PetscSectionSetDof(section, 3, 7);
141: PetscSectionSetFieldDof(section, 0, 0, 2);
142: PetscSectionSetFieldDof(section, 1, 0, 3);
143: PetscSectionSetFieldDof(section, 2, 0, 5);
144: PetscSectionSetFieldDof(section, 3, 0, 7);
145: PetscSectionSetFieldDof(section, 0, 1, 1);
146: break;
147: case 1:
148: PetscSectionSetChart(section, 0, 3);
149: PetscSectionSetDof(section, 0, 7);
150: PetscSectionSetDof(section, 1, 5);
151: PetscSectionSetDof(section, 2, 13);
152: PetscSectionSetConstraintDof(section, 2, 1);
153: PetscSectionSetFieldDof(section, 0, 0, 7);
154: PetscSectionSetFieldDof(section, 1, 0, 5);
155: PetscSectionSetFieldDof(section, 2, 0, 11);
156: PetscSectionSetFieldDof(section, 2, 1, 2);
157: PetscSectionSetFieldConstraintDof(section, 2, 0, 1);
158: break;
159: }
160: PetscSectionSetUp(section);
161: if (rank == 1)
162: {
163: const PetscInt indices[] = {7};
164: const PetscInt indices0[] = {7};
166: PetscSectionSetConstraintIndices(section, 2, indices);
167: PetscSectionSetFieldConstraintIndices(section, 2, 0, indices0);
168: }
169: /* Create sf */
170: switch (rank) {
171: case 0:
172: nroots = 4;
173: nleaves = 1;
174: PetscMalloc1(nleaves, &ilocal);
175: PetscMalloc1(nleaves, &iremote);
176: ilocal[0] = 3;
177: iremote[0].rank = 1;
178: iremote[0].index = 0;
179: break;
180: case 1:
181: nroots = 3;
182: nleaves = 1;
183: PetscMalloc1(nleaves, &ilocal);
184: PetscMalloc1(nleaves, &iremote);
185: ilocal[0] = 1;
186: iremote[0].rank = 0;
187: iremote[0].index = 2;
188: break;
189: }
190: PetscSFCreate(comm, &sf);
191: PetscSFSetGraph(sf, nroots, nleaves, ilocal, PETSC_OWN_POINTER, iremote, PETSC_OWN_POINTER);
192: /* Create global section*/
193: PetscSectionCreateGlobalSection(section, sf, user.includes_constraints, PETSC_FALSE, &gsection);
194: PetscSFDestroy(&sf);
195: /* View */
196: PetscViewerHDF5Open(comm, user.fname, FILE_MODE_WRITE, &viewer);
197: PetscSectionView(gsection, viewer);
198: PetscViewerDestroy(&viewer);
199: PetscObjectSetName((PetscObject)section, "Save: local section");
200: PetscSectionView(section, PETSC_VIEWER_STDOUT_(comm));
201: PetscObjectSetName((PetscObject)gsection, "Save: global section");
202: PetscSectionView(gsection, PETSC_VIEWER_STDOUT_(comm));
203: PetscSectionDestroy(&gsection);
204: PetscSectionDestroy(§ion);
205: }
206: MPI_Comm_free(&comm);
208: /* Load */
209: mycolor = (PetscMPIInt)(rank >= 3);
210: MPI_Comm_split(PETSC_COMM_WORLD, mycolor, rank, &comm);
211: if (mycolor == 0) {
212: PetscSection section;
213: PetscInt chartSize = -1;
214: PetscViewer viewer;
216: PetscSectionCreate(comm, §ion);
217: switch (rank) {
218: case 0:
219: chartSize = 4;
220: break;
221: case 1:
222: chartSize = 0;
223: break;
224: case 2:
225: chartSize = 1;
226: break;
227: }
228: PetscSectionSetChart(section, 0, chartSize);
229: PetscViewerHDF5Open(comm, user.fname, FILE_MODE_READ, &viewer);
230: PetscSectionLoad(section, viewer);
231: PetscViewerDestroy(&viewer);
232: PetscObjectSetName((PetscObject)section, "Load: section");
233: PetscSectionView(section, PETSC_VIEWER_STDOUT_(comm));
234: PetscSectionDestroy(§ion);
235: }
236: MPI_Comm_free(&comm);
238: /* Finalize */
239: PetscFinalize();
240: return 0;
241: }
243: /*TEST
245: build:
246: requires: hdf5
247: requires: !complex
248: testset:
249: nsize: 4
250: test:
251: suffix: 0
252: args: -fname ex5_dump.h5 -includes_constraints 0
253: test:
254: suffix: 1
255: args: -fname ex5_dump.h5 -includes_constraints 1
257: TEST*/