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, §ion)); 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(§ion)); 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, §ion)); 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(§ion)); 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