xref: /petsc/src/vec/is/tests/ex5.c (revision 5f80ce2ab25dff0f4601e710601cbbcecf323266)
13ceb54acSksagiyam static char help[] = "Tests PetscSectionView()/Load() with HDF5.\n\n";
23ceb54acSksagiyam 
33ceb54acSksagiyam #include <petscdmshell.h>
43ceb54acSksagiyam #include <petscdmplex.h>
53ceb54acSksagiyam #include <petscsection.h>
63ceb54acSksagiyam #include <petscsf.h>
73ceb54acSksagiyam #include <petsclayouthdf5.h>
83ceb54acSksagiyam 
93ceb54acSksagiyam /* Save/Load abstract sections
103ceb54acSksagiyam 
113ceb54acSksagiyam =====================
123ceb54acSksagiyam  Save on 2 processes
133ceb54acSksagiyam =====================
143ceb54acSksagiyam 
153ceb54acSksagiyam section:
163ceb54acSksagiyam                          0   1   2   3
173ceb54acSksagiyam   rank 0: Dof (Field 0)  2   3   5   7
183ceb54acSksagiyam           Dof (Field 1)  1   0   0   0
193ceb54acSksagiyam 
203ceb54acSksagiyam                          0   1   2
213ceb54acSksagiyam   rank 1: Dof (Field 0)  7   5  11 <- DoF 7 is constrained
223ceb54acSksagiyam           Dof (Field 1)  0   0   2
233ceb54acSksagiyam 
243ceb54acSksagiyam sf:
253ceb54acSksagiyam   [0] 3 <- (1, 0)
263ceb54acSksagiyam   [1] 1 <- (0, 2)
273ceb54acSksagiyam 
283ceb54acSksagiyam global section (includesConstraints = PETSC_FALSE):
293ceb54acSksagiyam                          0   1   2   3
303ceb54acSksagiyam   rank 0: Dof (Field 0)  2   3   5  -8
313ceb54acSksagiyam           Off (Field 0)  0   3   6  -12
323ceb54acSksagiyam           Dof (Field 1)  1   0   0  -1
333ceb54acSksagiyam           Off (Field 1)  2   6  11  -19
343ceb54acSksagiyam 
353ceb54acSksagiyam                          0   1   2
363ceb54acSksagiyam   rank 1: Dof (Field 0)  7  -6  11
373ceb54acSksagiyam           Off (Field 0) 11  -7  18
383ceb54acSksagiyam           Dof (Field 1)  0  -1   2
393ceb54acSksagiyam           Off (Field 1) 18 -12  28
403ceb54acSksagiyam 
413ceb54acSksagiyam global section (includesConstraints = PETSC_TRUE):
423ceb54acSksagiyam                          0   1   2   3
433ceb54acSksagiyam   rank 0: Dof (Field 0)  2   3   5  -8
443ceb54acSksagiyam           Off (Field 0)  0   3   6  -12
453ceb54acSksagiyam           Dof (Field 1)  1   0   0  -1
463ceb54acSksagiyam           Off (Field 1)  2   6  11  -19
473ceb54acSksagiyam 
483ceb54acSksagiyam                          0   1   2
493ceb54acSksagiyam   rank 1: Dof (Field 0)  7  -6  11
503ceb54acSksagiyam           Off (Field 0) 11  -7  18
513ceb54acSksagiyam           Dof (Field 1)  0  -1   2
523ceb54acSksagiyam           Off (Field 1) 18 -12  29
533ceb54acSksagiyam 
543ceb54acSksagiyam =====================
553ceb54acSksagiyam  Load on 3 Processes
563ceb54acSksagiyam =====================
573ceb54acSksagiyam 
583ceb54acSksagiyam (Set chartSize = 4, 0, 1 for rank 0, 1, 2, respectively)
593ceb54acSksagiyam 
603ceb54acSksagiyam global section (includesConstraints = PETSC_FALSE):
613ceb54acSksagiyam 
623ceb54acSksagiyam   rank 0: Dof (Field 0)  2   3   5   7
633ceb54acSksagiyam           Off (Field 0)  0   3   6  11
643ceb54acSksagiyam           Dof (Field 1)  1   0   0   0
653ceb54acSksagiyam           Off (Field 1)  2   6  11  18
663ceb54acSksagiyam 
673ceb54acSksagiyam   rank 1: Dof (Field 0)
683ceb54acSksagiyam           Dof (Field 1)
693ceb54acSksagiyam 
703ceb54acSksagiyam   rank 2: Dof (Field 0) 11
713ceb54acSksagiyam           Off (Field 0) 18
723ceb54acSksagiyam           Dof (Field 1)  2
733ceb54acSksagiyam           Off (Field 1) 28
743ceb54acSksagiyam 
753ceb54acSksagiyam global section (includesConstraints = PETSC_TRUE):
763ceb54acSksagiyam 
773ceb54acSksagiyam   rank 0: Dof (Field 0)  2   3   5   7
783ceb54acSksagiyam           Off (Field 0)  0   3   6  11
793ceb54acSksagiyam           Dof (Field 1)  1   0   0   0
803ceb54acSksagiyam           Off (Field 1)  2   6  11  18
813ceb54acSksagiyam 
823ceb54acSksagiyam   rank 1: Dof (Field 0)
833ceb54acSksagiyam           Dof (Field 1)
843ceb54acSksagiyam 
853ceb54acSksagiyam   rank 2: Dof (Field 0) 11
863ceb54acSksagiyam           Off (Field 0) 18
873ceb54acSksagiyam           Dof (Field 1)  2
883ceb54acSksagiyam           Off (Field 1) 29
893ceb54acSksagiyam */
903ceb54acSksagiyam 
913ceb54acSksagiyam typedef struct {
923ceb54acSksagiyam   char      fname[PETSC_MAX_PATH_LEN]; /* Output mesh filename */
933ceb54acSksagiyam   PetscBool includes_constraints;      /* Flag for if global section is to include constrained DoFs or not */
943ceb54acSksagiyam } AppCtx;
953ceb54acSksagiyam 
963ceb54acSksagiyam PetscErrorCode ProcessOptions(MPI_Comm comm, AppCtx *options)
973ceb54acSksagiyam {
983ceb54acSksagiyam   PetscErrorCode  ierr;
993ceb54acSksagiyam 
1003ceb54acSksagiyam   PetscFunctionBegin;
1013ceb54acSksagiyam   options->fname[0] = '\0';
1023ceb54acSksagiyam   options->includes_constraints = PETSC_TRUE;
1033ceb54acSksagiyam   ierr = PetscOptionsBegin(comm, "", "PetscSectionView()/Load() in HDF5 Test Options", "DMPLEX");CHKERRQ(ierr);
104*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsString("-fname", "The output file", "ex5.c", options->fname, options->fname, sizeof(options->fname), NULL));
105*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsBool("-includes_constraints", "Flag for if global section is to include constrained DoFs or not", "ex5.c", options->includes_constraints, &options->includes_constraints, NULL));
1061e1ea65dSPierre Jolivet   ierr = PetscOptionsEnd();CHKERRQ(ierr);
1073ceb54acSksagiyam   PetscFunctionReturn(0);
1083ceb54acSksagiyam }
1093ceb54acSksagiyam 
1103ceb54acSksagiyam int main(int argc, char **argv)
1113ceb54acSksagiyam {
1123ceb54acSksagiyam   MPI_Comm        comm;
1133ceb54acSksagiyam   PetscMPIInt     size, rank, mycolor;
1143ceb54acSksagiyam   AppCtx          user;
1153ceb54acSksagiyam   PetscErrorCode  ierr;
1163ceb54acSksagiyam 
1173ceb54acSksagiyam   ierr = PetscInitialize(&argc, &argv, NULL, help); if (ierr) return ierr;
118*5f80ce2aSJacob Faibussowitsch   CHKERRQ(ProcessOptions(PETSC_COMM_WORLD, &user));
119*5f80ce2aSJacob Faibussowitsch   CHKERRMPI(MPI_Comm_size(PETSC_COMM_WORLD, &size));
120*5f80ce2aSJacob Faibussowitsch   CHKERRMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank));
1212c71b3e2SJacob Faibussowitsch   PetscCheckFalse(size < 3,PETSC_COMM_WORLD, PETSC_ERR_WRONG_MPI_SIZE, "Example only works with three or more processes");
1223ceb54acSksagiyam 
1233ceb54acSksagiyam   /* Save */
1243ceb54acSksagiyam   mycolor = (PetscMPIInt)(rank >= 2);
125*5f80ce2aSJacob Faibussowitsch   CHKERRMPI(MPI_Comm_split(PETSC_COMM_WORLD, mycolor, rank, &comm));
1263ceb54acSksagiyam   if (mycolor == 0) {
1273ceb54acSksagiyam     PetscSection  section, gsection;
1283ceb54acSksagiyam     PetscSF       sf;
1293ceb54acSksagiyam     PetscInt      nroots = -1, nleaves = -1, *ilocal;
1303ceb54acSksagiyam     PetscSFNode  *iremote;
1313ceb54acSksagiyam     PetscViewer   viewer;
1323ceb54acSksagiyam 
1333ceb54acSksagiyam     /* Create section */
134*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscSectionCreate(comm, &section));
135*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscSectionSetNumFields(section, 2));
1363ceb54acSksagiyam     switch (rank) {
1373ceb54acSksagiyam     case 0:
138*5f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscSectionSetChart(section, 0, 4));
139*5f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscSectionSetDof(section, 0, 3));
140*5f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscSectionSetDof(section, 1, 3));
141*5f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscSectionSetDof(section, 2, 5));
142*5f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscSectionSetDof(section, 3, 7));
143*5f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscSectionSetFieldDof(section, 0, 0, 2));
144*5f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscSectionSetFieldDof(section, 1, 0, 3));
145*5f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscSectionSetFieldDof(section, 2, 0, 5));
146*5f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscSectionSetFieldDof(section, 3, 0, 7));
147*5f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscSectionSetFieldDof(section, 0, 1, 1));
1483ceb54acSksagiyam       break;
1493ceb54acSksagiyam     case 1:
150*5f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscSectionSetChart(section, 0, 3));
151*5f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscSectionSetDof(section, 0, 7));
152*5f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscSectionSetDof(section, 1, 5));
153*5f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscSectionSetDof(section, 2, 13));
154*5f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscSectionSetConstraintDof(section, 2, 1));
155*5f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscSectionSetFieldDof(section, 0, 0, 7));
156*5f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscSectionSetFieldDof(section, 1, 0, 5));
157*5f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscSectionSetFieldDof(section, 2, 0, 11));
158*5f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscSectionSetFieldDof(section, 2, 1, 2));
159*5f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscSectionSetFieldConstraintDof(section, 2, 0, 1));
1603ceb54acSksagiyam       break;
1613ceb54acSksagiyam     }
162*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscSectionSetUp(section));
1633ceb54acSksagiyam     if (rank == 1)
1643ceb54acSksagiyam     {
1653ceb54acSksagiyam       const PetscInt indices[] = {7};
1663ceb54acSksagiyam       const PetscInt indices0[] = {7};
1673ceb54acSksagiyam 
168*5f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscSectionSetConstraintIndices(section, 2, indices));
169*5f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscSectionSetFieldConstraintIndices(section, 2, 0, indices0));
1703ceb54acSksagiyam     }
1713ceb54acSksagiyam     /* Create sf */
1723ceb54acSksagiyam     switch (rank) {
1733ceb54acSksagiyam     case 0:
1743ceb54acSksagiyam       nroots = 4;
1753ceb54acSksagiyam       nleaves = 1;
176*5f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscMalloc1(nleaves, &ilocal));
177*5f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscMalloc1(nleaves, &iremote));
1783ceb54acSksagiyam       ilocal[0] = 3;
1793ceb54acSksagiyam       iremote[0].rank = 1;
1803ceb54acSksagiyam       iremote[0].index = 0;
1813ceb54acSksagiyam       break;
1823ceb54acSksagiyam     case 1:
1833ceb54acSksagiyam       nroots = 3;
1843ceb54acSksagiyam       nleaves = 1;
185*5f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscMalloc1(nleaves, &ilocal));
186*5f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscMalloc1(nleaves, &iremote));
1873ceb54acSksagiyam       ilocal[0] = 1;
1883ceb54acSksagiyam       iremote[0].rank = 0;
1893ceb54acSksagiyam       iremote[0].index = 2;
1903ceb54acSksagiyam       break;
1913ceb54acSksagiyam     }
192*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscSFCreate(comm, &sf));
193*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscSFSetGraph(sf, nroots, nleaves, ilocal, PETSC_OWN_POINTER, iremote, PETSC_OWN_POINTER));
1943ceb54acSksagiyam     /* Create global section*/
195*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscSectionCreateGlobalSection(section, sf, user.includes_constraints, PETSC_FALSE, &gsection));
196*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscSFDestroy(&sf));
1973ceb54acSksagiyam     /* View */
198*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscViewerHDF5Open(comm, user.fname, FILE_MODE_WRITE, &viewer));
199*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscSectionView(gsection, viewer));
200*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscViewerDestroy(&viewer));
201*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscObjectSetName((PetscObject)section, "Save: local section"));
202*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscSectionView(section, PETSC_VIEWER_STDOUT_(comm)));
203*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscObjectSetName((PetscObject)gsection, "Save: global section"));
204*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscSectionView(gsection, PETSC_VIEWER_STDOUT_(comm)));
205*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscSectionDestroy(&gsection));
206*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscSectionDestroy(&section));
2073ceb54acSksagiyam   }
208*5f80ce2aSJacob Faibussowitsch   CHKERRMPI(MPI_Comm_free(&comm));
2093ceb54acSksagiyam 
2103ceb54acSksagiyam   /* Load */
2113ceb54acSksagiyam   mycolor = (PetscMPIInt)(rank >= 3);
212*5f80ce2aSJacob Faibussowitsch   CHKERRMPI(MPI_Comm_split(PETSC_COMM_WORLD, mycolor, rank, &comm));
2133ceb54acSksagiyam   if (mycolor == 0) {
2143ceb54acSksagiyam     PetscSection  section;
2153ceb54acSksagiyam     PetscInt      chartSize = -1;
2163ceb54acSksagiyam     PetscViewer   viewer;
2173ceb54acSksagiyam 
218*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscSectionCreate(comm, &section));
2193ceb54acSksagiyam     switch (rank) {
2203ceb54acSksagiyam     case 0:
2213ceb54acSksagiyam       chartSize = 4;
2223ceb54acSksagiyam       break;
2233ceb54acSksagiyam     case 1:
2243ceb54acSksagiyam       chartSize = 0;
2253ceb54acSksagiyam       break;
2263ceb54acSksagiyam     case 2:
2273ceb54acSksagiyam       chartSize = 1;
2283ceb54acSksagiyam       break;
2293ceb54acSksagiyam     }
230*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscSectionSetChart(section, 0, chartSize));
231*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscViewerHDF5Open(comm, user.fname, FILE_MODE_READ, &viewer));
232*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscSectionLoad(section, viewer));
233*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscViewerDestroy(&viewer));
234*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscObjectSetName((PetscObject)section, "Load: section"));
235*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscSectionView(section, PETSC_VIEWER_STDOUT_(comm)));
236*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscSectionDestroy(&section));
2373ceb54acSksagiyam   }
238*5f80ce2aSJacob Faibussowitsch   CHKERRMPI(MPI_Comm_free(&comm));
2393ceb54acSksagiyam 
2403ceb54acSksagiyam   /* Finalize */
2413ceb54acSksagiyam   ierr = PetscFinalize();
2423ceb54acSksagiyam   return ierr;
2433ceb54acSksagiyam }
2443ceb54acSksagiyam 
2453ceb54acSksagiyam /*TEST
2463ceb54acSksagiyam 
2473ceb54acSksagiyam   build:
2483ceb54acSksagiyam     requires: hdf5
2493ceb54acSksagiyam     requires: !complex
2503ceb54acSksagiyam   testset:
2513ceb54acSksagiyam     nsize: 4
2523ceb54acSksagiyam     test:
2533ceb54acSksagiyam       suffix: 0
2543ceb54acSksagiyam       args: -fname ex5_dump.h5 -includes_constraints 0
2553ceb54acSksagiyam     test:
2563ceb54acSksagiyam       suffix: 1
2573ceb54acSksagiyam       args: -fname ex5_dump.h5 -includes_constraints 1
2583ceb54acSksagiyam 
2593ceb54acSksagiyam TEST*/
260