1c8e949b3Sksagiyam static char help[] = "Test PetscSFCreateByMatchingIndices\n\n"; 2c8e949b3Sksagiyam 3c8e949b3Sksagiyam #include <petsc.h> 4c8e949b3Sksagiyam #include <petscsf.h> 5c8e949b3Sksagiyam 6c8e949b3Sksagiyam /* Test PetscSFCreateByMatchingIndices. 7c8e949b3Sksagiyam 8c8e949b3Sksagiyam testnum 0: 9c8e949b3Sksagiyam 10c8e949b3Sksagiyam rank : 0 1 2 11c8e949b3Sksagiyam numRootIndices : 3 1 1 12c8e949b3Sksagiyam rootIndices : [1 0 2] [3] [3] 13c8e949b3Sksagiyam rootLocalOffset : 100 200 300 14c8e949b3Sksagiyam layout : [0 1] [2] [3] 15c8e949b3Sksagiyam numLeafIndices : 1 1 2 16c8e949b3Sksagiyam leafIndices : [0] [2] [0 3] 17c8e949b3Sksagiyam leafLocalOffset : 400 500 600 18c8e949b3Sksagiyam 19c8e949b3Sksagiyam would build the following SF: 20c8e949b3Sksagiyam 21c8e949b3Sksagiyam [0] 400 <- (0,101) 22c8e949b3Sksagiyam [1] 500 <- (0,102) 23c8e949b3Sksagiyam [2] 600 <- (0,101) 24c8e949b3Sksagiyam [2] 601 <- (2,300) 25c8e949b3Sksagiyam 26c8e949b3Sksagiyam testnum 1: 27c8e949b3Sksagiyam 28c8e949b3Sksagiyam rank : 0 1 2 29c8e949b3Sksagiyam numRootIndices : 3 1 1 30c8e949b3Sksagiyam rootIndices : [1 0 2] [3] [3] 31c8e949b3Sksagiyam rootLocalOffset : 100 200 300 32c8e949b3Sksagiyam layout : [0 1] [2] [3] 33c8e949b3Sksagiyam numLeafIndices : numRootIndices numRootIndices numRootIndices 34c8e949b3Sksagiyam leafIndices : rootIndices rootIndices rootIndices 35c8e949b3Sksagiyam leafLocalOffset : rootLocalOffset rootLocalOffset rootLocalOffset 36c8e949b3Sksagiyam 37c8e949b3Sksagiyam would build the following SF: 38c8e949b3Sksagiyam 39c8e949b3Sksagiyam [1] 200 <- (2,300) 40c8e949b3Sksagiyam 41c8e949b3Sksagiyam testnum 2: 42c8e949b3Sksagiyam 43c8e949b3Sksagiyam No one claims ownership of global index 1, but no one needs it. 44c8e949b3Sksagiyam 45c8e949b3Sksagiyam rank : 0 1 2 46c8e949b3Sksagiyam numRootIndices : 2 1 1 47c8e949b3Sksagiyam rootIndices : [0 2] [3] [3] 48c8e949b3Sksagiyam rootLocalOffset : 100 200 300 49c8e949b3Sksagiyam layout : [0 1] [2] [3] 50c8e949b3Sksagiyam numLeafIndices : 1 1 2 51c8e949b3Sksagiyam leafIndices : [0] [2] [0 3] 52c8e949b3Sksagiyam leafLocalOffset : 400 500 600 53c8e949b3Sksagiyam 54c8e949b3Sksagiyam would build the following SF: 55c8e949b3Sksagiyam 56c8e949b3Sksagiyam [0] 400 <- (0,100) 57c8e949b3Sksagiyam [1] 500 <- (0,101) 58c8e949b3Sksagiyam [2] 600 <- (0,100) 59c8e949b3Sksagiyam [2] 601 <- (2,300) 60c8e949b3Sksagiyam 61c8e949b3Sksagiyam */ 62c8e949b3Sksagiyam 63*d71ae5a4SJacob Faibussowitsch int main(int argc, char **argv) 64*d71ae5a4SJacob Faibussowitsch { 65c8e949b3Sksagiyam PetscSF sf; 66c8e949b3Sksagiyam PetscLayout layout; 67c8e949b3Sksagiyam PetscInt N, n; 68c8e949b3Sksagiyam PetscInt nA = -1, *A, offsetA = -1; 69c8e949b3Sksagiyam PetscInt nB = -1, *B, offsetB = -1; 70c8e949b3Sksagiyam PetscMPIInt size, rank; 71c8e949b3Sksagiyam PetscInt testnum; 72c8e949b3Sksagiyam 73327415f7SBarry Smith PetscFunctionBeginUser; 749566063dSJacob Faibussowitsch PetscCall(PetscInitialize(&argc, &argv, NULL, help)); 759566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetInt(NULL, NULL, "-testnum", &testnum, NULL)); 769566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_size(PETSC_COMM_WORLD, &size)); 779566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank)); 7808401ef6SPierre Jolivet PetscCheck(size == 3, PETSC_COMM_WORLD, PETSC_ERR_WRONG_MPI_SIZE, "Must run with 3 MPI processes"); 79c8e949b3Sksagiyam 80c8e949b3Sksagiyam switch (testnum) { 81c8e949b3Sksagiyam case 0: 82c8e949b3Sksagiyam N = 4; 83c8e949b3Sksagiyam n = PETSC_DECIDE; 84c8e949b3Sksagiyam switch (rank) { 859371c9d4SSatish Balay case 0: 869371c9d4SSatish Balay nA = 3; 879371c9d4SSatish Balay offsetA = 100; 889371c9d4SSatish Balay nB = 1; 899371c9d4SSatish Balay offsetB = 400; 909371c9d4SSatish Balay break; 919371c9d4SSatish Balay case 1: 929371c9d4SSatish Balay nA = 1; 939371c9d4SSatish Balay offsetA = 200; 949371c9d4SSatish Balay nB = 1; 959371c9d4SSatish Balay offsetB = 500; 969371c9d4SSatish Balay break; 979371c9d4SSatish Balay case 2: 989371c9d4SSatish Balay nA = 1; 999371c9d4SSatish Balay offsetA = 300; 1009371c9d4SSatish Balay nB = 2; 1019371c9d4SSatish Balay offsetB = 600; 1029371c9d4SSatish Balay break; 103*d71ae5a4SJacob Faibussowitsch default: 104*d71ae5a4SJacob Faibussowitsch SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_WRONG_MPI_SIZE, "Must run with 3 MPI processes"); 105c8e949b3Sksagiyam } 1069566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(nA, &A)); 1079566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(nB, &B)); 108c8e949b3Sksagiyam switch (rank) { 109c8e949b3Sksagiyam case 0: 1109371c9d4SSatish Balay A[0] = 1; 1119371c9d4SSatish Balay A[1] = 0; 1129371c9d4SSatish Balay A[2] = 2; 113c8e949b3Sksagiyam B[0] = 0; 114c8e949b3Sksagiyam break; 115c8e949b3Sksagiyam case 1: 116c8e949b3Sksagiyam A[0] = 3; 117c8e949b3Sksagiyam B[0] = 2; 118c8e949b3Sksagiyam break; 119c8e949b3Sksagiyam case 2: 120c8e949b3Sksagiyam A[0] = 3; 1219371c9d4SSatish Balay B[0] = 0; 1229371c9d4SSatish Balay B[1] = 3; 123c8e949b3Sksagiyam break; 124*d71ae5a4SJacob Faibussowitsch default: 125*d71ae5a4SJacob Faibussowitsch SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_WRONG_MPI_SIZE, "Must run with 3 MPI processes"); 126c8e949b3Sksagiyam } 127c8e949b3Sksagiyam break; 128c8e949b3Sksagiyam case 1: 129c8e949b3Sksagiyam N = 4; 130c8e949b3Sksagiyam n = PETSC_DECIDE; 131c8e949b3Sksagiyam switch (rank) { 1329371c9d4SSatish Balay case 0: 1339371c9d4SSatish Balay nA = 3; 1349371c9d4SSatish Balay offsetA = 100; 1359371c9d4SSatish Balay break; 1369371c9d4SSatish Balay case 1: 1379371c9d4SSatish Balay nA = 1; 1389371c9d4SSatish Balay offsetA = 200; 1399371c9d4SSatish Balay break; 1409371c9d4SSatish Balay case 2: 1419371c9d4SSatish Balay nA = 1; 1429371c9d4SSatish Balay offsetA = 300; 1439371c9d4SSatish Balay break; 144*d71ae5a4SJacob Faibussowitsch default: 145*d71ae5a4SJacob Faibussowitsch SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_WRONG_MPI_SIZE, "Must run with 3 MPI processes"); 146c8e949b3Sksagiyam } 1479566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(nA, &A)); 148c8e949b3Sksagiyam switch (rank) { 149c8e949b3Sksagiyam case 0: 1509371c9d4SSatish Balay A[0] = 1; 1519371c9d4SSatish Balay A[1] = 0; 1529371c9d4SSatish Balay A[2] = 2; 153c8e949b3Sksagiyam break; 154*d71ae5a4SJacob Faibussowitsch case 1: 155*d71ae5a4SJacob Faibussowitsch A[0] = 3; 156*d71ae5a4SJacob Faibussowitsch break; 157*d71ae5a4SJacob Faibussowitsch case 2: 158*d71ae5a4SJacob Faibussowitsch A[0] = 3; 159*d71ae5a4SJacob Faibussowitsch break; 160*d71ae5a4SJacob Faibussowitsch default: 161*d71ae5a4SJacob Faibussowitsch SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_WRONG_MPI_SIZE, "Must run with 3 MPI processes"); 162c8e949b3Sksagiyam } 163c8e949b3Sksagiyam nB = nA; 164c8e949b3Sksagiyam B = A; 165c8e949b3Sksagiyam offsetB = offsetA; 166c8e949b3Sksagiyam break; 167c8e949b3Sksagiyam case 2: 168c8e949b3Sksagiyam N = 4; 169c8e949b3Sksagiyam n = PETSC_DECIDE; 170c8e949b3Sksagiyam switch (rank) { 1719371c9d4SSatish Balay case 0: 1729371c9d4SSatish Balay nA = 2; 1739371c9d4SSatish Balay offsetA = 100; 1749371c9d4SSatish Balay nB = 1; 1759371c9d4SSatish Balay offsetB = 400; 1769371c9d4SSatish Balay break; 1779371c9d4SSatish Balay case 1: 1789371c9d4SSatish Balay nA = 1; 1799371c9d4SSatish Balay offsetA = 200; 1809371c9d4SSatish Balay nB = 1; 1819371c9d4SSatish Balay offsetB = 500; 1829371c9d4SSatish Balay break; 1839371c9d4SSatish Balay case 2: 1849371c9d4SSatish Balay nA = 1; 1859371c9d4SSatish Balay offsetA = 300; 1869371c9d4SSatish Balay nB = 2; 1879371c9d4SSatish Balay offsetB = 600; 1889371c9d4SSatish Balay break; 189*d71ae5a4SJacob Faibussowitsch default: 190*d71ae5a4SJacob Faibussowitsch SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_WRONG_MPI_SIZE, "Must run with 3 MPI processes"); 191c8e949b3Sksagiyam } 1929566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(nA, &A)); 1939566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(nB, &B)); 194c8e949b3Sksagiyam switch (rank) { 195c8e949b3Sksagiyam case 0: 1969371c9d4SSatish Balay A[0] = 0; 1979371c9d4SSatish Balay A[1] = 2; 198c8e949b3Sksagiyam B[0] = 0; 199c8e949b3Sksagiyam break; 200c8e949b3Sksagiyam case 1: 201c8e949b3Sksagiyam A[0] = 3; 202c8e949b3Sksagiyam B[0] = 2; 203c8e949b3Sksagiyam break; 204c8e949b3Sksagiyam case 2: 205c8e949b3Sksagiyam A[0] = 3; 2069371c9d4SSatish Balay B[0] = 0; 2079371c9d4SSatish Balay B[1] = 3; 208c8e949b3Sksagiyam break; 209*d71ae5a4SJacob Faibussowitsch default: 210*d71ae5a4SJacob Faibussowitsch SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_WRONG_MPI_SIZE, "Must run with 3 MPI processes"); 211c8e949b3Sksagiyam } 212c8e949b3Sksagiyam break; 213c8e949b3Sksagiyam } 2149566063dSJacob Faibussowitsch PetscCall(PetscLayoutCreate(PETSC_COMM_WORLD, &layout)); 2159566063dSJacob Faibussowitsch PetscCall(PetscLayoutSetSize(layout, N)); 2169566063dSJacob Faibussowitsch PetscCall(PetscLayoutSetLocalSize(layout, n)); 2179566063dSJacob Faibussowitsch PetscCall(PetscLayoutSetBlockSize(layout, 1)); 2189566063dSJacob Faibussowitsch PetscCall(PetscSFCreateByMatchingIndices(layout, nA, A, NULL, offsetA, nB, B, NULL, offsetB, NULL, &sf)); 2199566063dSJacob Faibussowitsch PetscCall(PetscLayoutDestroy(&layout)); 2209566063dSJacob Faibussowitsch PetscCall(PetscFree(A)); 2219566063dSJacob Faibussowitsch if (testnum != 1) PetscCall(PetscFree(B)); 2229566063dSJacob Faibussowitsch PetscCall(PetscObjectSetName((PetscObject)sf, "sf")); 2239566063dSJacob Faibussowitsch PetscCall(PetscSFView(sf, NULL)); 2249566063dSJacob Faibussowitsch PetscCall(PetscSFDestroy(&sf)); 225c8e949b3Sksagiyam 2269566063dSJacob Faibussowitsch PetscCall(PetscFinalize()); 227b122ec5aSJacob Faibussowitsch return 0; 228c8e949b3Sksagiyam } 229c8e949b3Sksagiyam 230c8e949b3Sksagiyam /*TEST 231c8e949b3Sksagiyam 232c8e949b3Sksagiyam test: 233c8e949b3Sksagiyam suffix: 0 234c8e949b3Sksagiyam nsize: 3 235c8e949b3Sksagiyam args: -testnum 0 236c8e949b3Sksagiyam 237c8e949b3Sksagiyam test: 238c8e949b3Sksagiyam suffix: 1 239c8e949b3Sksagiyam nsize: 3 240c8e949b3Sksagiyam args: -testnum 1 241c8e949b3Sksagiyam 242c8e949b3Sksagiyam test: 243c8e949b3Sksagiyam suffix: 2 244c8e949b3Sksagiyam nsize: 3 245c8e949b3Sksagiyam args: -testnum 2 246c8e949b3Sksagiyam 247c8e949b3Sksagiyam TEST*/ 248