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