1*3ceb54acSksagiyam static char help[] = "Tests PetscSectionView()/Load() with HDF5.\n\n"; 2*3ceb54acSksagiyam 3*3ceb54acSksagiyam #include <petscdmshell.h> 4*3ceb54acSksagiyam #include <petscdmplex.h> 5*3ceb54acSksagiyam #include <petscsection.h> 6*3ceb54acSksagiyam #include <petscsf.h> 7*3ceb54acSksagiyam #include <petsclayouthdf5.h> 8*3ceb54acSksagiyam 9*3ceb54acSksagiyam /* Save/Load abstract sections 10*3ceb54acSksagiyam 11*3ceb54acSksagiyam ===================== 12*3ceb54acSksagiyam Save on 2 processes 13*3ceb54acSksagiyam ===================== 14*3ceb54acSksagiyam 15*3ceb54acSksagiyam section: 16*3ceb54acSksagiyam 0 1 2 3 17*3ceb54acSksagiyam rank 0: Dof (Field 0) 2 3 5 7 18*3ceb54acSksagiyam Dof (Field 1) 1 0 0 0 19*3ceb54acSksagiyam 20*3ceb54acSksagiyam 0 1 2 21*3ceb54acSksagiyam rank 1: Dof (Field 0) 7 5 11 <- DoF 7 is constrained 22*3ceb54acSksagiyam Dof (Field 1) 0 0 2 23*3ceb54acSksagiyam 24*3ceb54acSksagiyam sf: 25*3ceb54acSksagiyam [0] 3 <- (1, 0) 26*3ceb54acSksagiyam [1] 1 <- (0, 2) 27*3ceb54acSksagiyam 28*3ceb54acSksagiyam global section (includesConstraints = PETSC_FALSE): 29*3ceb54acSksagiyam 0 1 2 3 30*3ceb54acSksagiyam rank 0: Dof (Field 0) 2 3 5 -8 31*3ceb54acSksagiyam Off (Field 0) 0 3 6 -12 32*3ceb54acSksagiyam Dof (Field 1) 1 0 0 -1 33*3ceb54acSksagiyam Off (Field 1) 2 6 11 -19 34*3ceb54acSksagiyam 35*3ceb54acSksagiyam 0 1 2 36*3ceb54acSksagiyam rank 1: Dof (Field 0) 7 -6 11 37*3ceb54acSksagiyam Off (Field 0) 11 -7 18 38*3ceb54acSksagiyam Dof (Field 1) 0 -1 2 39*3ceb54acSksagiyam Off (Field 1) 18 -12 28 40*3ceb54acSksagiyam 41*3ceb54acSksagiyam global section (includesConstraints = PETSC_TRUE): 42*3ceb54acSksagiyam 0 1 2 3 43*3ceb54acSksagiyam rank 0: Dof (Field 0) 2 3 5 -8 44*3ceb54acSksagiyam Off (Field 0) 0 3 6 -12 45*3ceb54acSksagiyam Dof (Field 1) 1 0 0 -1 46*3ceb54acSksagiyam Off (Field 1) 2 6 11 -19 47*3ceb54acSksagiyam 48*3ceb54acSksagiyam 0 1 2 49*3ceb54acSksagiyam rank 1: Dof (Field 0) 7 -6 11 50*3ceb54acSksagiyam Off (Field 0) 11 -7 18 51*3ceb54acSksagiyam Dof (Field 1) 0 -1 2 52*3ceb54acSksagiyam Off (Field 1) 18 -12 29 53*3ceb54acSksagiyam 54*3ceb54acSksagiyam ===================== 55*3ceb54acSksagiyam Load on 3 Processes 56*3ceb54acSksagiyam ===================== 57*3ceb54acSksagiyam 58*3ceb54acSksagiyam (Set chartSize = 4, 0, 1 for rank 0, 1, 2, respectively) 59*3ceb54acSksagiyam 60*3ceb54acSksagiyam global section (includesConstraints = PETSC_FALSE): 61*3ceb54acSksagiyam 62*3ceb54acSksagiyam rank 0: Dof (Field 0) 2 3 5 7 63*3ceb54acSksagiyam Off (Field 0) 0 3 6 11 64*3ceb54acSksagiyam Dof (Field 1) 1 0 0 0 65*3ceb54acSksagiyam Off (Field 1) 2 6 11 18 66*3ceb54acSksagiyam 67*3ceb54acSksagiyam rank 1: Dof (Field 0) 68*3ceb54acSksagiyam Dof (Field 1) 69*3ceb54acSksagiyam 70*3ceb54acSksagiyam rank 2: Dof (Field 0) 11 71*3ceb54acSksagiyam Off (Field 0) 18 72*3ceb54acSksagiyam Dof (Field 1) 2 73*3ceb54acSksagiyam Off (Field 1) 28 74*3ceb54acSksagiyam 75*3ceb54acSksagiyam global section (includesConstraints = PETSC_TRUE): 76*3ceb54acSksagiyam 77*3ceb54acSksagiyam rank 0: Dof (Field 0) 2 3 5 7 78*3ceb54acSksagiyam Off (Field 0) 0 3 6 11 79*3ceb54acSksagiyam Dof (Field 1) 1 0 0 0 80*3ceb54acSksagiyam Off (Field 1) 2 6 11 18 81*3ceb54acSksagiyam 82*3ceb54acSksagiyam rank 1: Dof (Field 0) 83*3ceb54acSksagiyam Dof (Field 1) 84*3ceb54acSksagiyam 85*3ceb54acSksagiyam rank 2: Dof (Field 0) 11 86*3ceb54acSksagiyam Off (Field 0) 18 87*3ceb54acSksagiyam Dof (Field 1) 2 88*3ceb54acSksagiyam Off (Field 1) 29 89*3ceb54acSksagiyam */ 90*3ceb54acSksagiyam 91*3ceb54acSksagiyam typedef struct { 92*3ceb54acSksagiyam char fname[PETSC_MAX_PATH_LEN]; /* Output mesh filename */ 93*3ceb54acSksagiyam PetscBool includes_constraints; /* Flag for if global section is to include constrained DoFs or not */ 94*3ceb54acSksagiyam } AppCtx; 95*3ceb54acSksagiyam 96*3ceb54acSksagiyam PetscErrorCode ProcessOptions(MPI_Comm comm, AppCtx *options) 97*3ceb54acSksagiyam { 98*3ceb54acSksagiyam PetscErrorCode ierr; 99*3ceb54acSksagiyam 100*3ceb54acSksagiyam PetscFunctionBegin; 101*3ceb54acSksagiyam options->fname[0] = '\0'; 102*3ceb54acSksagiyam options->includes_constraints = PETSC_TRUE; 103*3ceb54acSksagiyam ierr = PetscOptionsBegin(comm, "", "PetscSectionView()/Load() in HDF5 Test Options", "DMPLEX");CHKERRQ(ierr); 104*3ceb54acSksagiyam ierr = PetscOptionsString("-fname", "The output file", "ex5.c", options->fname, options->fname, sizeof(options->fname), NULL);CHKERRQ(ierr); 105*3ceb54acSksagiyam ierr = PetscOptionsBool("-includes_constraints", "Flag for if global section is to include constrained DoFs or not", "ex5.c", options->includes_constraints, &options->includes_constraints, NULL);CHKERRQ(ierr); 106*3ceb54acSksagiyam ierr = PetscOptionsEnd(); 107*3ceb54acSksagiyam PetscFunctionReturn(0); 108*3ceb54acSksagiyam } 109*3ceb54acSksagiyam 110*3ceb54acSksagiyam int main(int argc, char **argv) 111*3ceb54acSksagiyam { 112*3ceb54acSksagiyam MPI_Comm comm; 113*3ceb54acSksagiyam PetscMPIInt size, rank, mycolor; 114*3ceb54acSksagiyam AppCtx user; 115*3ceb54acSksagiyam PetscErrorCode ierr; 116*3ceb54acSksagiyam 117*3ceb54acSksagiyam ierr = PetscInitialize(&argc, &argv, NULL, help); if (ierr) return ierr; 118*3ceb54acSksagiyam ierr = ProcessOptions(PETSC_COMM_WORLD, &user);CHKERRQ(ierr); 119*3ceb54acSksagiyam ierr = MPI_Comm_size(PETSC_COMM_WORLD, &size);CHKERRMPI(ierr); 120*3ceb54acSksagiyam ierr = MPI_Comm_rank(PETSC_COMM_WORLD, &rank);CHKERRMPI(ierr); 121*3ceb54acSksagiyam if (size < 3) SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_WRONG_MPI_SIZE, "Example only works with three or more processes"); 122*3ceb54acSksagiyam 123*3ceb54acSksagiyam /* Save */ 124*3ceb54acSksagiyam mycolor = (PetscMPIInt)(rank >= 2); 125*3ceb54acSksagiyam ierr = MPI_Comm_split(PETSC_COMM_WORLD, mycolor, rank, &comm);CHKERRMPI(ierr); 126*3ceb54acSksagiyam if (mycolor == 0) { 127*3ceb54acSksagiyam PetscSection section, gsection; 128*3ceb54acSksagiyam PetscSF sf; 129*3ceb54acSksagiyam PetscInt nroots = -1, nleaves = -1, *ilocal; 130*3ceb54acSksagiyam PetscSFNode *iremote; 131*3ceb54acSksagiyam PetscViewer viewer; 132*3ceb54acSksagiyam 133*3ceb54acSksagiyam /* Create section */ 134*3ceb54acSksagiyam ierr = PetscSectionCreate(comm, §ion);CHKERRQ(ierr); 135*3ceb54acSksagiyam ierr = PetscSectionSetNumFields(section, 2);CHKERRQ(ierr); 136*3ceb54acSksagiyam switch (rank) { 137*3ceb54acSksagiyam case 0: 138*3ceb54acSksagiyam ierr = PetscSectionSetChart(section, 0, 4);CHKERRQ(ierr); 139*3ceb54acSksagiyam ierr = PetscSectionSetDof(section, 0, 3);CHKERRQ(ierr); 140*3ceb54acSksagiyam ierr = PetscSectionSetDof(section, 1, 3);CHKERRQ(ierr); 141*3ceb54acSksagiyam ierr = PetscSectionSetDof(section, 2, 5);CHKERRQ(ierr); 142*3ceb54acSksagiyam ierr = PetscSectionSetDof(section, 3, 7);CHKERRQ(ierr); 143*3ceb54acSksagiyam ierr = PetscSectionSetFieldDof(section, 0, 0, 2);CHKERRQ(ierr); 144*3ceb54acSksagiyam ierr = PetscSectionSetFieldDof(section, 1, 0, 3);CHKERRQ(ierr); 145*3ceb54acSksagiyam ierr = PetscSectionSetFieldDof(section, 2, 0, 5);CHKERRQ(ierr); 146*3ceb54acSksagiyam ierr = PetscSectionSetFieldDof(section, 3, 0, 7);CHKERRQ(ierr); 147*3ceb54acSksagiyam ierr = PetscSectionSetFieldDof(section, 0, 1, 1);CHKERRQ(ierr); 148*3ceb54acSksagiyam break; 149*3ceb54acSksagiyam case 1: 150*3ceb54acSksagiyam ierr = PetscSectionSetChart(section, 0, 3);CHKERRQ(ierr); 151*3ceb54acSksagiyam ierr = PetscSectionSetDof(section, 0, 7);CHKERRQ(ierr); 152*3ceb54acSksagiyam ierr = PetscSectionSetDof(section, 1, 5);CHKERRQ(ierr); 153*3ceb54acSksagiyam ierr = PetscSectionSetDof(section, 2, 13);CHKERRQ(ierr); 154*3ceb54acSksagiyam ierr = PetscSectionSetConstraintDof(section, 2, 1);CHKERRQ(ierr); 155*3ceb54acSksagiyam ierr = PetscSectionSetFieldDof(section, 0, 0, 7);CHKERRQ(ierr); 156*3ceb54acSksagiyam ierr = PetscSectionSetFieldDof(section, 1, 0, 5);CHKERRQ(ierr); 157*3ceb54acSksagiyam ierr = PetscSectionSetFieldDof(section, 2, 0, 11);CHKERRQ(ierr); 158*3ceb54acSksagiyam ierr = PetscSectionSetFieldDof(section, 2, 1, 2);CHKERRQ(ierr); 159*3ceb54acSksagiyam ierr = PetscSectionSetFieldConstraintDof(section, 2, 0, 1);CHKERRQ(ierr); 160*3ceb54acSksagiyam break; 161*3ceb54acSksagiyam } 162*3ceb54acSksagiyam ierr = PetscSectionSetUp(section);CHKERRQ(ierr); 163*3ceb54acSksagiyam if (rank == 1) 164*3ceb54acSksagiyam { 165*3ceb54acSksagiyam const PetscInt indices[] = {7}; 166*3ceb54acSksagiyam const PetscInt indices0[] = {7}; 167*3ceb54acSksagiyam 168*3ceb54acSksagiyam ierr = PetscSectionSetConstraintIndices(section, 2, indices);CHKERRQ(ierr); 169*3ceb54acSksagiyam ierr = PetscSectionSetFieldConstraintIndices(section, 2, 0, indices0);CHKERRQ(ierr); 170*3ceb54acSksagiyam } 171*3ceb54acSksagiyam /* Create sf */ 172*3ceb54acSksagiyam switch (rank) { 173*3ceb54acSksagiyam case 0: 174*3ceb54acSksagiyam nroots = 4; 175*3ceb54acSksagiyam nleaves = 1; 176*3ceb54acSksagiyam ierr = PetscMalloc1(nleaves, &ilocal);CHKERRQ(ierr); 177*3ceb54acSksagiyam ierr = PetscMalloc1(nleaves, &iremote);CHKERRQ(ierr); 178*3ceb54acSksagiyam ilocal[0] = 3; 179*3ceb54acSksagiyam iremote[0].rank = 1; 180*3ceb54acSksagiyam iremote[0].index = 0; 181*3ceb54acSksagiyam break; 182*3ceb54acSksagiyam case 1: 183*3ceb54acSksagiyam nroots = 3; 184*3ceb54acSksagiyam nleaves = 1; 185*3ceb54acSksagiyam ierr = PetscMalloc1(nleaves, &ilocal);CHKERRQ(ierr); 186*3ceb54acSksagiyam ierr = PetscMalloc1(nleaves, &iremote);CHKERRQ(ierr); 187*3ceb54acSksagiyam ilocal[0] = 1; 188*3ceb54acSksagiyam iremote[0].rank = 0; 189*3ceb54acSksagiyam iremote[0].index = 2; 190*3ceb54acSksagiyam break; 191*3ceb54acSksagiyam } 192*3ceb54acSksagiyam ierr = PetscSFCreate(comm, &sf);CHKERRQ(ierr); 193*3ceb54acSksagiyam ierr = PetscSFSetGraph(sf, nroots, nleaves, ilocal, PETSC_OWN_POINTER, iremote, PETSC_OWN_POINTER);CHKERRQ(ierr); 194*3ceb54acSksagiyam /* Create global section*/ 195*3ceb54acSksagiyam ierr = PetscSectionCreateGlobalSection(section, sf, user.includes_constraints, PETSC_FALSE, &gsection);CHKERRQ(ierr); 196*3ceb54acSksagiyam ierr = PetscSFDestroy(&sf);CHKERRQ(ierr); 197*3ceb54acSksagiyam /* View */ 198*3ceb54acSksagiyam ierr = PetscViewerHDF5Open(comm, user.fname, FILE_MODE_WRITE, &viewer);CHKERRQ(ierr); 199*3ceb54acSksagiyam ierr = PetscSectionView(gsection, viewer);CHKERRQ(ierr); 200*3ceb54acSksagiyam ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr); 201*3ceb54acSksagiyam ierr = PetscObjectSetName((PetscObject)section, "Save: local section");CHKERRQ(ierr); 202*3ceb54acSksagiyam ierr = PetscSectionView(section, PETSC_VIEWER_STDOUT_(comm));CHKERRQ(ierr); 203*3ceb54acSksagiyam ierr = PetscObjectSetName((PetscObject)gsection, "Save: global section");CHKERRQ(ierr); 204*3ceb54acSksagiyam ierr = PetscSectionView(gsection, PETSC_VIEWER_STDOUT_(comm));CHKERRQ(ierr); 205*3ceb54acSksagiyam ierr = PetscSectionDestroy(&gsection);CHKERRQ(ierr); 206*3ceb54acSksagiyam ierr = PetscSectionDestroy(§ion);CHKERRQ(ierr); 207*3ceb54acSksagiyam } 208*3ceb54acSksagiyam ierr = MPI_Comm_free(&comm);CHKERRMPI(ierr); 209*3ceb54acSksagiyam 210*3ceb54acSksagiyam /* Load */ 211*3ceb54acSksagiyam mycolor = (PetscMPIInt)(rank >= 3); 212*3ceb54acSksagiyam ierr = MPI_Comm_split(PETSC_COMM_WORLD, mycolor, rank, &comm);CHKERRMPI(ierr); 213*3ceb54acSksagiyam if (mycolor == 0) { 214*3ceb54acSksagiyam PetscSection section; 215*3ceb54acSksagiyam PetscInt chartSize = -1; 216*3ceb54acSksagiyam PetscViewer viewer; 217*3ceb54acSksagiyam 218*3ceb54acSksagiyam ierr = PetscSectionCreate(comm, §ion);CHKERRQ(ierr); 219*3ceb54acSksagiyam switch (rank) { 220*3ceb54acSksagiyam case 0: 221*3ceb54acSksagiyam chartSize = 4; 222*3ceb54acSksagiyam break; 223*3ceb54acSksagiyam case 1: 224*3ceb54acSksagiyam chartSize = 0; 225*3ceb54acSksagiyam break; 226*3ceb54acSksagiyam case 2: 227*3ceb54acSksagiyam chartSize = 1; 228*3ceb54acSksagiyam break; 229*3ceb54acSksagiyam } 230*3ceb54acSksagiyam ierr = PetscSectionSetChart(section, 0, chartSize);CHKERRQ(ierr); 231*3ceb54acSksagiyam ierr = PetscViewerHDF5Open(comm, user.fname, FILE_MODE_READ, &viewer);CHKERRQ(ierr); 232*3ceb54acSksagiyam ierr = PetscSectionLoad(section, viewer);CHKERRQ(ierr); 233*3ceb54acSksagiyam ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr); 234*3ceb54acSksagiyam ierr = PetscObjectSetName((PetscObject)section, "Load: section");CHKERRQ(ierr); 235*3ceb54acSksagiyam ierr = PetscSectionView(section, PETSC_VIEWER_STDOUT_(comm));CHKERRQ(ierr); 236*3ceb54acSksagiyam ierr = PetscSectionDestroy(§ion);CHKERRQ(ierr); 237*3ceb54acSksagiyam } 238*3ceb54acSksagiyam ierr = MPI_Comm_free(&comm);CHKERRMPI(ierr); 239*3ceb54acSksagiyam 240*3ceb54acSksagiyam /* Finalize */ 241*3ceb54acSksagiyam ierr = PetscFinalize(); 242*3ceb54acSksagiyam return ierr; 243*3ceb54acSksagiyam } 244*3ceb54acSksagiyam 245*3ceb54acSksagiyam /*TEST 246*3ceb54acSksagiyam 247*3ceb54acSksagiyam build: 248*3ceb54acSksagiyam requires: hdf5 249*3ceb54acSksagiyam requires: !complex 250*3ceb54acSksagiyam testset: 251*3ceb54acSksagiyam nsize: 4 252*3ceb54acSksagiyam test: 253*3ceb54acSksagiyam suffix: 0 254*3ceb54acSksagiyam args: -fname ex5_dump.h5 -includes_constraints 0 255*3ceb54acSksagiyam test: 256*3ceb54acSksagiyam suffix: 1 257*3ceb54acSksagiyam args: -fname ex5_dump.h5 -includes_constraints 1 258*3ceb54acSksagiyam 259*3ceb54acSksagiyam TEST*/ 260