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}, 24231de6a2SMatthew G. Knepley {9.99999999997388089e-01, 8.00000000000000044e-01}}; 25231de6a2SMatthew G. Knepley 26231de6a2SMatthew G. Knepley //Connectivity of a 2x5 rectangular mesh of quads : 27231de6a2SMatthew G. Knepley const PetscInt sConnectivity2x5Mesh[10][4] = { 28231de6a2SMatthew G. Knepley {0,4,14,6}, 29231de6a2SMatthew G. Knepley {6,14,15,7}, 30231de6a2SMatthew G. Knepley {7,15,16,8}, 31231de6a2SMatthew G. Knepley {8,16,17,9}, 32231de6a2SMatthew G. Knepley {9,17,5,2}, 33231de6a2SMatthew G. Knepley {4,1,10,14}, 34231de6a2SMatthew G. Knepley {14,10,11,15}, 35231de6a2SMatthew G. Knepley {15,11,12,16}, 36231de6a2SMatthew G. Knepley {16,12,13,17}, 37231de6a2SMatthew G. Knepley {17,13,3,5}}; 38231de6a2SMatthew G. Knepley 39231de6a2SMatthew G. Knepley const PetscInt sInitialPartition2x5Mesh[2][5] = { 40231de6a2SMatthew G. Knepley {0,2,4,6,8}, 41231de6a2SMatthew G. Knepley {1,3,5,7,9} 42231de6a2SMatthew G. Knepley }; 43231de6a2SMatthew G. Knepley 44231de6a2SMatthew G. Knepley const PetscInt sNLoclCells2x5Mesh = 5; 45231de6a2SMatthew G. Knepley const PetscInt sNGlobVerts2x5Mesh = 18; 46231de6a2SMatthew G. Knepley 47231de6a2SMatthew G. Knepley int main(int argc, char **argv) 48231de6a2SMatthew G. Knepley { 49231de6a2SMatthew G. Knepley const PetscInt Nc = sNLoclCells2x5Mesh; //Same on each rank for this example... 50231de6a2SMatthew G. Knepley const PetscInt Nv = sNGlobVerts2x5Mesh; 51231de6a2SMatthew G. Knepley const PetscInt* InitPartForRank[2] = {&sInitialPartition2x5Mesh[0][0], 52231de6a2SMatthew G. Knepley &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 65*327415f7SBarry 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 82231de6a2SMatthew G. Knepley for (cor = 0; cor < Ncor; ++cor) { 83231de6a2SMatthew G. Knepley cells[c*Ncor + cor] = Conn[cell][cor]; 84231de6a2SMatthew G. Knepley } 85231de6a2SMatthew G. Knepley } 86231de6a2SMatthew G. Knepley PetscCall(DMSetDimension(dm, dim)); 87231de6a2SMatthew G. Knepley PetscCall(DMPlexBuildFromCellListParallel(dm, Nc, PETSC_DECIDE, Nv, Ncor, cells, &sfVert, NULL)); 88231de6a2SMatthew G. Knepley PetscCall(PetscSFDestroy(&sfVert)); 89231de6a2SMatthew G. Knepley PetscCall(PetscFree(cells)); 90231de6a2SMatthew G. Knepley PetscCall(DMPlexInterpolate(dm, &idm)); 91231de6a2SMatthew G. Knepley PetscCall(DMDestroy(&dm)); 92231de6a2SMatthew G. Knepley dm = idm; 93231de6a2SMatthew G. Knepley } 94231de6a2SMatthew G. Knepley PetscCall(DMSetUseNatural(dm, PETSC_TRUE)); 95231de6a2SMatthew G. Knepley PetscCall(DMViewFromOptions(dm, NULL, "-dm_view")); 96231de6a2SMatthew G. Knepley 97231de6a2SMatthew G. Knepley if (field) { 98231de6a2SMatthew G. Knepley const PetscInt Nf = 1; 99231de6a2SMatthew G. Knepley const PetscInt numComp[1] = {1}; 100231de6a2SMatthew G. Knepley const PetscInt numDof[3] = {0, 0, 1}; 101231de6a2SMatthew G. Knepley const PetscInt numBC = 0; 102231de6a2SMatthew G. Knepley 103231de6a2SMatthew G. Knepley PetscCall(DMSetNumFields(dm, Nf)); 104231de6a2SMatthew G. Knepley PetscCall(DMPlexCreateSection(dm, NULL, numComp, numDof, numBC, NULL, NULL, NULL, NULL, &s)); 105231de6a2SMatthew G. Knepley PetscCall(DMSetLocalSection(dm, s)); 106231de6a2SMatthew G. Knepley PetscCall(PetscSectionView(s, PETSC_VIEWER_STDOUT_WORLD)); 107231de6a2SMatthew G. Knepley PetscCall(PetscSectionDestroy(&s)); 108231de6a2SMatthew G. Knepley } 109231de6a2SMatthew G. Knepley 110231de6a2SMatthew G. Knepley PetscCall(DMPlexGetPartitioner(dm, &part)); 111231de6a2SMatthew G. Knepley PetscCall(PetscPartitionerSetFromOptions(part)); 112231de6a2SMatthew G. Knepley 113231de6a2SMatthew G. Knepley PetscCall(DMPlexDistribute(dm, 0, &sfMig, &ddm)); 114231de6a2SMatthew G. Knepley PetscCall(PetscSFView(sfMig, PETSC_VIEWER_STDOUT_WORLD)); 115231de6a2SMatthew G. Knepley PetscCall(PetscSFCreateInverseSF(sfMig, &sfPart)); 116231de6a2SMatthew G. Knepley PetscCall(PetscObjectSetName((PetscObject) sfPart, "Inverse Migration SF")); 117231de6a2SMatthew G. Knepley PetscCall(PetscSFView(sfPart, PETSC_VIEWER_STDOUT_WORLD)); 118231de6a2SMatthew G. Knepley 119231de6a2SMatthew G. Knepley Vec lGlobalVec, lNatVec; 120231de6a2SMatthew G. Knepley PetscScalar *lNatVecArray; 121231de6a2SMatthew G. Knepley 122231de6a2SMatthew G. Knepley { 123231de6a2SMatthew G. Knepley PetscSection s; 124231de6a2SMatthew G. Knepley 125231de6a2SMatthew G. Knepley PetscCall(DMGetGlobalSection(dm, &s)); 126231de6a2SMatthew G. Knepley PetscCall(PetscSectionView(s, PETSC_VIEWER_STDOUT_WORLD)); 127231de6a2SMatthew G. Knepley } 128231de6a2SMatthew G. Knepley PetscCall(DMGetGlobalVector(dm, &lNatVec)); 129231de6a2SMatthew G. Knepley PetscCall(PetscObjectSetName((PetscObject) lNatVec, "Natural Vector (initial partition)")); 130231de6a2SMatthew G. Knepley 131231de6a2SMatthew G. Knepley //Copying the initial partition into the "natural" vector: 132231de6a2SMatthew G. Knepley PetscCall(VecGetArray(lNatVec, &lNatVecArray)); 133231de6a2SMatthew G. Knepley for (c = 0; c < Nc; ++c) lNatVecArray[c] = (InitPartForRank[rank])[c]; 134231de6a2SMatthew G. Knepley PetscCall(VecRestoreArray(lNatVec, &lNatVecArray)); 135231de6a2SMatthew G. Knepley 136231de6a2SMatthew G. Knepley PetscCall(DMGetGlobalVector(ddm,&lGlobalVec)); 137231de6a2SMatthew G. Knepley PetscCall(PetscObjectSetName((PetscObject) lGlobalVec, "Global Vector (reordered element numbers in the petsc distributed order)")); 138231de6a2SMatthew G. Knepley PetscCall(VecZeroEntries(lGlobalVec)); 139231de6a2SMatthew G. Knepley 140231de6a2SMatthew G. Knepley // The call to DMPlexNaturalToGlobalBegin/End does not produce our expected result... 141231de6a2SMatthew G. Knepley // In lGlobalVec, we expect to have: 142231de6a2SMatthew G. Knepley /* 143231de6a2SMatthew G. Knepley * Process [0] 144231de6a2SMatthew G. Knepley * 2. 145231de6a2SMatthew G. Knepley * 4. 146231de6a2SMatthew G. Knepley * 8. 147231de6a2SMatthew G. Knepley * 3. 148231de6a2SMatthew G. Knepley * 9. 149231de6a2SMatthew G. Knepley * Process [1] 150231de6a2SMatthew G. Knepley * 1. 151231de6a2SMatthew G. Knepley * 5. 152231de6a2SMatthew G. Knepley * 7. 153231de6a2SMatthew G. Knepley * 0. 154231de6a2SMatthew G. Knepley * 6. 155231de6a2SMatthew G. Knepley * 156231de6a2SMatthew G. Knepley * but we obtained: 157231de6a2SMatthew G. Knepley * 158231de6a2SMatthew G. Knepley * Process [0] 159231de6a2SMatthew G. Knepley * 2. 160231de6a2SMatthew G. Knepley * 4. 161231de6a2SMatthew G. Knepley * 8. 162231de6a2SMatthew G. Knepley * 0. 163231de6a2SMatthew G. Knepley * 0. 164231de6a2SMatthew G. Knepley * Process [1] 165231de6a2SMatthew G. Knepley * 0. 166231de6a2SMatthew G. Knepley * 0. 167231de6a2SMatthew G. Knepley * 0. 168231de6a2SMatthew G. Knepley * 0. 169231de6a2SMatthew G. Knepley * 0. 170231de6a2SMatthew G. Knepley */ 171231de6a2SMatthew G. Knepley 172231de6a2SMatthew G. Knepley { 173231de6a2SMatthew G. Knepley PetscSF nsf; 174231de6a2SMatthew G. Knepley 175231de6a2SMatthew G. Knepley PetscCall(DMPlexGetGlobalToNaturalSF(ddm, &nsf)); 176231de6a2SMatthew G. Knepley PetscCall(PetscSFView(nsf, NULL)); 177231de6a2SMatthew G. Knepley } 178231de6a2SMatthew G. Knepley PetscCall(DMPlexNaturalToGlobalBegin(ddm, lNatVec, lGlobalVec)); 179231de6a2SMatthew G. Knepley PetscCall(DMPlexNaturalToGlobalEnd (ddm, lNatVec, lGlobalVec)); 180231de6a2SMatthew G. Knepley 181231de6a2SMatthew G. Knepley PetscCall(VecView(lNatVec, PETSC_VIEWER_STDOUT_WORLD)); 182231de6a2SMatthew G. Knepley PetscCall(VecView(lGlobalVec, PETSC_VIEWER_STDOUT_WORLD)); 183231de6a2SMatthew G. Knepley 184231de6a2SMatthew G. Knepley PetscCall(DMRestoreGlobalVector(dm,&lNatVec)); 185231de6a2SMatthew G. Knepley PetscCall(DMRestoreGlobalVector(ddm,&lGlobalVec)); 186231de6a2SMatthew G. Knepley 187231de6a2SMatthew G. Knepley PetscCall(PetscSFDestroy(&sfMig)); 188231de6a2SMatthew G. Knepley PetscCall(PetscSFDestroy(&sfPart)); 189231de6a2SMatthew G. Knepley PetscCall(DMDestroy(&dm)); 190231de6a2SMatthew G. Knepley PetscCall(DMDestroy(&ddm)); 191231de6a2SMatthew G. Knepley PetscCall(PetscFinalize()); 192231de6a2SMatthew G. Knepley return 0; 193231de6a2SMatthew G. Knepley } 194231de6a2SMatthew G. Knepley 195231de6a2SMatthew G. Knepley /*TEST 196231de6a2SMatthew G. Knepley 197231de6a2SMatthew G. Knepley testset: 198231de6a2SMatthew G. Knepley args: -field -petscpartitioner_type simple 199231de6a2SMatthew G. Knepley nsize: 2 200231de6a2SMatthew G. Knepley 201231de6a2SMatthew G. Knepley test: 202231de6a2SMatthew G. Knepley suffix: 0 203231de6a2SMatthew G. Knepley args: 204231de6a2SMatthew G. Knepley 205231de6a2SMatthew G. Knepley test: 206231de6a2SMatthew G. Knepley suffix: 1 207231de6a2SMatthew G. Knepley args: -box -dm_plex_simplex 0 -dm_plex_box_faces 2,5 -dm_distribute 208231de6a2SMatthew G. Knepley 209231de6a2SMatthew G. Knepley TEST*/ 210