xref: /petsc/src/vec/is/tests/ex5.c (revision c5997e4300c7fea2df85e5b0976a2aebbbeb10b8)
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 
96d71ae5a4SJacob Faibussowitsch PetscErrorCode ProcessOptions(MPI_Comm comm, AppCtx *options)
97d71ae5a4SJacob Faibussowitsch {
983ceb54acSksagiyam   PetscFunctionBegin;
993ceb54acSksagiyam   options->fname[0]             = '\0';
1003ceb54acSksagiyam   options->includes_constraints = PETSC_TRUE;
101d0609cedSBarry Smith   PetscOptionsBegin(comm, "", "PetscSectionView()/Load() in HDF5 Test Options", "DMPLEX");
1029566063dSJacob Faibussowitsch   PetscCall(PetscOptionsString("-fname", "The output file", "ex5.c", options->fname, options->fname, sizeof(options->fname), NULL));
1039566063dSJacob Faibussowitsch   PetscCall(PetscOptionsBool("-includes_constraints", "Flag for if global section is to include constrained DoFs or not", "ex5.c", options->includes_constraints, &options->includes_constraints, NULL));
104d0609cedSBarry Smith   PetscOptionsEnd();
1053ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1063ceb54acSksagiyam }
1073ceb54acSksagiyam 
108d71ae5a4SJacob Faibussowitsch int main(int argc, char **argv)
109d71ae5a4SJacob Faibussowitsch {
1103ceb54acSksagiyam   MPI_Comm    comm;
1113ceb54acSksagiyam   PetscMPIInt size, rank, mycolor;
1123ceb54acSksagiyam   AppCtx      user;
1133ceb54acSksagiyam 
114327415f7SBarry Smith   PetscFunctionBeginUser;
1159566063dSJacob Faibussowitsch   PetscCall(PetscInitialize(&argc, &argv, NULL, help));
1169566063dSJacob Faibussowitsch   PetscCall(ProcessOptions(PETSC_COMM_WORLD, &user));
1179566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_size(PETSC_COMM_WORLD, &size));
1189566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank));
119be096a46SBarry Smith   PetscCheck(size >= 3, PETSC_COMM_WORLD, PETSC_ERR_WRONG_MPI_SIZE, "Example only works with three or more processes");
1203ceb54acSksagiyam 
1213ceb54acSksagiyam   /* Save */
1223ceb54acSksagiyam   mycolor = (PetscMPIInt)(rank >= 2);
1239566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_split(PETSC_COMM_WORLD, mycolor, rank, &comm));
1243ceb54acSksagiyam   if (mycolor == 0) {
1253ceb54acSksagiyam     PetscSection section, gsection;
1263ceb54acSksagiyam     PetscSF      sf;
1273ceb54acSksagiyam     PetscInt     nroots = -1, nleaves = -1, *ilocal;
1283ceb54acSksagiyam     PetscSFNode *iremote;
1293ceb54acSksagiyam     PetscViewer  viewer;
1303ceb54acSksagiyam 
1313ceb54acSksagiyam     /* Create section */
1329566063dSJacob Faibussowitsch     PetscCall(PetscSectionCreate(comm, &section));
1339566063dSJacob Faibussowitsch     PetscCall(PetscSectionSetNumFields(section, 2));
1343ceb54acSksagiyam     switch (rank) {
1353ceb54acSksagiyam     case 0:
1369566063dSJacob Faibussowitsch       PetscCall(PetscSectionSetChart(section, 0, 4));
1379566063dSJacob Faibussowitsch       PetscCall(PetscSectionSetDof(section, 0, 3));
1389566063dSJacob Faibussowitsch       PetscCall(PetscSectionSetDof(section, 1, 3));
1399566063dSJacob Faibussowitsch       PetscCall(PetscSectionSetDof(section, 2, 5));
1409566063dSJacob Faibussowitsch       PetscCall(PetscSectionSetDof(section, 3, 7));
1419566063dSJacob Faibussowitsch       PetscCall(PetscSectionSetFieldDof(section, 0, 0, 2));
1429566063dSJacob Faibussowitsch       PetscCall(PetscSectionSetFieldDof(section, 1, 0, 3));
1439566063dSJacob Faibussowitsch       PetscCall(PetscSectionSetFieldDof(section, 2, 0, 5));
1449566063dSJacob Faibussowitsch       PetscCall(PetscSectionSetFieldDof(section, 3, 0, 7));
1459566063dSJacob Faibussowitsch       PetscCall(PetscSectionSetFieldDof(section, 0, 1, 1));
1463ceb54acSksagiyam       break;
1473ceb54acSksagiyam     case 1:
1489566063dSJacob Faibussowitsch       PetscCall(PetscSectionSetChart(section, 0, 3));
1499566063dSJacob Faibussowitsch       PetscCall(PetscSectionSetDof(section, 0, 7));
1509566063dSJacob Faibussowitsch       PetscCall(PetscSectionSetDof(section, 1, 5));
1519566063dSJacob Faibussowitsch       PetscCall(PetscSectionSetDof(section, 2, 13));
1529566063dSJacob Faibussowitsch       PetscCall(PetscSectionSetConstraintDof(section, 2, 1));
1539566063dSJacob Faibussowitsch       PetscCall(PetscSectionSetFieldDof(section, 0, 0, 7));
1549566063dSJacob Faibussowitsch       PetscCall(PetscSectionSetFieldDof(section, 1, 0, 5));
1559566063dSJacob Faibussowitsch       PetscCall(PetscSectionSetFieldDof(section, 2, 0, 11));
1569566063dSJacob Faibussowitsch       PetscCall(PetscSectionSetFieldDof(section, 2, 1, 2));
1579566063dSJacob Faibussowitsch       PetscCall(PetscSectionSetFieldConstraintDof(section, 2, 0, 1));
1583ceb54acSksagiyam       break;
1593ceb54acSksagiyam     }
1609566063dSJacob Faibussowitsch     PetscCall(PetscSectionSetUp(section));
1619371c9d4SSatish Balay     if (rank == 1) {
1623ceb54acSksagiyam       const PetscInt indices[]  = {7};
1633ceb54acSksagiyam       const PetscInt indices0[] = {7};
1643ceb54acSksagiyam 
1659566063dSJacob Faibussowitsch       PetscCall(PetscSectionSetConstraintIndices(section, 2, indices));
1669566063dSJacob Faibussowitsch       PetscCall(PetscSectionSetFieldConstraintIndices(section, 2, 0, indices0));
1673ceb54acSksagiyam     }
1683ceb54acSksagiyam     /* Create sf */
1693ceb54acSksagiyam     switch (rank) {
1703ceb54acSksagiyam     case 0:
1713ceb54acSksagiyam       nroots  = 4;
1723ceb54acSksagiyam       nleaves = 1;
1739566063dSJacob Faibussowitsch       PetscCall(PetscMalloc1(nleaves, &ilocal));
1749566063dSJacob Faibussowitsch       PetscCall(PetscMalloc1(nleaves, &iremote));
1753ceb54acSksagiyam       ilocal[0]        = 3;
1763ceb54acSksagiyam       iremote[0].rank  = 1;
1773ceb54acSksagiyam       iremote[0].index = 0;
1783ceb54acSksagiyam       break;
1793ceb54acSksagiyam     case 1:
1803ceb54acSksagiyam       nroots  = 3;
1813ceb54acSksagiyam       nleaves = 1;
1829566063dSJacob Faibussowitsch       PetscCall(PetscMalloc1(nleaves, &ilocal));
1839566063dSJacob Faibussowitsch       PetscCall(PetscMalloc1(nleaves, &iremote));
1843ceb54acSksagiyam       ilocal[0]        = 1;
1853ceb54acSksagiyam       iremote[0].rank  = 0;
1863ceb54acSksagiyam       iremote[0].index = 2;
1873ceb54acSksagiyam       break;
1883ceb54acSksagiyam     }
1899566063dSJacob Faibussowitsch     PetscCall(PetscSFCreate(comm, &sf));
1909566063dSJacob Faibussowitsch     PetscCall(PetscSFSetGraph(sf, nroots, nleaves, ilocal, PETSC_OWN_POINTER, iremote, PETSC_OWN_POINTER));
1913ceb54acSksagiyam     /* Create global section*/
192*eb9d3e4dSMatthew G. Knepley     PetscCall(PetscSectionCreateGlobalSection(section, sf, PETSC_TRUE, user.includes_constraints, PETSC_FALSE, &gsection));
1939566063dSJacob Faibussowitsch     PetscCall(PetscSFDestroy(&sf));
1943ceb54acSksagiyam     /* View */
1959566063dSJacob Faibussowitsch     PetscCall(PetscViewerHDF5Open(comm, user.fname, FILE_MODE_WRITE, &viewer));
1969566063dSJacob Faibussowitsch     PetscCall(PetscSectionView(gsection, viewer));
1979566063dSJacob Faibussowitsch     PetscCall(PetscViewerDestroy(&viewer));
1989566063dSJacob Faibussowitsch     PetscCall(PetscObjectSetName((PetscObject)section, "Save: local section"));
1999566063dSJacob Faibussowitsch     PetscCall(PetscSectionView(section, PETSC_VIEWER_STDOUT_(comm)));
2009566063dSJacob Faibussowitsch     PetscCall(PetscObjectSetName((PetscObject)gsection, "Save: global section"));
2019566063dSJacob Faibussowitsch     PetscCall(PetscSectionView(gsection, PETSC_VIEWER_STDOUT_(comm)));
2029566063dSJacob Faibussowitsch     PetscCall(PetscSectionDestroy(&gsection));
2039566063dSJacob Faibussowitsch     PetscCall(PetscSectionDestroy(&section));
2043ceb54acSksagiyam   }
2059566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_free(&comm));
2063ceb54acSksagiyam 
2073ceb54acSksagiyam   /* Load */
2083ceb54acSksagiyam   mycolor = (PetscMPIInt)(rank >= 3);
2099566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_split(PETSC_COMM_WORLD, mycolor, rank, &comm));
2103ceb54acSksagiyam   if (mycolor == 0) {
2113ceb54acSksagiyam     PetscSection section;
2123ceb54acSksagiyam     PetscInt     chartSize = -1;
2133ceb54acSksagiyam     PetscViewer  viewer;
2143ceb54acSksagiyam 
2159566063dSJacob Faibussowitsch     PetscCall(PetscSectionCreate(comm, &section));
2163ceb54acSksagiyam     switch (rank) {
217d71ae5a4SJacob Faibussowitsch     case 0:
218d71ae5a4SJacob Faibussowitsch       chartSize = 4;
219d71ae5a4SJacob Faibussowitsch       break;
220d71ae5a4SJacob Faibussowitsch     case 1:
221d71ae5a4SJacob Faibussowitsch       chartSize = 0;
222d71ae5a4SJacob Faibussowitsch       break;
223d71ae5a4SJacob Faibussowitsch     case 2:
224d71ae5a4SJacob Faibussowitsch       chartSize = 1;
225d71ae5a4SJacob Faibussowitsch       break;
2263ceb54acSksagiyam     }
2279566063dSJacob Faibussowitsch     PetscCall(PetscSectionSetChart(section, 0, chartSize));
2289566063dSJacob Faibussowitsch     PetscCall(PetscViewerHDF5Open(comm, user.fname, FILE_MODE_READ, &viewer));
2299566063dSJacob Faibussowitsch     PetscCall(PetscSectionLoad(section, viewer));
2309566063dSJacob Faibussowitsch     PetscCall(PetscViewerDestroy(&viewer));
2319566063dSJacob Faibussowitsch     PetscCall(PetscObjectSetName((PetscObject)section, "Load: section"));
2329566063dSJacob Faibussowitsch     PetscCall(PetscSectionView(section, PETSC_VIEWER_STDOUT_(comm)));
2339566063dSJacob Faibussowitsch     PetscCall(PetscSectionDestroy(&section));
2343ceb54acSksagiyam   }
2359566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_free(&comm));
2363ceb54acSksagiyam 
2373ceb54acSksagiyam   /* Finalize */
2389566063dSJacob Faibussowitsch   PetscCall(PetscFinalize());
239b122ec5aSJacob Faibussowitsch   return 0;
2403ceb54acSksagiyam }
2413ceb54acSksagiyam 
2423ceb54acSksagiyam /*TEST
2433ceb54acSksagiyam 
2443ceb54acSksagiyam   build:
2453ceb54acSksagiyam     requires: hdf5
2463ceb54acSksagiyam     requires: !complex
2473ceb54acSksagiyam   testset:
2483ceb54acSksagiyam     nsize: 4
2493ceb54acSksagiyam     test:
2503ceb54acSksagiyam       suffix: 0
2513ceb54acSksagiyam       args: -fname ex5_dump.h5 -includes_constraints 0
2523ceb54acSksagiyam     test:
2533ceb54acSksagiyam       suffix: 1
2543ceb54acSksagiyam       args: -fname ex5_dump.h5 -includes_constraints 1
2553ceb54acSksagiyam 
2563ceb54acSksagiyam TEST*/
257