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