xref: /petsc/src/vec/is/tests/ex5.c (revision b122ec5aa1bd4469eb4e0673542fb7de3f411254)
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);
1045f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsString("-fname", "The output file", "ex5.c", options->fname, options->fname, sizeof(options->fname), NULL));
1055f80ce2aSJacob 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 
116*b122ec5aSJacob Faibussowitsch   CHKERRQ(PetscInitialize(&argc, &argv, NULL, help));
1175f80ce2aSJacob Faibussowitsch   CHKERRQ(ProcessOptions(PETSC_COMM_WORLD, &user));
1185f80ce2aSJacob Faibussowitsch   CHKERRMPI(MPI_Comm_size(PETSC_COMM_WORLD, &size));
1195f80ce2aSJacob Faibussowitsch   CHKERRMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank));
1202c71b3e2SJacob Faibussowitsch   PetscCheckFalse(size < 3,PETSC_COMM_WORLD, PETSC_ERR_WRONG_MPI_SIZE, "Example only works with three or more processes");
1213ceb54acSksagiyam 
1223ceb54acSksagiyam   /* Save */
1233ceb54acSksagiyam   mycolor = (PetscMPIInt)(rank >= 2);
1245f80ce2aSJacob Faibussowitsch   CHKERRMPI(MPI_Comm_split(PETSC_COMM_WORLD, mycolor, rank, &comm));
1253ceb54acSksagiyam   if (mycolor == 0) {
1263ceb54acSksagiyam     PetscSection  section, gsection;
1273ceb54acSksagiyam     PetscSF       sf;
1283ceb54acSksagiyam     PetscInt      nroots = -1, nleaves = -1, *ilocal;
1293ceb54acSksagiyam     PetscSFNode  *iremote;
1303ceb54acSksagiyam     PetscViewer   viewer;
1313ceb54acSksagiyam 
1323ceb54acSksagiyam     /* Create section */
1335f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscSectionCreate(comm, &section));
1345f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscSectionSetNumFields(section, 2));
1353ceb54acSksagiyam     switch (rank) {
1363ceb54acSksagiyam     case 0:
1375f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscSectionSetChart(section, 0, 4));
1385f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscSectionSetDof(section, 0, 3));
1395f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscSectionSetDof(section, 1, 3));
1405f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscSectionSetDof(section, 2, 5));
1415f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscSectionSetDof(section, 3, 7));
1425f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscSectionSetFieldDof(section, 0, 0, 2));
1435f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscSectionSetFieldDof(section, 1, 0, 3));
1445f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscSectionSetFieldDof(section, 2, 0, 5));
1455f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscSectionSetFieldDof(section, 3, 0, 7));
1465f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscSectionSetFieldDof(section, 0, 1, 1));
1473ceb54acSksagiyam       break;
1483ceb54acSksagiyam     case 1:
1495f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscSectionSetChart(section, 0, 3));
1505f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscSectionSetDof(section, 0, 7));
1515f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscSectionSetDof(section, 1, 5));
1525f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscSectionSetDof(section, 2, 13));
1535f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscSectionSetConstraintDof(section, 2, 1));
1545f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscSectionSetFieldDof(section, 0, 0, 7));
1555f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscSectionSetFieldDof(section, 1, 0, 5));
1565f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscSectionSetFieldDof(section, 2, 0, 11));
1575f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscSectionSetFieldDof(section, 2, 1, 2));
1585f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscSectionSetFieldConstraintDof(section, 2, 0, 1));
1593ceb54acSksagiyam       break;
1603ceb54acSksagiyam     }
1615f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscSectionSetUp(section));
1623ceb54acSksagiyam     if (rank == 1)
1633ceb54acSksagiyam     {
1643ceb54acSksagiyam       const PetscInt indices[] = {7};
1653ceb54acSksagiyam       const PetscInt indices0[] = {7};
1663ceb54acSksagiyam 
1675f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscSectionSetConstraintIndices(section, 2, indices));
1685f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscSectionSetFieldConstraintIndices(section, 2, 0, indices0));
1693ceb54acSksagiyam     }
1703ceb54acSksagiyam     /* Create sf */
1713ceb54acSksagiyam     switch (rank) {
1723ceb54acSksagiyam     case 0:
1733ceb54acSksagiyam       nroots = 4;
1743ceb54acSksagiyam       nleaves = 1;
1755f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscMalloc1(nleaves, &ilocal));
1765f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscMalloc1(nleaves, &iremote));
1773ceb54acSksagiyam       ilocal[0] = 3;
1783ceb54acSksagiyam       iremote[0].rank = 1;
1793ceb54acSksagiyam       iremote[0].index = 0;
1803ceb54acSksagiyam       break;
1813ceb54acSksagiyam     case 1:
1823ceb54acSksagiyam       nroots = 3;
1833ceb54acSksagiyam       nleaves = 1;
1845f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscMalloc1(nleaves, &ilocal));
1855f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscMalloc1(nleaves, &iremote));
1863ceb54acSksagiyam       ilocal[0] = 1;
1873ceb54acSksagiyam       iremote[0].rank = 0;
1883ceb54acSksagiyam       iremote[0].index = 2;
1893ceb54acSksagiyam       break;
1903ceb54acSksagiyam     }
1915f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscSFCreate(comm, &sf));
1925f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscSFSetGraph(sf, nroots, nleaves, ilocal, PETSC_OWN_POINTER, iremote, PETSC_OWN_POINTER));
1933ceb54acSksagiyam     /* Create global section*/
1945f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscSectionCreateGlobalSection(section, sf, user.includes_constraints, PETSC_FALSE, &gsection));
1955f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscSFDestroy(&sf));
1963ceb54acSksagiyam     /* View */
1975f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscViewerHDF5Open(comm, user.fname, FILE_MODE_WRITE, &viewer));
1985f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscSectionView(gsection, viewer));
1995f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscViewerDestroy(&viewer));
2005f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscObjectSetName((PetscObject)section, "Save: local section"));
2015f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscSectionView(section, PETSC_VIEWER_STDOUT_(comm)));
2025f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscObjectSetName((PetscObject)gsection, "Save: global section"));
2035f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscSectionView(gsection, PETSC_VIEWER_STDOUT_(comm)));
2045f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscSectionDestroy(&gsection));
2055f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscSectionDestroy(&section));
2063ceb54acSksagiyam   }
2075f80ce2aSJacob Faibussowitsch   CHKERRMPI(MPI_Comm_free(&comm));
2083ceb54acSksagiyam 
2093ceb54acSksagiyam   /* Load */
2103ceb54acSksagiyam   mycolor = (PetscMPIInt)(rank >= 3);
2115f80ce2aSJacob Faibussowitsch   CHKERRMPI(MPI_Comm_split(PETSC_COMM_WORLD, mycolor, rank, &comm));
2123ceb54acSksagiyam   if (mycolor == 0) {
2133ceb54acSksagiyam     PetscSection  section;
2143ceb54acSksagiyam     PetscInt      chartSize = -1;
2153ceb54acSksagiyam     PetscViewer   viewer;
2163ceb54acSksagiyam 
2175f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscSectionCreate(comm, &section));
2183ceb54acSksagiyam     switch (rank) {
2193ceb54acSksagiyam     case 0:
2203ceb54acSksagiyam       chartSize = 4;
2213ceb54acSksagiyam       break;
2223ceb54acSksagiyam     case 1:
2233ceb54acSksagiyam       chartSize = 0;
2243ceb54acSksagiyam       break;
2253ceb54acSksagiyam     case 2:
2263ceb54acSksagiyam       chartSize = 1;
2273ceb54acSksagiyam       break;
2283ceb54acSksagiyam     }
2295f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscSectionSetChart(section, 0, chartSize));
2305f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscViewerHDF5Open(comm, user.fname, FILE_MODE_READ, &viewer));
2315f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscSectionLoad(section, viewer));
2325f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscViewerDestroy(&viewer));
2335f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscObjectSetName((PetscObject)section, "Load: section"));
2345f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscSectionView(section, PETSC_VIEWER_STDOUT_(comm)));
2355f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscSectionDestroy(&section));
2363ceb54acSksagiyam   }
2375f80ce2aSJacob Faibussowitsch   CHKERRMPI(MPI_Comm_free(&comm));
2383ceb54acSksagiyam 
2393ceb54acSksagiyam   /* Finalize */
240*b122ec5aSJacob Faibussowitsch   CHKERRQ(PetscFinalize());
241*b122ec5aSJacob Faibussowitsch   return 0;
2423ceb54acSksagiyam }
2433ceb54acSksagiyam 
2443ceb54acSksagiyam /*TEST
2453ceb54acSksagiyam 
2463ceb54acSksagiyam   build:
2473ceb54acSksagiyam     requires: hdf5
2483ceb54acSksagiyam     requires: !complex
2493ceb54acSksagiyam   testset:
2503ceb54acSksagiyam     nsize: 4
2513ceb54acSksagiyam     test:
2523ceb54acSksagiyam       suffix: 0
2533ceb54acSksagiyam       args: -fname ex5_dump.h5 -includes_constraints 0
2543ceb54acSksagiyam     test:
2553ceb54acSksagiyam       suffix: 1
2563ceb54acSksagiyam       args: -fname ex5_dump.h5 -includes_constraints 1
2573ceb54acSksagiyam 
2583ceb54acSksagiyam TEST*/
259