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: [] 84*0318f8a0SStefano Zampini rank 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 133d71ae5a4SJacob Faibussowitsch PetscErrorCode ProcessOptions(MPI_Comm comm, AppCtx *options) 134d71ae5a4SJacob Faibussowitsch { 135df2db7a0SMatthew G. Knepley PetscBool flg; 136df2db7a0SMatthew G. Knepley 137df2db7a0SMatthew G. Knepley PetscFunctionBegin; 138df2db7a0SMatthew G. Knepley options->fname[0] = '\0'; 139d0609cedSBarry Smith PetscOptionsBegin(comm, "", "DMPlex View/Load Test Options", "DMPLEX"); 140df2db7a0SMatthew G. Knepley PetscCall(PetscOptionsString("-fname", "The output mesh file", "ex12.c", options->fname, options->fname, sizeof(options->fname), &flg)); 141df2db7a0SMatthew G. Knepley PetscCall(PetscOptionsBool("-shell", "Use DMShell to wrap sections", "ex12.c", options->shell, &options->shell, NULL)); 142d0609cedSBarry Smith PetscOptionsEnd(); 1433ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 144df2db7a0SMatthew G. Knepley } 145df2db7a0SMatthew G. Knepley 146d71ae5a4SJacob Faibussowitsch int main(int argc, char **argv) 147d71ae5a4SJacob Faibussowitsch { 148df2db7a0SMatthew G. Knepley MPI_Comm comm; 149df2db7a0SMatthew G. Knepley PetscMPIInt size, rank, mycolor; 150df2db7a0SMatthew G. Knepley const char exampleDMPlexName[] = "exampleDMPlex"; 151df2db7a0SMatthew G. Knepley const char exampleSectionDMName[] = "exampleSectionDM"; 152df2db7a0SMatthew G. Knepley const char exampleVecName[] = "exampleVec"; 153df2db7a0SMatthew G. Knepley PetscScalar constraintValue = 1.5; 154df2db7a0SMatthew G. Knepley PetscViewerFormat format = PETSC_VIEWER_HDF5_PETSC; 155df2db7a0SMatthew G. Knepley AppCtx user; 156df2db7a0SMatthew G. Knepley 157327415f7SBarry Smith PetscFunctionBeginUser; 158df2db7a0SMatthew G. Knepley PetscCall(PetscInitialize(&argc, &argv, NULL, help)); 159df2db7a0SMatthew G. Knepley PetscCall(ProcessOptions(PETSC_COMM_WORLD, &user)); 160df2db7a0SMatthew G. Knepley PetscCallMPI(MPI_Comm_size(PETSC_COMM_WORLD, &size)); 161df2db7a0SMatthew G. Knepley PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank)); 16208401ef6SPierre Jolivet PetscCheck(size >= 3, PETSC_COMM_WORLD, PETSC_ERR_WRONG_MPI_SIZE, "Example only works with three or more processes"); 163df2db7a0SMatthew G. Knepley 164df2db7a0SMatthew G. Knepley /* Save */ 165df2db7a0SMatthew G. Knepley mycolor = (PetscMPIInt)(rank >= 2); 166df2db7a0SMatthew G. Knepley PetscCallMPI(MPI_Comm_split(PETSC_COMM_WORLD, mycolor, rank, &comm)); 167df2db7a0SMatthew G. Knepley if (mycolor == 0) { 168df2db7a0SMatthew G. Knepley DM dm; 169df2db7a0SMatthew G. Knepley PetscViewer viewer; 170df2db7a0SMatthew G. Knepley 171df2db7a0SMatthew G. Knepley PetscCall(PetscViewerHDF5Open(comm, user.fname, FILE_MODE_WRITE, &viewer)); 172df2db7a0SMatthew G. Knepley /* Save exampleDMPlex */ 173df2db7a0SMatthew G. Knepley { 174df2db7a0SMatthew G. Knepley DM pdm; 175df2db7a0SMatthew G. Knepley const PetscInt faces[2] = {6, 1}; 176df2db7a0SMatthew G. Knepley PetscSF sf; 177df2db7a0SMatthew G. Knepley PetscInt overlap = 1; 178df2db7a0SMatthew G. Knepley 179df2db7a0SMatthew G. Knepley PetscCall(DMPlexCreateBoxMesh(comm, 2, PETSC_FALSE, faces, NULL, NULL, NULL, PETSC_TRUE, &dm)); 180df2db7a0SMatthew G. Knepley PetscCall(DMPlexDistribute(dm, overlap, &sf, &pdm)); 181df2db7a0SMatthew G. Knepley if (pdm) { 182df2db7a0SMatthew G. Knepley PetscCall(DMDestroy(&dm)); 183df2db7a0SMatthew G. Knepley dm = pdm; 184df2db7a0SMatthew G. Knepley } 185df2db7a0SMatthew G. Knepley PetscCall(PetscSFDestroy(&sf)); 186df2db7a0SMatthew G. Knepley PetscCall(PetscObjectSetName((PetscObject)dm, exampleDMPlexName)); 187df2db7a0SMatthew G. Knepley PetscCall(PetscViewerPushFormat(viewer, format)); 188df2db7a0SMatthew G. Knepley PetscCall(DMPlexTopologyView(dm, viewer)); 189df2db7a0SMatthew G. Knepley PetscCall(DMPlexLabelsView(dm, viewer)); 190df2db7a0SMatthew G. Knepley PetscCall(PetscViewerPopFormat(viewer)); 191df2db7a0SMatthew G. Knepley } 192df2db7a0SMatthew G. Knepley /* Save coordinates */ 193df2db7a0SMatthew G. Knepley PetscCall(PetscViewerPushFormat(viewer, format)); 194df2db7a0SMatthew G. Knepley PetscCall(DMPlexCoordinatesView(dm, viewer)); 195df2db7a0SMatthew G. Knepley PetscCall(PetscViewerPopFormat(viewer)); 196df2db7a0SMatthew G. Knepley /* Save exampleVec */ 197df2db7a0SMatthew G. Knepley { 198df2db7a0SMatthew G. Knepley PetscInt pStart = -1, pEnd = -1; 199df2db7a0SMatthew G. Knepley DM sdm; 200df2db7a0SMatthew G. Knepley PetscSection section, gsection; 201df2db7a0SMatthew G. Knepley PetscBool includesConstraints = PETSC_FALSE; 202df2db7a0SMatthew G. Knepley Vec vec; 203df2db7a0SMatthew G. Knepley PetscScalar *array = NULL; 204df2db7a0SMatthew G. Knepley 205df2db7a0SMatthew G. Knepley /* Create section */ 206df2db7a0SMatthew G. Knepley PetscCall(PetscSectionCreate(comm, §ion)); 207df2db7a0SMatthew G. Knepley PetscCall(PetscSectionSetNumFields(section, 2)); 208df2db7a0SMatthew G. Knepley PetscCall(DMPlexGetChart(dm, &pStart, &pEnd)); 209df2db7a0SMatthew G. Knepley PetscCall(PetscSectionSetChart(section, pStart, pEnd)); 210df2db7a0SMatthew G. Knepley switch (rank) { 211df2db7a0SMatthew G. Knepley case 0: 212df2db7a0SMatthew G. Knepley PetscCall(PetscSectionSetDof(section, 3, 2)); 213df2db7a0SMatthew G. Knepley PetscCall(PetscSectionSetDof(section, 12, 3)); 214df2db7a0SMatthew G. Knepley PetscCall(PetscSectionSetDof(section, 25, 2)); 215df2db7a0SMatthew G. Knepley PetscCall(PetscSectionSetConstraintDof(section, 12, 1)); 216df2db7a0SMatthew G. Knepley PetscCall(PetscSectionSetFieldDof(section, 3, 0, 2)); 217df2db7a0SMatthew G. Knepley PetscCall(PetscSectionSetFieldDof(section, 12, 0, 2)); 218df2db7a0SMatthew G. Knepley PetscCall(PetscSectionSetFieldDof(section, 12, 1, 1)); 219df2db7a0SMatthew G. Knepley PetscCall(PetscSectionSetFieldDof(section, 25, 1, 2)); 220df2db7a0SMatthew G. Knepley PetscCall(PetscSectionSetFieldConstraintDof(section, 12, 1, 1)); 221df2db7a0SMatthew G. Knepley break; 222df2db7a0SMatthew G. Knepley case 1: 223df2db7a0SMatthew G. Knepley PetscCall(PetscSectionSetDof(section, 0, 2)); 224df2db7a0SMatthew G. Knepley PetscCall(PetscSectionSetDof(section, 1, 1)); 225df2db7a0SMatthew G. Knepley PetscCall(PetscSectionSetDof(section, 8, 3)); 226df2db7a0SMatthew G. Knepley PetscCall(PetscSectionSetDof(section, 20, 2)); 227df2db7a0SMatthew G. Knepley PetscCall(PetscSectionSetConstraintDof(section, 8, 1)); 228df2db7a0SMatthew G. Knepley PetscCall(PetscSectionSetFieldDof(section, 0, 0, 2)); 229df2db7a0SMatthew G. Knepley PetscCall(PetscSectionSetFieldDof(section, 8, 0, 2)); 230df2db7a0SMatthew G. Knepley PetscCall(PetscSectionSetFieldDof(section, 1, 1, 1)); 231df2db7a0SMatthew G. Knepley PetscCall(PetscSectionSetFieldDof(section, 8, 1, 1)); 232df2db7a0SMatthew G. Knepley PetscCall(PetscSectionSetFieldDof(section, 20, 1, 2)); 233df2db7a0SMatthew G. Knepley PetscCall(PetscSectionSetFieldConstraintDof(section, 8, 1, 1)); 234df2db7a0SMatthew G. Knepley break; 235df2db7a0SMatthew G. Knepley } 236df2db7a0SMatthew G. Knepley PetscCall(PetscSectionSetUp(section)); 237df2db7a0SMatthew G. Knepley { 238df2db7a0SMatthew G. Knepley const PetscInt indices[] = {2}; 239df2db7a0SMatthew G. Knepley const PetscInt indices1[] = {0}; 240df2db7a0SMatthew G. Knepley 241df2db7a0SMatthew G. Knepley switch (rank) { 242df2db7a0SMatthew G. Knepley case 0: 243df2db7a0SMatthew G. Knepley PetscCall(PetscSectionSetConstraintIndices(section, 12, indices)); 244df2db7a0SMatthew G. Knepley PetscCall(PetscSectionSetFieldConstraintIndices(section, 12, 1, indices1)); 245df2db7a0SMatthew G. Knepley break; 246df2db7a0SMatthew G. Knepley case 1: 247df2db7a0SMatthew G. Knepley PetscCall(PetscSectionSetConstraintIndices(section, 8, indices)); 248df2db7a0SMatthew G. Knepley PetscCall(PetscSectionSetFieldConstraintIndices(section, 8, 1, indices1)); 249df2db7a0SMatthew G. Knepley break; 250df2db7a0SMatthew G. Knepley } 251df2db7a0SMatthew G. Knepley } 252df2db7a0SMatthew G. Knepley if (user.shell) { 253df2db7a0SMatthew G. Knepley PetscSF sf; 254df2db7a0SMatthew G. Knepley 255df2db7a0SMatthew G. Knepley PetscCall(DMShellCreate(comm, &sdm)); 256df2db7a0SMatthew G. Knepley PetscCall(DMGetPointSF(dm, &sf)); 257df2db7a0SMatthew G. Knepley PetscCall(DMSetPointSF(sdm, sf)); 2589371c9d4SSatish Balay } else { 259df2db7a0SMatthew G. Knepley PetscCall(DMClone(dm, &sdm)); 260df2db7a0SMatthew G. Knepley } 261df2db7a0SMatthew G. Knepley PetscCall(PetscObjectSetName((PetscObject)sdm, exampleSectionDMName)); 262df2db7a0SMatthew G. Knepley PetscCall(DMSetLocalSection(sdm, section)); 263df2db7a0SMatthew G. Knepley PetscCall(PetscSectionDestroy(§ion)); 264df2db7a0SMatthew G. Knepley PetscCall(DMPlexSectionView(dm, viewer, sdm)); 265df2db7a0SMatthew G. Knepley /* Create global vector */ 266df2db7a0SMatthew G. Knepley PetscCall(DMGetGlobalSection(sdm, &gsection)); 267df2db7a0SMatthew G. Knepley PetscCall(PetscSectionGetIncludesConstraints(gsection, &includesConstraints)); 268df2db7a0SMatthew G. Knepley if (user.shell) { 269df2db7a0SMatthew G. Knepley PetscInt n = -1; 270df2db7a0SMatthew G. Knepley 271df2db7a0SMatthew G. Knepley PetscCall(VecCreate(comm, &vec)); 272df2db7a0SMatthew G. Knepley if (includesConstraints) PetscCall(PetscSectionGetStorageSize(gsection, &n)); 273df2db7a0SMatthew G. Knepley else PetscCall(PetscSectionGetConstrainedStorageSize(gsection, &n)); 274df2db7a0SMatthew G. Knepley PetscCall(VecSetSizes(vec, n, PETSC_DECIDE)); 275df2db7a0SMatthew G. Knepley PetscCall(VecSetUp(vec)); 276df2db7a0SMatthew G. Knepley } else { 277df2db7a0SMatthew G. Knepley PetscCall(DMGetGlobalVector(sdm, &vec)); 278df2db7a0SMatthew G. Knepley } 279df2db7a0SMatthew G. Knepley PetscCall(PetscObjectSetName((PetscObject)vec, exampleVecName)); 280df2db7a0SMatthew G. Knepley PetscCall(VecGetArrayWrite(vec, &array)); 281df2db7a0SMatthew G. Knepley if (includesConstraints) { 282df2db7a0SMatthew G. Knepley switch (rank) { 283d71ae5a4SJacob Faibussowitsch case 0: 284d71ae5a4SJacob Faibussowitsch break; 285df2db7a0SMatthew G. Knepley case 1: 286df2db7a0SMatthew G. Knepley array[0] = 1.0; 287df2db7a0SMatthew G. Knepley array[1] = 1.1; 288df2db7a0SMatthew G. Knepley array[2] = 1.2; 289df2db7a0SMatthew G. Knepley array[3] = 1.3; 290df2db7a0SMatthew G. Knepley array[4] = 1.4; 291df2db7a0SMatthew G. Knepley array[5] = 1.5; 292df2db7a0SMatthew G. Knepley array[6] = 1.6; 293df2db7a0SMatthew G. Knepley array[7] = 1.7; 294df2db7a0SMatthew G. Knepley break; 295df2db7a0SMatthew G. Knepley } 296df2db7a0SMatthew G. Knepley } else { 297df2db7a0SMatthew G. Knepley switch (rank) { 298d71ae5a4SJacob Faibussowitsch case 0: 299d71ae5a4SJacob Faibussowitsch break; 300df2db7a0SMatthew G. Knepley case 1: 301df2db7a0SMatthew G. Knepley array[0] = 1.0; 302df2db7a0SMatthew G. Knepley array[1] = 1.1; 303df2db7a0SMatthew G. Knepley array[2] = 1.2; 304df2db7a0SMatthew G. Knepley array[3] = 1.3; 305df2db7a0SMatthew G. Knepley array[4] = 1.4; 306df2db7a0SMatthew G. Knepley array[5] = 1.6; 307df2db7a0SMatthew G. Knepley array[6] = 1.7; 308df2db7a0SMatthew G. Knepley break; 309df2db7a0SMatthew G. Knepley } 310df2db7a0SMatthew G. Knepley } 311df2db7a0SMatthew G. Knepley PetscCall(VecRestoreArrayWrite(vec, &array)); 312df2db7a0SMatthew G. Knepley PetscCall(DMPlexGlobalVectorView(dm, viewer, sdm, vec)); 313df2db7a0SMatthew G. Knepley if (user.shell) { 314df2db7a0SMatthew G. Knepley PetscCall(VecDestroy(&vec)); 315df2db7a0SMatthew G. Knepley } else { 316df2db7a0SMatthew G. Knepley PetscCall(DMRestoreGlobalVector(sdm, &vec)); 317df2db7a0SMatthew G. Knepley } 318df2db7a0SMatthew G. Knepley PetscCall(DMDestroy(&sdm)); 319df2db7a0SMatthew G. Knepley } 320df2db7a0SMatthew G. Knepley PetscCall(PetscViewerDestroy(&viewer)); 321df2db7a0SMatthew G. Knepley PetscCall(DMDestroy(&dm)); 322df2db7a0SMatthew G. Knepley } 323df2db7a0SMatthew G. Knepley PetscCallMPI(MPI_Comm_free(&comm)); 324df2db7a0SMatthew G. Knepley /* Load */ 325df2db7a0SMatthew G. Knepley mycolor = (PetscMPIInt)(rank >= 3); 326df2db7a0SMatthew G. Knepley PetscCallMPI(MPI_Comm_split(PETSC_COMM_WORLD, mycolor, rank, &comm)); 327df2db7a0SMatthew G. Knepley if (mycolor == 0) { 328df2db7a0SMatthew G. Knepley DM dm; 329df2db7a0SMatthew G. Knepley PetscSF sfXC; 330df2db7a0SMatthew G. Knepley PetscViewer viewer; 331df2db7a0SMatthew G. Knepley 332df2db7a0SMatthew G. Knepley PetscCall(PetscViewerHDF5Open(comm, user.fname, FILE_MODE_READ, &viewer)); 333df2db7a0SMatthew G. Knepley /* Load exampleDMPlex */ 334df2db7a0SMatthew G. Knepley { 335df2db7a0SMatthew G. Knepley PetscSF sfXB, sfBC; 336df2db7a0SMatthew G. Knepley 337df2db7a0SMatthew G. Knepley PetscCall(DMCreate(comm, &dm)); 338df2db7a0SMatthew G. Knepley PetscCall(DMSetType(dm, DMPLEX)); 339df2db7a0SMatthew G. Knepley PetscCall(PetscObjectSetName((PetscObject)dm, exampleDMPlexName)); 340df2db7a0SMatthew G. Knepley /* sfXB: X -> B */ 341df2db7a0SMatthew G. Knepley /* X: set of globalPointNumbers, [0, N) */ 342df2db7a0SMatthew G. Knepley /* B: loaded naive in-memory plex */ 343df2db7a0SMatthew G. Knepley PetscCall(PetscViewerPushFormat(viewer, format)); 344df2db7a0SMatthew G. Knepley PetscCall(DMPlexTopologyLoad(dm, viewer, &sfXB)); 345df2db7a0SMatthew G. Knepley PetscCall(PetscViewerPopFormat(viewer)); 346df2db7a0SMatthew G. Knepley { 347df2db7a0SMatthew G. Knepley DM distributedDM; 348df2db7a0SMatthew G. Knepley PetscInt overlap = 1; 349df2db7a0SMatthew G. Knepley PetscPartitioner part; 350df2db7a0SMatthew G. Knepley 351df2db7a0SMatthew G. Knepley PetscCall(DMPlexGetPartitioner(dm, &part)); 352df2db7a0SMatthew G. Knepley PetscCall(PetscPartitionerSetFromOptions(part)); 353df2db7a0SMatthew G. Knepley /* sfBC: B -> C */ 354df2db7a0SMatthew G. Knepley /* B: loaded naive in-memory plex */ 355df2db7a0SMatthew G. Knepley /* C: redistributed good in-memory */ 356df2db7a0SMatthew G. Knepley PetscCall(DMPlexDistribute(dm, overlap, &sfBC, &distributedDM)); 357df2db7a0SMatthew G. Knepley if (distributedDM) { 358df2db7a0SMatthew G. Knepley PetscCall(DMDestroy(&dm)); 359df2db7a0SMatthew G. Knepley dm = distributedDM; 360df2db7a0SMatthew G. Knepley } 361df2db7a0SMatthew G. Knepley PetscCall(PetscObjectSetName((PetscObject)dm, exampleDMPlexName)); 362df2db7a0SMatthew G. Knepley } 363df2db7a0SMatthew G. Knepley /* sfXC: X -> C */ 364df2db7a0SMatthew G. Knepley PetscCall(PetscSFCompose(sfXB, sfBC, &sfXC)); 365df2db7a0SMatthew G. Knepley PetscCall(PetscSFDestroy(&sfXB)); 366df2db7a0SMatthew G. Knepley PetscCall(PetscSFDestroy(&sfBC)); 367df2db7a0SMatthew G. Knepley } 368df2db7a0SMatthew G. Knepley /* Load labels */ 369df2db7a0SMatthew G. Knepley PetscCall(PetscViewerPushFormat(viewer, format)); 370df2db7a0SMatthew G. Knepley PetscCall(DMPlexLabelsLoad(dm, viewer, sfXC)); 371df2db7a0SMatthew G. Knepley PetscCall(PetscViewerPopFormat(viewer)); 372df2db7a0SMatthew G. Knepley /* Load coordinates */ 373df2db7a0SMatthew G. Knepley PetscCall(PetscViewerPushFormat(viewer, format)); 374df2db7a0SMatthew G. Knepley PetscCall(DMPlexCoordinatesLoad(dm, viewer, sfXC)); 375df2db7a0SMatthew G. Knepley PetscCall(PetscViewerPopFormat(viewer)); 376df2db7a0SMatthew G. Knepley PetscCall(PetscObjectSetName((PetscObject)dm, "Load: DM (with coordinates)")); 377df2db7a0SMatthew G. Knepley PetscCall(DMViewFromOptions(dm, NULL, "-dm_view")); 378df2db7a0SMatthew G. Knepley PetscCall(PetscObjectSetName((PetscObject)dm, exampleDMPlexName)); 379df2db7a0SMatthew G. Knepley /* Load exampleVec */ 380df2db7a0SMatthew G. Knepley { 381df2db7a0SMatthew G. Knepley DM sdm; 382df2db7a0SMatthew G. Knepley PetscSection section, gsection; 383df2db7a0SMatthew G. Knepley IS perm; 384df2db7a0SMatthew G. Knepley PetscBool includesConstraints = PETSC_FALSE; 385df2db7a0SMatthew G. Knepley Vec vec; 386df2db7a0SMatthew G. Knepley PetscSF lsf, gsf; 387df2db7a0SMatthew G. Knepley 388df2db7a0SMatthew G. Knepley if (user.shell) { 389df2db7a0SMatthew G. Knepley PetscSF sf; 390df2db7a0SMatthew G. Knepley 391df2db7a0SMatthew G. Knepley PetscCall(DMShellCreate(comm, &sdm)); 392df2db7a0SMatthew G. Knepley PetscCall(DMGetPointSF(dm, &sf)); 393df2db7a0SMatthew G. Knepley PetscCall(DMSetPointSF(sdm, sf)); 394df2db7a0SMatthew G. Knepley } else { 395df2db7a0SMatthew G. Knepley PetscCall(DMClone(dm, &sdm)); 396df2db7a0SMatthew G. Knepley } 397df2db7a0SMatthew G. Knepley PetscCall(PetscObjectSetName((PetscObject)sdm, exampleSectionDMName)); 398df2db7a0SMatthew G. Knepley PetscCall(PetscSectionCreate(comm, §ion)); 399df2db7a0SMatthew G. Knepley { 400df2db7a0SMatthew G. Knepley PetscInt pStart = -1, pEnd = -1, p = -1; 401df2db7a0SMatthew G. Knepley PetscInt *pinds = NULL; 402df2db7a0SMatthew G. Knepley 403df2db7a0SMatthew G. Knepley PetscCall(DMPlexGetChart(dm, &pStart, &pEnd)); 404df2db7a0SMatthew G. Knepley PetscCall(PetscMalloc1(pEnd - pStart, &pinds)); 405df2db7a0SMatthew G. Knepley for (p = 0; p < pEnd - pStart; ++p) pinds[p] = p; 4069371c9d4SSatish Balay if (rank == 2) { 4079371c9d4SSatish Balay pinds[10] = 20; 4089371c9d4SSatish Balay pinds[20] = 10; 4099371c9d4SSatish Balay } 410df2db7a0SMatthew G. Knepley PetscCall(ISCreateGeneral(comm, pEnd - pStart, pinds, PETSC_OWN_POINTER, &perm)); 411df2db7a0SMatthew G. Knepley } 412df2db7a0SMatthew G. Knepley PetscCall(PetscSectionSetPermutation(section, perm)); 413df2db7a0SMatthew G. Knepley PetscCall(ISDestroy(&perm)); 414df2db7a0SMatthew G. Knepley PetscCall(DMSetLocalSection(sdm, section)); 415df2db7a0SMatthew G. Knepley PetscCall(PetscSectionDestroy(§ion)); 416df2db7a0SMatthew G. Knepley PetscCall(DMPlexSectionLoad(dm, viewer, sdm, sfXC, &gsf, &lsf)); 417df2db7a0SMatthew G. Knepley /* Load as local vector */ 418df2db7a0SMatthew G. Knepley PetscCall(DMGetLocalSection(sdm, §ion)); 419df2db7a0SMatthew G. Knepley PetscCall(PetscObjectSetName((PetscObject)section, "Load: local section")); 420df2db7a0SMatthew G. Knepley PetscCall(PetscSectionView(section, PETSC_VIEWER_STDOUT_(comm))); 421df2db7a0SMatthew G. Knepley PetscCall(PetscSectionGetIncludesConstraints(section, &includesConstraints)); 422df2db7a0SMatthew G. Knepley if (user.shell) { 423df2db7a0SMatthew G. Knepley PetscInt m = -1; 424df2db7a0SMatthew G. Knepley 425df2db7a0SMatthew G. Knepley PetscCall(VecCreate(comm, &vec)); 426df2db7a0SMatthew G. Knepley if (includesConstraints) PetscCall(PetscSectionGetStorageSize(section, &m)); 427df2db7a0SMatthew G. Knepley else PetscCall(PetscSectionGetConstrainedStorageSize(section, &m)); 428df2db7a0SMatthew G. Knepley PetscCall(VecSetSizes(vec, m, PETSC_DECIDE)); 429df2db7a0SMatthew G. Knepley PetscCall(VecSetUp(vec)); 430df2db7a0SMatthew G. Knepley } else { 431df2db7a0SMatthew G. Knepley PetscCall(DMGetLocalVector(sdm, &vec)); 432df2db7a0SMatthew G. Knepley } 433df2db7a0SMatthew G. Knepley PetscCall(PetscObjectSetName((PetscObject)vec, exampleVecName)); 434df2db7a0SMatthew G. Knepley PetscCall(VecSet(vec, constraintValue)); 435df2db7a0SMatthew G. Knepley PetscCall(DMPlexLocalVectorLoad(dm, viewer, sdm, lsf, vec)); 436df2db7a0SMatthew G. Knepley PetscCall(PetscSFDestroy(&lsf)); 437df2db7a0SMatthew G. Knepley if (user.shell) { 438df2db7a0SMatthew G. Knepley PetscCall(VecView(vec, PETSC_VIEWER_STDOUT_(comm))); 439df2db7a0SMatthew G. Knepley PetscCall(VecDestroy(&vec)); 440df2db7a0SMatthew G. Knepley } else { 441df2db7a0SMatthew G. Knepley PetscCall(DMRestoreLocalVector(sdm, &vec)); 442df2db7a0SMatthew G. Knepley } 443df2db7a0SMatthew G. Knepley /* Load as global vector */ 444df2db7a0SMatthew G. Knepley PetscCall(DMGetGlobalSection(sdm, &gsection)); 445df2db7a0SMatthew G. Knepley PetscCall(PetscObjectSetName((PetscObject)gsection, "Load: global section")); 446df2db7a0SMatthew G. Knepley PetscCall(PetscSectionView(gsection, PETSC_VIEWER_STDOUT_(comm))); 447df2db7a0SMatthew G. Knepley PetscCall(PetscSectionGetIncludesConstraints(gsection, &includesConstraints)); 448df2db7a0SMatthew G. Knepley if (user.shell) { 449df2db7a0SMatthew G. Knepley PetscInt m = -1; 450df2db7a0SMatthew G. Knepley 451df2db7a0SMatthew G. Knepley PetscCall(VecCreate(comm, &vec)); 452df2db7a0SMatthew G. Knepley if (includesConstraints) PetscCall(PetscSectionGetStorageSize(gsection, &m)); 453df2db7a0SMatthew G. Knepley else PetscCall(PetscSectionGetConstrainedStorageSize(gsection, &m)); 454df2db7a0SMatthew G. Knepley PetscCall(VecSetSizes(vec, m, PETSC_DECIDE)); 455df2db7a0SMatthew G. Knepley PetscCall(VecSetUp(vec)); 456df2db7a0SMatthew G. Knepley } else { 457df2db7a0SMatthew G. Knepley PetscCall(DMGetGlobalVector(sdm, &vec)); 458df2db7a0SMatthew G. Knepley } 459df2db7a0SMatthew G. Knepley PetscCall(PetscObjectSetName((PetscObject)vec, exampleVecName)); 460df2db7a0SMatthew G. Knepley PetscCall(DMPlexGlobalVectorLoad(dm, viewer, sdm, gsf, vec)); 461df2db7a0SMatthew G. Knepley PetscCall(PetscSFDestroy(&gsf)); 462df2db7a0SMatthew G. Knepley PetscCall(VecView(vec, PETSC_VIEWER_STDOUT_(comm))); 463df2db7a0SMatthew G. Knepley if (user.shell) { 464df2db7a0SMatthew G. Knepley PetscCall(VecDestroy(&vec)); 465df2db7a0SMatthew G. Knepley } else { 466df2db7a0SMatthew G. Knepley PetscCall(DMRestoreGlobalVector(sdm, &vec)); 467df2db7a0SMatthew G. Knepley } 468df2db7a0SMatthew G. Knepley PetscCall(DMDestroy(&sdm)); 469df2db7a0SMatthew G. Knepley } 470df2db7a0SMatthew G. Knepley PetscCall(PetscViewerDestroy(&viewer)); 471df2db7a0SMatthew G. Knepley PetscCall(PetscSFDestroy(&sfXC)); 472df2db7a0SMatthew G. Knepley PetscCall(DMDestroy(&dm)); 473df2db7a0SMatthew G. Knepley } 474df2db7a0SMatthew G. Knepley PetscCallMPI(MPI_Comm_free(&comm)); 475df2db7a0SMatthew G. Knepley 476df2db7a0SMatthew G. Knepley /* Finalize */ 477df2db7a0SMatthew G. Knepley PetscCall(PetscFinalize()); 478df2db7a0SMatthew G. Knepley return 0; 479df2db7a0SMatthew G. Knepley } 480df2db7a0SMatthew G. Knepley 481df2db7a0SMatthew G. Knepley /*TEST 482df2db7a0SMatthew G. Knepley 483df2db7a0SMatthew G. Knepley build: 484df2db7a0SMatthew G. Knepley requires: hdf5 485df2db7a0SMatthew G. Knepley testset: 486df2db7a0SMatthew G. Knepley suffix: 0 487df2db7a0SMatthew G. Knepley requires: !complex 488df2db7a0SMatthew G. Knepley nsize: 4 489df2db7a0SMatthew G. Knepley args: -fname ex12_dump.h5 -shell {{True False}separate output} -dm_view ascii::ascii_info_detail 490df2db7a0SMatthew G. Knepley args: -dm_plex_view_hdf5_storage_version 2.0.0 491df2db7a0SMatthew G. Knepley test: 492df2db7a0SMatthew G. Knepley suffix: parmetis 493df2db7a0SMatthew G. Knepley requires: parmetis 494df2db7a0SMatthew G. Knepley args: -petscpartitioner_type parmetis 495df2db7a0SMatthew G. Knepley test: 496df2db7a0SMatthew G. Knepley suffix: ptscotch 497df2db7a0SMatthew G. Knepley requires: ptscotch 498df2db7a0SMatthew G. Knepley args: -petscpartitioner_type ptscotch 499df2db7a0SMatthew G. Knepley 500df2db7a0SMatthew G. Knepley TEST*/ 501