1231de6a2SMatthew G. Knepley static char help[] = "The main goal of this code is to retrieve the original element numbers as found in the " 2231de6a2SMatthew G. Knepley "initial partitions (sInitialPartition)... but after the call to DMPlexDistribute"; 3231de6a2SMatthew G. Knepley 4231de6a2SMatthew G. Knepley #include <petsc.h> 5231de6a2SMatthew G. Knepley 6231de6a2SMatthew G. Knepley PetscReal sCoords2x5Mesh[18][2] = { 7231de6a2SMatthew G. Knepley {0.00000000000000000e+00, 0.00000000000000000e+00}, 8231de6a2SMatthew G. Knepley {2.00000000000000000e+00, 0.00000000000000000e+00}, 9231de6a2SMatthew G. Knepley {0.00000000000000000e+00, 1.00000000000000000e+00}, 10231de6a2SMatthew G. Knepley {2.00000000000000000e+00, 1.00000000000000000e+00}, 11231de6a2SMatthew G. Knepley {9.99999999997387978e-01, 0.00000000000000000e+00}, 12231de6a2SMatthew G. Knepley {9.99999999997387978e-01, 1.00000000000000000e+00}, 13231de6a2SMatthew G. Knepley {0.00000000000000000e+00, 2.00000000000000011e-01}, 14231de6a2SMatthew G. Knepley {0.00000000000000000e+00, 4.00000000000000022e-01}, 15231de6a2SMatthew G. Knepley {0.00000000000000000e+00, 5.99999999999999978e-01}, 16231de6a2SMatthew G. Knepley {0.00000000000000000e+00, 8.00000000000000044e-01}, 17231de6a2SMatthew G. Knepley {2.00000000000000000e+00, 2.00000000000000011e-01}, 18231de6a2SMatthew G. Knepley {2.00000000000000000e+00, 4.00000000000000022e-01}, 19231de6a2SMatthew G. Knepley {2.00000000000000000e+00, 5.99999999999999978e-01}, 20231de6a2SMatthew G. Knepley {2.00000000000000000e+00, 8.00000000000000044e-01}, 21231de6a2SMatthew G. Knepley {9.99999999997387756e-01, 2.00000000000000011e-01}, 22231de6a2SMatthew G. Knepley {9.99999999997387978e-01, 4.00000000000000022e-01}, 23231de6a2SMatthew G. Knepley {9.99999999997387978e-01, 6.00000000000000089e-01}, 24*9371c9d4SSatish Balay {9.99999999997388089e-01, 8.00000000000000044e-01} 25*9371c9d4SSatish Balay }; 26231de6a2SMatthew G. Knepley 27231de6a2SMatthew G. Knepley //Connectivity of a 2x5 rectangular mesh of quads : 28231de6a2SMatthew G. Knepley const PetscInt sConnectivity2x5Mesh[10][4] = { 29231de6a2SMatthew G. Knepley {0, 4, 14, 6 }, 30231de6a2SMatthew G. Knepley {6, 14, 15, 7 }, 31231de6a2SMatthew G. Knepley {7, 15, 16, 8 }, 32231de6a2SMatthew G. Knepley {8, 16, 17, 9 }, 33231de6a2SMatthew G. Knepley {9, 17, 5, 2 }, 34231de6a2SMatthew G. Knepley {4, 1, 10, 14}, 35231de6a2SMatthew G. Knepley {14, 10, 11, 15}, 36231de6a2SMatthew G. Knepley {15, 11, 12, 16}, 37231de6a2SMatthew G. Knepley {16, 12, 13, 17}, 38*9371c9d4SSatish Balay {17, 13, 3, 5 } 39*9371c9d4SSatish Balay }; 40231de6a2SMatthew G. Knepley 41231de6a2SMatthew G. Knepley const PetscInt sInitialPartition2x5Mesh[2][5] = { 42231de6a2SMatthew G. Knepley {0, 2, 4, 6, 8}, 43231de6a2SMatthew G. Knepley {1, 3, 5, 7, 9} 44231de6a2SMatthew G. Knepley }; 45231de6a2SMatthew G. Knepley 46231de6a2SMatthew G. Knepley const PetscInt sNLoclCells2x5Mesh = 5; 47231de6a2SMatthew G. Knepley const PetscInt sNGlobVerts2x5Mesh = 18; 48231de6a2SMatthew G. Knepley 49*9371c9d4SSatish Balay int main(int argc, char **argv) { 50231de6a2SMatthew G. Knepley const PetscInt Nc = sNLoclCells2x5Mesh; //Same on each rank for this example... 51231de6a2SMatthew G. Knepley const PetscInt Nv = sNGlobVerts2x5Mesh; 52*9371c9d4SSatish Balay const PetscInt *InitPartForRank[2] = {&sInitialPartition2x5Mesh[0][0], &sInitialPartition2x5Mesh[1][0]}; 53231de6a2SMatthew G. Knepley const PetscInt(*Conn)[4] = sConnectivity2x5Mesh; 54231de6a2SMatthew G. Knepley 55231de6a2SMatthew G. Knepley const PetscInt Ncor = 4; 56231de6a2SMatthew G. Knepley const PetscInt dim = 2; 57231de6a2SMatthew G. Knepley DM dm, idm, ddm; 58231de6a2SMatthew G. Knepley PetscSF sfVert, sfMig, sfPart; 59231de6a2SMatthew G. Knepley PetscPartitioner part; 60231de6a2SMatthew G. Knepley PetscSection s; 61231de6a2SMatthew G. Knepley PetscInt *cells, c; 62231de6a2SMatthew G. Knepley PetscMPIInt size, rank; 63231de6a2SMatthew G. Knepley PetscBool box = PETSC_FALSE, field = PETSC_FALSE; 64231de6a2SMatthew G. Knepley 65327415f7SBarry Smith PetscFunctionBeginUser; 66231de6a2SMatthew G. Knepley PetscCall(PetscInitialize(&argc, &argv, NULL, help)); 67231de6a2SMatthew G. Knepley PetscCallMPI(MPI_Comm_size(PETSC_COMM_WORLD, &size)); 68231de6a2SMatthew G. Knepley PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank)); 69231de6a2SMatthew G. Knepley PetscCheck(size == 2, PETSC_COMM_WORLD, PETSC_ERR_SUP, "This is a 2 processors example only"); 70231de6a2SMatthew G. Knepley PetscCall(PetscOptionsGetBool(NULL, NULL, "-box", &box, NULL)); 71231de6a2SMatthew G. Knepley PetscCall(PetscOptionsGetBool(NULL, NULL, "-field", &field, NULL)); 72231de6a2SMatthew G. Knepley 73231de6a2SMatthew G. Knepley PetscCall(DMPlexCreate(PETSC_COMM_WORLD, &dm)); 74231de6a2SMatthew G. Knepley if (box) { 75231de6a2SMatthew G. Knepley PetscCall(DMSetType(dm, DMPLEX)); 76231de6a2SMatthew G. Knepley PetscCall(DMSetFromOptions(dm)); 77231de6a2SMatthew G. Knepley } else { 78231de6a2SMatthew G. Knepley PetscCall(PetscMalloc1(Nc * Ncor, &cells)); 79231de6a2SMatthew G. Knepley for (c = 0; c < Nc; ++c) { 80231de6a2SMatthew G. Knepley PetscInt cell = (InitPartForRank[rank])[c], cor; 81231de6a2SMatthew G. Knepley 82*9371c9d4SSatish Balay for (cor = 0; cor < Ncor; ++cor) { cells[c * Ncor + cor] = Conn[cell][cor]; } 83231de6a2SMatthew G. Knepley } 84231de6a2SMatthew G. Knepley PetscCall(DMSetDimension(dm, dim)); 85231de6a2SMatthew G. Knepley PetscCall(DMPlexBuildFromCellListParallel(dm, Nc, PETSC_DECIDE, Nv, Ncor, cells, &sfVert, NULL)); 86231de6a2SMatthew G. Knepley PetscCall(PetscSFDestroy(&sfVert)); 87231de6a2SMatthew G. Knepley PetscCall(PetscFree(cells)); 88231de6a2SMatthew G. Knepley PetscCall(DMPlexInterpolate(dm, &idm)); 89231de6a2SMatthew G. Knepley PetscCall(DMDestroy(&dm)); 90231de6a2SMatthew G. Knepley dm = idm; 91231de6a2SMatthew G. Knepley } 92231de6a2SMatthew G. Knepley PetscCall(DMSetUseNatural(dm, PETSC_TRUE)); 93231de6a2SMatthew G. Knepley PetscCall(DMViewFromOptions(dm, NULL, "-dm_view")); 94231de6a2SMatthew G. Knepley 95231de6a2SMatthew G. Knepley if (field) { 96231de6a2SMatthew G. Knepley const PetscInt Nf = 1; 97231de6a2SMatthew G. Knepley const PetscInt numComp[1] = {1}; 98231de6a2SMatthew G. Knepley const PetscInt numDof[3] = {0, 0, 1}; 99231de6a2SMatthew G. Knepley const PetscInt numBC = 0; 100231de6a2SMatthew G. Knepley 101231de6a2SMatthew G. Knepley PetscCall(DMSetNumFields(dm, Nf)); 102231de6a2SMatthew G. Knepley PetscCall(DMPlexCreateSection(dm, NULL, numComp, numDof, numBC, NULL, NULL, NULL, NULL, &s)); 103231de6a2SMatthew G. Knepley PetscCall(DMSetLocalSection(dm, s)); 104231de6a2SMatthew G. Knepley PetscCall(PetscSectionView(s, PETSC_VIEWER_STDOUT_WORLD)); 105231de6a2SMatthew G. Knepley PetscCall(PetscSectionDestroy(&s)); 106231de6a2SMatthew G. Knepley } 107231de6a2SMatthew G. Knepley 108231de6a2SMatthew G. Knepley PetscCall(DMPlexGetPartitioner(dm, &part)); 109231de6a2SMatthew G. Knepley PetscCall(PetscPartitionerSetFromOptions(part)); 110231de6a2SMatthew G. Knepley 111231de6a2SMatthew G. Knepley PetscCall(DMPlexDistribute(dm, 0, &sfMig, &ddm)); 112231de6a2SMatthew G. Knepley PetscCall(PetscSFView(sfMig, PETSC_VIEWER_STDOUT_WORLD)); 113231de6a2SMatthew G. Knepley PetscCall(PetscSFCreateInverseSF(sfMig, &sfPart)); 114231de6a2SMatthew G. Knepley PetscCall(PetscObjectSetName((PetscObject)sfPart, "Inverse Migration SF")); 115231de6a2SMatthew G. Knepley PetscCall(PetscSFView(sfPart, PETSC_VIEWER_STDOUT_WORLD)); 116231de6a2SMatthew G. Knepley 117231de6a2SMatthew G. Knepley Vec lGlobalVec, lNatVec; 118231de6a2SMatthew G. Knepley PetscScalar *lNatVecArray; 119231de6a2SMatthew G. Knepley 120231de6a2SMatthew G. Knepley { 121231de6a2SMatthew G. Knepley PetscSection s; 122231de6a2SMatthew G. Knepley 123231de6a2SMatthew G. Knepley PetscCall(DMGetGlobalSection(dm, &s)); 124231de6a2SMatthew G. Knepley PetscCall(PetscSectionView(s, PETSC_VIEWER_STDOUT_WORLD)); 125231de6a2SMatthew G. Knepley } 126231de6a2SMatthew G. Knepley PetscCall(DMGetGlobalVector(dm, &lNatVec)); 127231de6a2SMatthew G. Knepley PetscCall(PetscObjectSetName((PetscObject)lNatVec, "Natural Vector (initial partition)")); 128231de6a2SMatthew G. Knepley 129231de6a2SMatthew G. Knepley //Copying the initial partition into the "natural" vector: 130231de6a2SMatthew G. Knepley PetscCall(VecGetArray(lNatVec, &lNatVecArray)); 131231de6a2SMatthew G. Knepley for (c = 0; c < Nc; ++c) lNatVecArray[c] = (InitPartForRank[rank])[c]; 132231de6a2SMatthew G. Knepley PetscCall(VecRestoreArray(lNatVec, &lNatVecArray)); 133231de6a2SMatthew G. Knepley 134231de6a2SMatthew G. Knepley PetscCall(DMGetGlobalVector(ddm, &lGlobalVec)); 135231de6a2SMatthew G. Knepley PetscCall(PetscObjectSetName((PetscObject)lGlobalVec, "Global Vector (reordered element numbers in the petsc distributed order)")); 136231de6a2SMatthew G. Knepley PetscCall(VecZeroEntries(lGlobalVec)); 137231de6a2SMatthew G. Knepley 138231de6a2SMatthew G. Knepley // The call to DMPlexNaturalToGlobalBegin/End does not produce our expected result... 139231de6a2SMatthew G. Knepley // In lGlobalVec, we expect to have: 140231de6a2SMatthew G. Knepley /* 141231de6a2SMatthew G. Knepley * Process [0] 142231de6a2SMatthew G. Knepley * 2. 143231de6a2SMatthew G. Knepley * 4. 144231de6a2SMatthew G. Knepley * 8. 145231de6a2SMatthew G. Knepley * 3. 146231de6a2SMatthew G. Knepley * 9. 147231de6a2SMatthew G. Knepley * Process [1] 148231de6a2SMatthew G. Knepley * 1. 149231de6a2SMatthew G. Knepley * 5. 150231de6a2SMatthew G. Knepley * 7. 151231de6a2SMatthew G. Knepley * 0. 152231de6a2SMatthew G. Knepley * 6. 153231de6a2SMatthew G. Knepley * 154231de6a2SMatthew G. Knepley * but we obtained: 155231de6a2SMatthew G. Knepley * 156231de6a2SMatthew G. Knepley * Process [0] 157231de6a2SMatthew G. Knepley * 2. 158231de6a2SMatthew G. Knepley * 4. 159231de6a2SMatthew G. Knepley * 8. 160231de6a2SMatthew G. Knepley * 0. 161231de6a2SMatthew G. Knepley * 0. 162231de6a2SMatthew G. Knepley * Process [1] 163231de6a2SMatthew G. Knepley * 0. 164231de6a2SMatthew G. Knepley * 0. 165231de6a2SMatthew G. Knepley * 0. 166231de6a2SMatthew G. Knepley * 0. 167231de6a2SMatthew G. Knepley * 0. 168231de6a2SMatthew G. Knepley */ 169231de6a2SMatthew G. Knepley 170231de6a2SMatthew G. Knepley { 171231de6a2SMatthew G. Knepley PetscSF nsf; 172231de6a2SMatthew G. Knepley 173231de6a2SMatthew G. Knepley PetscCall(DMPlexGetGlobalToNaturalSF(ddm, &nsf)); 174231de6a2SMatthew G. Knepley PetscCall(PetscSFView(nsf, NULL)); 175231de6a2SMatthew G. Knepley } 176231de6a2SMatthew G. Knepley PetscCall(DMPlexNaturalToGlobalBegin(ddm, lNatVec, lGlobalVec)); 177231de6a2SMatthew G. Knepley PetscCall(DMPlexNaturalToGlobalEnd(ddm, lNatVec, lGlobalVec)); 178231de6a2SMatthew G. Knepley 179231de6a2SMatthew G. Knepley PetscCall(VecView(lNatVec, PETSC_VIEWER_STDOUT_WORLD)); 180231de6a2SMatthew G. Knepley PetscCall(VecView(lGlobalVec, PETSC_VIEWER_STDOUT_WORLD)); 181231de6a2SMatthew G. Knepley 182231de6a2SMatthew G. Knepley PetscCall(DMRestoreGlobalVector(dm, &lNatVec)); 183231de6a2SMatthew G. Knepley PetscCall(DMRestoreGlobalVector(ddm, &lGlobalVec)); 184231de6a2SMatthew G. Knepley 185231de6a2SMatthew G. Knepley PetscCall(PetscSFDestroy(&sfMig)); 186231de6a2SMatthew G. Knepley PetscCall(PetscSFDestroy(&sfPart)); 187231de6a2SMatthew G. Knepley PetscCall(DMDestroy(&dm)); 188231de6a2SMatthew G. Knepley PetscCall(DMDestroy(&ddm)); 189231de6a2SMatthew G. Knepley PetscCall(PetscFinalize()); 190231de6a2SMatthew G. Knepley return 0; 191231de6a2SMatthew G. Knepley } 192231de6a2SMatthew G. Knepley 193231de6a2SMatthew G. Knepley /*TEST 194231de6a2SMatthew G. Knepley 195231de6a2SMatthew G. Knepley testset: 196231de6a2SMatthew G. Knepley args: -field -petscpartitioner_type simple 197231de6a2SMatthew G. Knepley nsize: 2 198231de6a2SMatthew G. Knepley 199231de6a2SMatthew G. Knepley test: 200231de6a2SMatthew G. Knepley suffix: 0 201231de6a2SMatthew G. Knepley args: 202231de6a2SMatthew G. Knepley 203231de6a2SMatthew G. Knepley test: 204231de6a2SMatthew G. Knepley suffix: 1 205231de6a2SMatthew G. Knepley args: -box -dm_plex_simplex 0 -dm_plex_box_faces 2,5 -dm_distribute 206231de6a2SMatthew G. Knepley 207231de6a2SMatthew G. Knepley TEST*/ 208