1df2db7a0SMatthew G. Knepley static char help[] = "Tests save/load of plex/section/vec in HDF5.\n\n"; 2df2db7a0SMatthew G. Knepley 3df2db7a0SMatthew G. Knepley #include <petscdmshell.h> 4df2db7a0SMatthew G. Knepley #include <petscdmplex.h> 5df2db7a0SMatthew G. Knepley #include <petscsection.h> 6df2db7a0SMatthew G. Knepley #include <petscsf.h> 7df2db7a0SMatthew G. Knepley #include <petsclayouthdf5.h> 8df2db7a0SMatthew G. Knepley 9df2db7a0SMatthew G. Knepley /* A six-element mesh 10df2db7a0SMatthew G. Knepley 11df2db7a0SMatthew G. Knepley ===================== 12df2db7a0SMatthew G. Knepley Save on 2 processes 13df2db7a0SMatthew G. Knepley ===================== 14df2db7a0SMatthew G. Knepley 15df2db7a0SMatthew G. Knepley exampleDMPlex: Local numbering: 16df2db7a0SMatthew G. Knepley 17df2db7a0SMatthew G. Knepley 7---17--8---18--9--19--(12)(24)(13) 18df2db7a0SMatthew G. Knepley | | | | | 19df2db7a0SMatthew G. Knepley rank 0: 20 0 21 1 22 2 (25) (3)(26) 20df2db7a0SMatthew G. Knepley | | | | | 21df2db7a0SMatthew G. Knepley 4---14--5---15--6--16--(10)(23)(11) 22df2db7a0SMatthew G. Knepley 23df2db7a0SMatthew G. Knepley (13)(25)--8--17---9--18--10--19--11 24df2db7a0SMatthew G. Knepley | | | | | 25df2db7a0SMatthew G. Knepley rank 1: (26) (3) 20 0 21 1 22 2 23 26df2db7a0SMatthew G. Knepley | | | | | 27df2db7a0SMatthew G. Knepley (12)(24)--4--14---5--15---6--16---7 28df2db7a0SMatthew G. Knepley 29df2db7a0SMatthew G. Knepley exampleDMPlex: globalPointNumbering: 30df2db7a0SMatthew G. Knepley 31df2db7a0SMatthew G. Knepley 9--23--10--24--11--25--16--32--17--33--18--34--19 32df2db7a0SMatthew G. Knepley | | | | | | | 33df2db7a0SMatthew G. Knepley 26 0 27 1 28 2 35 3 36 4 37 5 38 34df2db7a0SMatthew G. Knepley | | | | | | | 35df2db7a0SMatthew G. Knepley 6--20---7--21---8--22--12--29--13--30--14--31--15 36df2db7a0SMatthew G. Knepley 37df2db7a0SMatthew G. Knepley exampleSectionDM: 38df2db7a0SMatthew G. Knepley - includesConstraints = TRUE for local section (default) 39df2db7a0SMatthew G. Knepley - includesConstraints = FALSE for global section (default) 40df2db7a0SMatthew G. Knepley 41df2db7a0SMatthew G. Knepley exampleSectionDM: Dofs (Field 0): 42df2db7a0SMatthew G. Knepley 43df2db7a0SMatthew G. Knepley 0---0---0---0---0---0---2---0---0---0---0---0---0 44df2db7a0SMatthew G. Knepley | | | | | | | 45df2db7a0SMatthew G. Knepley 0 0 0 0 0 0 0 2 0 0 0 0 0 46df2db7a0SMatthew G. Knepley | | | | | | | 47df2db7a0SMatthew G. Knepley 0---0---0---0---0---0---0---0---0---0---0---0---0 48df2db7a0SMatthew G. Knepley 49df2db7a0SMatthew G. Knepley exampleSectionDM: Dofs (Field 1): constrained 50df2db7a0SMatthew G. Knepley / 51df2db7a0SMatthew G. Knepley 0---0---0---0---0---0---1---0---0---0---0---0---0 52df2db7a0SMatthew G. Knepley | | | | | | | 53df2db7a0SMatthew G. Knepley 0 0 0 0 0 0 2 0 0 1 0 0 0 54df2db7a0SMatthew G. Knepley | | | | | | | 55df2db7a0SMatthew G. Knepley 0---0---0---0---0---0---0---0---0---0---0---0---0 56df2db7a0SMatthew G. Knepley 57df2db7a0SMatthew G. Knepley exampleSectionDM: Offsets (total) in global section: 58df2db7a0SMatthew G. Knepley 59df2db7a0SMatthew G. Knepley 0---0---0---0---0---0---3---5---5---5---5---5---5 60df2db7a0SMatthew G. Knepley | | | | | | | 61df2db7a0SMatthew G. Knepley 0 0 0 0 0 0 5 0 7 2 7 3 7 62df2db7a0SMatthew G. Knepley | | | | | | | 63df2db7a0SMatthew G. Knepley 0---0---0---0---0---0---3---5---3---5---3---5---3 64df2db7a0SMatthew G. Knepley 65df2db7a0SMatthew G. Knepley exampleVec: Values (Field 0): (1.3, 1.4) 66df2db7a0SMatthew G. Knepley / 67df2db7a0SMatthew G. Knepley +-------+-------+-------*-------+-------+-------+ 68df2db7a0SMatthew G. Knepley | | | | | | | 69df2db7a0SMatthew G. Knepley | | | | * (1.0, 1.1)| | 70df2db7a0SMatthew G. Knepley | | | | | | | 71df2db7a0SMatthew G. Knepley +-------+-------+-------+-------+-------+-------+ 72df2db7a0SMatthew G. Knepley 73df2db7a0SMatthew G. Knepley exampleVec: Values (Field 1): (1.5,) constrained 74df2db7a0SMatthew G. Knepley / 75df2db7a0SMatthew G. Knepley +-------+-------+-------*-------+-------+-------+ 76df2db7a0SMatthew G. Knepley | | | | | | | 77df2db7a0SMatthew G. Knepley | | (1.6, 1.7) * | * (1.2,) | 78df2db7a0SMatthew G. Knepley | | | | | | | 79df2db7a0SMatthew G. Knepley +-------+-------+-------+-------+-------+-------+ 80df2db7a0SMatthew G. Knepley 81df2db7a0SMatthew G. Knepley exampleVec: as global vector 82df2db7a0SMatthew G. Knepley 83df2db7a0SMatthew G. Knepley rank 0: [] 84df2db7a0SMatthew G. Knepley rakn 1: [1.0, 1.1, 1.2, 1.3, 1.4, 1.6, 1.7] 85df2db7a0SMatthew G. Knepley 86df2db7a0SMatthew G. Knepley ===================== 87df2db7a0SMatthew G. Knepley Load on 3 Processes 88df2db7a0SMatthew G. Knepley ===================== 89df2db7a0SMatthew G. Knepley 90df2db7a0SMatthew G. Knepley exampleDMPlex: Loaded/Distributed: 91df2db7a0SMatthew G. Knepley 92df2db7a0SMatthew G. Knepley 5--13---6--14--(8)(18)(10) 93df2db7a0SMatthew G. Knepley | | | | 94df2db7a0SMatthew G. Knepley rank 0: 15 0 16 1 (19)(2)(20) 95df2db7a0SMatthew G. Knepley | | | | 96df2db7a0SMatthew G. Knepley 3--11---4--12--(7)(17)-(9) 97df2db7a0SMatthew G. Knepley 98df2db7a0SMatthew G. Knepley (9)(21)--5--15---7--18-(12)(24)(13) 99df2db7a0SMatthew G. Knepley | | | | | 100df2db7a0SMatthew G. Knepley rank 1: (22) (2) 16 0 19 1 (25) (3)(26) 101df2db7a0SMatthew G. Knepley | | | | | 102df2db7a0SMatthew G. Knepley (8)(20)--4--14---6--17-(10)(23)(11) 103df2db7a0SMatthew G. Knepley 104df2db7a0SMatthew G. Knepley +-> (10)(19)--6--13---7--14---8 105df2db7a0SMatthew G. Knepley permute | | | | | 106df2db7a0SMatthew G. Knepley rank 2: +-> (20) (2) 15 0 16 1 17 107df2db7a0SMatthew G. Knepley | | | | 108df2db7a0SMatthew G. Knepley (9)(18)--3--11---4--12---5 109df2db7a0SMatthew G. Knepley 110df2db7a0SMatthew G. Knepley exampleSectionDM: 111df2db7a0SMatthew G. Knepley - includesConstraints = TRUE for local section (default) 112df2db7a0SMatthew G. Knepley - includesConstraints = FALSE for global section (default) 113df2db7a0SMatthew G. Knepley 114df2db7a0SMatthew G. Knepley exampleVec: as local vector: 115df2db7a0SMatthew G. Knepley 116df2db7a0SMatthew G. Knepley rank 0: [1.3, 1.4, 1.5, 1.6, 1.7] 117df2db7a0SMatthew G. Knepley rank 1: [1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7] 118df2db7a0SMatthew G. Knepley rank 2: [1.2, 1.0, 1.1, 1.6, 1.7, 1.3, 1.4, 1.5] 119df2db7a0SMatthew G. Knepley 120df2db7a0SMatthew G. Knepley exampleVec: as global vector: 121df2db7a0SMatthew G. Knepley 122df2db7a0SMatthew G. Knepley rank 0: [] 123df2db7a0SMatthew G. Knepley rank 1: [1.0, 1.1, 1.3, 1.4, 1.6, 1.7] 124df2db7a0SMatthew G. Knepley rank 2: [1.2] 125df2db7a0SMatthew G. Knepley 126df2db7a0SMatthew G. Knepley */ 127df2db7a0SMatthew G. Knepley 128df2db7a0SMatthew G. Knepley typedef struct { 129df2db7a0SMatthew G. Knepley char fname[PETSC_MAX_PATH_LEN]; /* Output mesh filename */ 130df2db7a0SMatthew G. Knepley PetscBool shell; /* Use DMShell to wrap sections */ 131df2db7a0SMatthew G. Knepley } AppCtx; 132df2db7a0SMatthew G. Knepley 133*9371c9d4SSatish Balay PetscErrorCode ProcessOptions(MPI_Comm comm, AppCtx *options) { 134df2db7a0SMatthew G. Knepley PetscBool flg; 135df2db7a0SMatthew G. Knepley 136df2db7a0SMatthew G. Knepley PetscFunctionBegin; 137df2db7a0SMatthew G. Knepley options->fname[0] = '\0'; 138d0609cedSBarry Smith PetscOptionsBegin(comm, "", "DMPlex View/Load Test Options", "DMPLEX"); 139df2db7a0SMatthew G. Knepley PetscCall(PetscOptionsString("-fname", "The output mesh file", "ex12.c", options->fname, options->fname, sizeof(options->fname), &flg)); 140df2db7a0SMatthew G. Knepley PetscCall(PetscOptionsBool("-shell", "Use DMShell to wrap sections", "ex12.c", options->shell, &options->shell, NULL)); 141d0609cedSBarry Smith PetscOptionsEnd(); 142df2db7a0SMatthew G. Knepley PetscFunctionReturn(0); 143df2db7a0SMatthew G. Knepley } 144df2db7a0SMatthew G. Knepley 145*9371c9d4SSatish Balay int main(int argc, char **argv) { 146df2db7a0SMatthew G. Knepley MPI_Comm comm; 147df2db7a0SMatthew G. Knepley PetscMPIInt size, rank, mycolor; 148df2db7a0SMatthew G. Knepley const char exampleDMPlexName[] = "exampleDMPlex"; 149df2db7a0SMatthew G. Knepley const char exampleSectionDMName[] = "exampleSectionDM"; 150df2db7a0SMatthew G. Knepley const char exampleVecName[] = "exampleVec"; 151df2db7a0SMatthew G. Knepley PetscScalar constraintValue = 1.5; 152df2db7a0SMatthew G. Knepley PetscViewerFormat format = PETSC_VIEWER_HDF5_PETSC; 153df2db7a0SMatthew G. Knepley AppCtx user; 154df2db7a0SMatthew G. Knepley 155327415f7SBarry Smith PetscFunctionBeginUser; 156df2db7a0SMatthew G. Knepley PetscCall(PetscInitialize(&argc, &argv, NULL, help)); 157df2db7a0SMatthew G. Knepley PetscCall(ProcessOptions(PETSC_COMM_WORLD, &user)); 158df2db7a0SMatthew G. Knepley PetscCallMPI(MPI_Comm_size(PETSC_COMM_WORLD, &size)); 159df2db7a0SMatthew G. Knepley PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank)); 16008401ef6SPierre Jolivet PetscCheck(size >= 3, PETSC_COMM_WORLD, PETSC_ERR_WRONG_MPI_SIZE, "Example only works with three or more processes"); 161df2db7a0SMatthew G. Knepley 162df2db7a0SMatthew G. Knepley /* Save */ 163df2db7a0SMatthew G. Knepley mycolor = (PetscMPIInt)(rank >= 2); 164df2db7a0SMatthew G. Knepley PetscCallMPI(MPI_Comm_split(PETSC_COMM_WORLD, mycolor, rank, &comm)); 165df2db7a0SMatthew G. Knepley if (mycolor == 0) { 166df2db7a0SMatthew G. Knepley DM dm; 167df2db7a0SMatthew G. Knepley PetscViewer viewer; 168df2db7a0SMatthew G. Knepley 169df2db7a0SMatthew G. Knepley PetscCall(PetscViewerHDF5Open(comm, user.fname, FILE_MODE_WRITE, &viewer)); 170df2db7a0SMatthew G. Knepley /* Save exampleDMPlex */ 171df2db7a0SMatthew G. Knepley { 172df2db7a0SMatthew G. Knepley DM pdm; 173df2db7a0SMatthew G. Knepley const PetscInt faces[2] = {6, 1}; 174df2db7a0SMatthew G. Knepley PetscSF sf; 175df2db7a0SMatthew G. Knepley PetscInt overlap = 1; 176df2db7a0SMatthew G. Knepley 177df2db7a0SMatthew G. Knepley PetscCall(DMPlexCreateBoxMesh(comm, 2, PETSC_FALSE, faces, NULL, NULL, NULL, PETSC_TRUE, &dm)); 178df2db7a0SMatthew G. Knepley PetscCall(DMPlexDistribute(dm, overlap, &sf, &pdm)); 179df2db7a0SMatthew G. Knepley if (pdm) { 180df2db7a0SMatthew G. Knepley PetscCall(DMDestroy(&dm)); 181df2db7a0SMatthew G. Knepley dm = pdm; 182df2db7a0SMatthew G. Knepley } 183df2db7a0SMatthew G. Knepley PetscCall(PetscSFDestroy(&sf)); 184df2db7a0SMatthew G. Knepley PetscCall(PetscObjectSetName((PetscObject)dm, exampleDMPlexName)); 185df2db7a0SMatthew G. Knepley PetscCall(PetscViewerPushFormat(viewer, format)); 186df2db7a0SMatthew G. Knepley PetscCall(DMPlexTopologyView(dm, viewer)); 187df2db7a0SMatthew G. Knepley PetscCall(DMPlexLabelsView(dm, viewer)); 188df2db7a0SMatthew G. Knepley PetscCall(PetscViewerPopFormat(viewer)); 189df2db7a0SMatthew G. Knepley } 190df2db7a0SMatthew G. Knepley /* Save coordinates */ 191df2db7a0SMatthew G. Knepley PetscCall(PetscViewerPushFormat(viewer, format)); 192df2db7a0SMatthew G. Knepley PetscCall(DMPlexCoordinatesView(dm, viewer)); 193df2db7a0SMatthew G. Knepley PetscCall(PetscViewerPopFormat(viewer)); 194df2db7a0SMatthew G. Knepley /* Save exampleVec */ 195df2db7a0SMatthew G. Knepley { 196df2db7a0SMatthew G. Knepley PetscInt pStart = -1, pEnd = -1; 197df2db7a0SMatthew G. Knepley DM sdm; 198df2db7a0SMatthew G. Knepley PetscSection section, gsection; 199df2db7a0SMatthew G. Knepley PetscBool includesConstraints = PETSC_FALSE; 200df2db7a0SMatthew G. Knepley Vec vec; 201df2db7a0SMatthew G. Knepley PetscScalar *array = NULL; 202df2db7a0SMatthew G. Knepley 203df2db7a0SMatthew G. Knepley /* Create section */ 204df2db7a0SMatthew G. Knepley PetscCall(PetscSectionCreate(comm, §ion)); 205df2db7a0SMatthew G. Knepley PetscCall(PetscSectionSetNumFields(section, 2)); 206df2db7a0SMatthew G. Knepley PetscCall(DMPlexGetChart(dm, &pStart, &pEnd)); 207df2db7a0SMatthew G. Knepley PetscCall(PetscSectionSetChart(section, pStart, pEnd)); 208df2db7a0SMatthew G. Knepley switch (rank) { 209df2db7a0SMatthew G. Knepley case 0: 210df2db7a0SMatthew G. Knepley PetscCall(PetscSectionSetDof(section, 3, 2)); 211df2db7a0SMatthew G. Knepley PetscCall(PetscSectionSetDof(section, 12, 3)); 212df2db7a0SMatthew G. Knepley PetscCall(PetscSectionSetDof(section, 25, 2)); 213df2db7a0SMatthew G. Knepley PetscCall(PetscSectionSetConstraintDof(section, 12, 1)); 214df2db7a0SMatthew G. Knepley PetscCall(PetscSectionSetFieldDof(section, 3, 0, 2)); 215df2db7a0SMatthew G. Knepley PetscCall(PetscSectionSetFieldDof(section, 12, 0, 2)); 216df2db7a0SMatthew G. Knepley PetscCall(PetscSectionSetFieldDof(section, 12, 1, 1)); 217df2db7a0SMatthew G. Knepley PetscCall(PetscSectionSetFieldDof(section, 25, 1, 2)); 218df2db7a0SMatthew G. Knepley PetscCall(PetscSectionSetFieldConstraintDof(section, 12, 1, 1)); 219df2db7a0SMatthew G. Knepley break; 220df2db7a0SMatthew G. Knepley case 1: 221df2db7a0SMatthew G. Knepley PetscCall(PetscSectionSetDof(section, 0, 2)); 222df2db7a0SMatthew G. Knepley PetscCall(PetscSectionSetDof(section, 1, 1)); 223df2db7a0SMatthew G. Knepley PetscCall(PetscSectionSetDof(section, 8, 3)); 224df2db7a0SMatthew G. Knepley PetscCall(PetscSectionSetDof(section, 20, 2)); 225df2db7a0SMatthew G. Knepley PetscCall(PetscSectionSetConstraintDof(section, 8, 1)); 226df2db7a0SMatthew G. Knepley PetscCall(PetscSectionSetFieldDof(section, 0, 0, 2)); 227df2db7a0SMatthew G. Knepley PetscCall(PetscSectionSetFieldDof(section, 8, 0, 2)); 228df2db7a0SMatthew G. Knepley PetscCall(PetscSectionSetFieldDof(section, 1, 1, 1)); 229df2db7a0SMatthew G. Knepley PetscCall(PetscSectionSetFieldDof(section, 8, 1, 1)); 230df2db7a0SMatthew G. Knepley PetscCall(PetscSectionSetFieldDof(section, 20, 1, 2)); 231df2db7a0SMatthew G. Knepley PetscCall(PetscSectionSetFieldConstraintDof(section, 8, 1, 1)); 232df2db7a0SMatthew G. Knepley break; 233df2db7a0SMatthew G. Knepley } 234df2db7a0SMatthew G. Knepley PetscCall(PetscSectionSetUp(section)); 235df2db7a0SMatthew G. Knepley { 236df2db7a0SMatthew G. Knepley const PetscInt indices[] = {2}; 237df2db7a0SMatthew G. Knepley const PetscInt indices1[] = {0}; 238df2db7a0SMatthew G. Knepley 239df2db7a0SMatthew G. Knepley switch (rank) { 240df2db7a0SMatthew G. Knepley case 0: 241df2db7a0SMatthew G. Knepley PetscCall(PetscSectionSetConstraintIndices(section, 12, indices)); 242df2db7a0SMatthew G. Knepley PetscCall(PetscSectionSetFieldConstraintIndices(section, 12, 1, indices1)); 243df2db7a0SMatthew G. Knepley break; 244df2db7a0SMatthew G. Knepley case 1: 245df2db7a0SMatthew G. Knepley PetscCall(PetscSectionSetConstraintIndices(section, 8, indices)); 246df2db7a0SMatthew G. Knepley PetscCall(PetscSectionSetFieldConstraintIndices(section, 8, 1, indices1)); 247df2db7a0SMatthew G. Knepley break; 248df2db7a0SMatthew G. Knepley } 249df2db7a0SMatthew G. Knepley } 250df2db7a0SMatthew G. Knepley if (user.shell) { 251df2db7a0SMatthew G. Knepley PetscSF sf; 252df2db7a0SMatthew G. Knepley 253df2db7a0SMatthew G. Knepley PetscCall(DMShellCreate(comm, &sdm)); 254df2db7a0SMatthew G. Knepley PetscCall(DMGetPointSF(dm, &sf)); 255df2db7a0SMatthew G. Knepley PetscCall(DMSetPointSF(sdm, sf)); 256*9371c9d4SSatish Balay } else { 257df2db7a0SMatthew G. Knepley PetscCall(DMClone(dm, &sdm)); 258df2db7a0SMatthew G. Knepley } 259df2db7a0SMatthew G. Knepley PetscCall(PetscObjectSetName((PetscObject)sdm, exampleSectionDMName)); 260df2db7a0SMatthew G. Knepley PetscCall(DMSetLocalSection(sdm, section)); 261df2db7a0SMatthew G. Knepley PetscCall(PetscSectionDestroy(§ion)); 262df2db7a0SMatthew G. Knepley PetscCall(DMPlexSectionView(dm, viewer, sdm)); 263df2db7a0SMatthew G. Knepley /* Create global vector */ 264df2db7a0SMatthew G. Knepley PetscCall(DMGetGlobalSection(sdm, &gsection)); 265df2db7a0SMatthew G. Knepley PetscCall(PetscSectionGetIncludesConstraints(gsection, &includesConstraints)); 266df2db7a0SMatthew G. Knepley if (user.shell) { 267df2db7a0SMatthew G. Knepley PetscInt n = -1; 268df2db7a0SMatthew G. Knepley 269df2db7a0SMatthew G. Knepley PetscCall(VecCreate(comm, &vec)); 270df2db7a0SMatthew G. Knepley if (includesConstraints) PetscCall(PetscSectionGetStorageSize(gsection, &n)); 271df2db7a0SMatthew G. Knepley else PetscCall(PetscSectionGetConstrainedStorageSize(gsection, &n)); 272df2db7a0SMatthew G. Knepley PetscCall(VecSetSizes(vec, n, PETSC_DECIDE)); 273df2db7a0SMatthew G. Knepley PetscCall(VecSetUp(vec)); 274df2db7a0SMatthew G. Knepley } else { 275df2db7a0SMatthew G. Knepley PetscCall(DMGetGlobalVector(sdm, &vec)); 276df2db7a0SMatthew G. Knepley } 277df2db7a0SMatthew G. Knepley PetscCall(PetscObjectSetName((PetscObject)vec, exampleVecName)); 278df2db7a0SMatthew G. Knepley PetscCall(VecGetArrayWrite(vec, &array)); 279df2db7a0SMatthew G. Knepley if (includesConstraints) { 280df2db7a0SMatthew G. Knepley switch (rank) { 281*9371c9d4SSatish Balay case 0: break; 282df2db7a0SMatthew G. Knepley case 1: 283df2db7a0SMatthew G. Knepley array[0] = 1.0; 284df2db7a0SMatthew G. Knepley array[1] = 1.1; 285df2db7a0SMatthew G. Knepley array[2] = 1.2; 286df2db7a0SMatthew G. Knepley array[3] = 1.3; 287df2db7a0SMatthew G. Knepley array[4] = 1.4; 288df2db7a0SMatthew G. Knepley array[5] = 1.5; 289df2db7a0SMatthew G. Knepley array[6] = 1.6; 290df2db7a0SMatthew G. Knepley array[7] = 1.7; 291df2db7a0SMatthew G. Knepley break; 292df2db7a0SMatthew G. Knepley } 293df2db7a0SMatthew G. Knepley } else { 294df2db7a0SMatthew G. Knepley switch (rank) { 295*9371c9d4SSatish Balay case 0: break; 296df2db7a0SMatthew G. Knepley case 1: 297df2db7a0SMatthew G. Knepley array[0] = 1.0; 298df2db7a0SMatthew G. Knepley array[1] = 1.1; 299df2db7a0SMatthew G. Knepley array[2] = 1.2; 300df2db7a0SMatthew G. Knepley array[3] = 1.3; 301df2db7a0SMatthew G. Knepley array[4] = 1.4; 302df2db7a0SMatthew G. Knepley array[5] = 1.6; 303df2db7a0SMatthew G. Knepley array[6] = 1.7; 304df2db7a0SMatthew G. Knepley break; 305df2db7a0SMatthew G. Knepley } 306df2db7a0SMatthew G. Knepley } 307df2db7a0SMatthew G. Knepley PetscCall(VecRestoreArrayWrite(vec, &array)); 308df2db7a0SMatthew G. Knepley PetscCall(DMPlexGlobalVectorView(dm, viewer, sdm, vec)); 309df2db7a0SMatthew G. Knepley if (user.shell) { 310df2db7a0SMatthew G. Knepley PetscCall(VecDestroy(&vec)); 311df2db7a0SMatthew G. Knepley } else { 312df2db7a0SMatthew G. Knepley PetscCall(DMRestoreGlobalVector(sdm, &vec)); 313df2db7a0SMatthew G. Knepley } 314df2db7a0SMatthew G. Knepley PetscCall(DMDestroy(&sdm)); 315df2db7a0SMatthew G. Knepley } 316df2db7a0SMatthew G. Knepley PetscCall(PetscViewerDestroy(&viewer)); 317df2db7a0SMatthew G. Knepley PetscCall(DMDestroy(&dm)); 318df2db7a0SMatthew G. Knepley } 319df2db7a0SMatthew G. Knepley PetscCallMPI(MPI_Comm_free(&comm)); 320df2db7a0SMatthew G. Knepley /* Load */ 321df2db7a0SMatthew G. Knepley mycolor = (PetscMPIInt)(rank >= 3); 322df2db7a0SMatthew G. Knepley PetscCallMPI(MPI_Comm_split(PETSC_COMM_WORLD, mycolor, rank, &comm)); 323df2db7a0SMatthew G. Knepley if (mycolor == 0) { 324df2db7a0SMatthew G. Knepley DM dm; 325df2db7a0SMatthew G. Knepley PetscSF sfXC; 326df2db7a0SMatthew G. Knepley PetscViewer viewer; 327df2db7a0SMatthew G. Knepley 328df2db7a0SMatthew G. Knepley PetscCall(PetscViewerHDF5Open(comm, user.fname, FILE_MODE_READ, &viewer)); 329df2db7a0SMatthew G. Knepley /* Load exampleDMPlex */ 330df2db7a0SMatthew G. Knepley { 331df2db7a0SMatthew G. Knepley PetscSF sfXB, sfBC; 332df2db7a0SMatthew G. Knepley 333df2db7a0SMatthew G. Knepley PetscCall(DMCreate(comm, &dm)); 334df2db7a0SMatthew G. Knepley PetscCall(DMSetType(dm, DMPLEX)); 335df2db7a0SMatthew G. Knepley PetscCall(PetscObjectSetName((PetscObject)dm, exampleDMPlexName)); 336df2db7a0SMatthew G. Knepley /* sfXB: X -> B */ 337df2db7a0SMatthew G. Knepley /* X: set of globalPointNumbers, [0, N) */ 338df2db7a0SMatthew G. Knepley /* B: loaded naive in-memory plex */ 339df2db7a0SMatthew G. Knepley PetscCall(PetscViewerPushFormat(viewer, format)); 340df2db7a0SMatthew G. Knepley PetscCall(DMPlexTopologyLoad(dm, viewer, &sfXB)); 341df2db7a0SMatthew G. Knepley PetscCall(PetscViewerPopFormat(viewer)); 342df2db7a0SMatthew G. Knepley PetscCall(PetscObjectSetName((PetscObject)dm, exampleDMPlexName)); 343df2db7a0SMatthew G. Knepley { 344df2db7a0SMatthew G. Knepley DM distributedDM; 345df2db7a0SMatthew G. Knepley PetscInt overlap = 1; 346df2db7a0SMatthew G. Knepley PetscPartitioner part; 347df2db7a0SMatthew G. Knepley 348df2db7a0SMatthew G. Knepley PetscCall(DMPlexGetPartitioner(dm, &part)); 349df2db7a0SMatthew G. Knepley PetscCall(PetscPartitionerSetFromOptions(part)); 350df2db7a0SMatthew G. Knepley /* sfBC: B -> C */ 351df2db7a0SMatthew G. Knepley /* B: loaded naive in-memory plex */ 352df2db7a0SMatthew G. Knepley /* C: redistributed good in-memory */ 353df2db7a0SMatthew G. Knepley PetscCall(DMPlexDistribute(dm, overlap, &sfBC, &distributedDM)); 354df2db7a0SMatthew G. Knepley if (distributedDM) { 355df2db7a0SMatthew G. Knepley PetscCall(DMDestroy(&dm)); 356df2db7a0SMatthew G. Knepley dm = distributedDM; 357df2db7a0SMatthew G. Knepley } 358df2db7a0SMatthew G. Knepley PetscCall(PetscObjectSetName((PetscObject)dm, exampleDMPlexName)); 359df2db7a0SMatthew G. Knepley } 360df2db7a0SMatthew G. Knepley /* sfXC: X -> C */ 361df2db7a0SMatthew G. Knepley PetscCall(PetscSFCompose(sfXB, sfBC, &sfXC)); 362df2db7a0SMatthew G. Knepley PetscCall(PetscSFDestroy(&sfXB)); 363df2db7a0SMatthew G. Knepley PetscCall(PetscSFDestroy(&sfBC)); 364df2db7a0SMatthew G. Knepley } 365df2db7a0SMatthew G. Knepley /* Load labels */ 366df2db7a0SMatthew G. Knepley PetscCall(PetscViewerPushFormat(viewer, format)); 367df2db7a0SMatthew G. Knepley PetscCall(DMPlexLabelsLoad(dm, viewer, sfXC)); 368df2db7a0SMatthew G. Knepley PetscCall(PetscViewerPopFormat(viewer)); 369df2db7a0SMatthew G. Knepley /* Load coordinates */ 370df2db7a0SMatthew G. Knepley PetscCall(PetscViewerPushFormat(viewer, format)); 371df2db7a0SMatthew G. Knepley PetscCall(DMPlexCoordinatesLoad(dm, viewer, sfXC)); 372df2db7a0SMatthew G. Knepley PetscCall(PetscViewerPopFormat(viewer)); 373df2db7a0SMatthew G. Knepley PetscCall(PetscObjectSetName((PetscObject)dm, "Load: DM (with coordinates)")); 374df2db7a0SMatthew G. Knepley PetscCall(DMViewFromOptions(dm, NULL, "-dm_view")); 375df2db7a0SMatthew G. Knepley PetscCall(PetscObjectSetName((PetscObject)dm, exampleDMPlexName)); 376df2db7a0SMatthew G. Knepley /* Load exampleVec */ 377df2db7a0SMatthew G. Knepley { 378df2db7a0SMatthew G. Knepley DM sdm; 379df2db7a0SMatthew G. Knepley PetscSection section, gsection; 380df2db7a0SMatthew G. Knepley IS perm; 381df2db7a0SMatthew G. Knepley PetscBool includesConstraints = PETSC_FALSE; 382df2db7a0SMatthew G. Knepley Vec vec; 383df2db7a0SMatthew G. Knepley PetscSF lsf, gsf; 384df2db7a0SMatthew G. Knepley 385df2db7a0SMatthew G. Knepley if (user.shell) { 386df2db7a0SMatthew G. Knepley PetscSF sf; 387df2db7a0SMatthew G. Knepley 388df2db7a0SMatthew G. Knepley PetscCall(DMShellCreate(comm, &sdm)); 389df2db7a0SMatthew G. Knepley PetscCall(DMGetPointSF(dm, &sf)); 390df2db7a0SMatthew G. Knepley PetscCall(DMSetPointSF(sdm, sf)); 391df2db7a0SMatthew G. Knepley } else { 392df2db7a0SMatthew G. Knepley PetscCall(DMClone(dm, &sdm)); 393df2db7a0SMatthew G. Knepley } 394df2db7a0SMatthew G. Knepley PetscCall(PetscObjectSetName((PetscObject)sdm, exampleSectionDMName)); 395df2db7a0SMatthew G. Knepley PetscCall(PetscSectionCreate(comm, §ion)); 396df2db7a0SMatthew G. Knepley { 397df2db7a0SMatthew G. Knepley PetscInt pStart = -1, pEnd = -1, p = -1; 398df2db7a0SMatthew G. Knepley PetscInt *pinds = NULL; 399df2db7a0SMatthew G. Knepley 400df2db7a0SMatthew G. Knepley PetscCall(DMPlexGetChart(dm, &pStart, &pEnd)); 401df2db7a0SMatthew G. Knepley PetscCall(PetscMalloc1(pEnd - pStart, &pinds)); 402df2db7a0SMatthew G. Knepley for (p = 0; p < pEnd - pStart; ++p) pinds[p] = p; 403*9371c9d4SSatish Balay if (rank == 2) { 404*9371c9d4SSatish Balay pinds[10] = 20; 405*9371c9d4SSatish Balay pinds[20] = 10; 406*9371c9d4SSatish Balay } 407df2db7a0SMatthew G. Knepley PetscCall(ISCreateGeneral(comm, pEnd - pStart, pinds, PETSC_OWN_POINTER, &perm)); 408df2db7a0SMatthew G. Knepley } 409df2db7a0SMatthew G. Knepley PetscCall(PetscSectionSetPermutation(section, perm)); 410df2db7a0SMatthew G. Knepley PetscCall(ISDestroy(&perm)); 411df2db7a0SMatthew G. Knepley PetscCall(DMSetLocalSection(sdm, section)); 412df2db7a0SMatthew G. Knepley PetscCall(PetscSectionDestroy(§ion)); 413df2db7a0SMatthew G. Knepley PetscCall(DMPlexSectionLoad(dm, viewer, sdm, sfXC, &gsf, &lsf)); 414df2db7a0SMatthew G. Knepley /* Load as local vector */ 415df2db7a0SMatthew G. Knepley PetscCall(DMGetLocalSection(sdm, §ion)); 416df2db7a0SMatthew G. Knepley PetscCall(PetscObjectSetName((PetscObject)section, "Load: local section")); 417df2db7a0SMatthew G. Knepley PetscCall(PetscSectionView(section, PETSC_VIEWER_STDOUT_(comm))); 418df2db7a0SMatthew G. Knepley PetscCall(PetscSectionGetIncludesConstraints(section, &includesConstraints)); 419df2db7a0SMatthew G. Knepley if (user.shell) { 420df2db7a0SMatthew G. Knepley PetscInt m = -1; 421df2db7a0SMatthew G. Knepley 422df2db7a0SMatthew G. Knepley PetscCall(VecCreate(comm, &vec)); 423df2db7a0SMatthew G. Knepley if (includesConstraints) PetscCall(PetscSectionGetStorageSize(section, &m)); 424df2db7a0SMatthew G. Knepley else PetscCall(PetscSectionGetConstrainedStorageSize(section, &m)); 425df2db7a0SMatthew G. Knepley PetscCall(VecSetSizes(vec, m, PETSC_DECIDE)); 426df2db7a0SMatthew G. Knepley PetscCall(VecSetUp(vec)); 427df2db7a0SMatthew G. Knepley } else { 428df2db7a0SMatthew G. Knepley PetscCall(DMGetLocalVector(sdm, &vec)); 429df2db7a0SMatthew G. Knepley } 430df2db7a0SMatthew G. Knepley PetscCall(PetscObjectSetName((PetscObject)vec, exampleVecName)); 431df2db7a0SMatthew G. Knepley PetscCall(VecSet(vec, constraintValue)); 432df2db7a0SMatthew G. Knepley PetscCall(DMPlexLocalVectorLoad(dm, viewer, sdm, lsf, vec)); 433df2db7a0SMatthew G. Knepley PetscCall(PetscSFDestroy(&lsf)); 434df2db7a0SMatthew G. Knepley if (user.shell) { 435df2db7a0SMatthew G. Knepley PetscCall(VecView(vec, PETSC_VIEWER_STDOUT_(comm))); 436df2db7a0SMatthew G. Knepley PetscCall(VecDestroy(&vec)); 437df2db7a0SMatthew G. Knepley } else { 438df2db7a0SMatthew G. Knepley PetscCall(DMRestoreLocalVector(sdm, &vec)); 439df2db7a0SMatthew G. Knepley } 440df2db7a0SMatthew G. Knepley /* Load as global vector */ 441df2db7a0SMatthew G. Knepley PetscCall(DMGetGlobalSection(sdm, &gsection)); 442df2db7a0SMatthew G. Knepley PetscCall(PetscObjectSetName((PetscObject)gsection, "Load: global section")); 443df2db7a0SMatthew G. Knepley PetscCall(PetscSectionView(gsection, PETSC_VIEWER_STDOUT_(comm))); 444df2db7a0SMatthew G. Knepley PetscCall(PetscSectionGetIncludesConstraints(gsection, &includesConstraints)); 445df2db7a0SMatthew G. Knepley if (user.shell) { 446df2db7a0SMatthew G. Knepley PetscInt m = -1; 447df2db7a0SMatthew G. Knepley 448df2db7a0SMatthew G. Knepley PetscCall(VecCreate(comm, &vec)); 449df2db7a0SMatthew G. Knepley if (includesConstraints) PetscCall(PetscSectionGetStorageSize(gsection, &m)); 450df2db7a0SMatthew G. Knepley else PetscCall(PetscSectionGetConstrainedStorageSize(gsection, &m)); 451df2db7a0SMatthew G. Knepley PetscCall(VecSetSizes(vec, m, PETSC_DECIDE)); 452df2db7a0SMatthew G. Knepley PetscCall(VecSetUp(vec)); 453df2db7a0SMatthew G. Knepley } else { 454df2db7a0SMatthew G. Knepley PetscCall(DMGetGlobalVector(sdm, &vec)); 455df2db7a0SMatthew G. Knepley } 456df2db7a0SMatthew G. Knepley PetscCall(PetscObjectSetName((PetscObject)vec, exampleVecName)); 457df2db7a0SMatthew G. Knepley PetscCall(DMPlexGlobalVectorLoad(dm, viewer, sdm, gsf, vec)); 458df2db7a0SMatthew G. Knepley PetscCall(PetscSFDestroy(&gsf)); 459df2db7a0SMatthew G. Knepley PetscCall(VecView(vec, PETSC_VIEWER_STDOUT_(comm))); 460df2db7a0SMatthew G. Knepley if (user.shell) { 461df2db7a0SMatthew G. Knepley PetscCall(VecDestroy(&vec)); 462df2db7a0SMatthew G. Knepley } else { 463df2db7a0SMatthew G. Knepley PetscCall(DMRestoreGlobalVector(sdm, &vec)); 464df2db7a0SMatthew G. Knepley } 465df2db7a0SMatthew G. Knepley PetscCall(DMDestroy(&sdm)); 466df2db7a0SMatthew G. Knepley } 467df2db7a0SMatthew G. Knepley PetscCall(PetscViewerDestroy(&viewer)); 468df2db7a0SMatthew G. Knepley PetscCall(PetscSFDestroy(&sfXC)); 469df2db7a0SMatthew G. Knepley PetscCall(DMDestroy(&dm)); 470df2db7a0SMatthew G. Knepley } 471df2db7a0SMatthew G. Knepley PetscCallMPI(MPI_Comm_free(&comm)); 472df2db7a0SMatthew G. Knepley 473df2db7a0SMatthew G. Knepley /* Finalize */ 474df2db7a0SMatthew G. Knepley PetscCall(PetscFinalize()); 475df2db7a0SMatthew G. Knepley return 0; 476df2db7a0SMatthew G. Knepley } 477df2db7a0SMatthew G. Knepley 478df2db7a0SMatthew G. Knepley /*TEST 479df2db7a0SMatthew G. Knepley 480df2db7a0SMatthew G. Knepley build: 481df2db7a0SMatthew G. Knepley requires: hdf5 482df2db7a0SMatthew G. Knepley testset: 483df2db7a0SMatthew G. Knepley suffix: 0 484df2db7a0SMatthew G. Knepley requires: !complex 485df2db7a0SMatthew G. Knepley nsize: 4 486df2db7a0SMatthew G. Knepley args: -fname ex12_dump.h5 -shell {{True False}separate output} -dm_view ascii::ascii_info_detail 487df2db7a0SMatthew G. Knepley args: -dm_plex_view_hdf5_storage_version 2.0.0 488df2db7a0SMatthew G. Knepley test: 489df2db7a0SMatthew G. Knepley suffix: parmetis 490df2db7a0SMatthew G. Knepley requires: parmetis 491df2db7a0SMatthew G. Knepley args: -petscpartitioner_type parmetis 492df2db7a0SMatthew G. Knepley test: 493df2db7a0SMatthew G. Knepley suffix: ptscotch 494df2db7a0SMatthew G. Knepley requires: ptscotch 495df2db7a0SMatthew G. Knepley args: -petscpartitioner_type ptscotch 496df2db7a0SMatthew G. Knepley 497df2db7a0SMatthew G. Knepley TEST*/ 498