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*9371c9d4SSatish Balay int main(int argc, char **argv) { 64c8e949b3Sksagiyam PetscSF sf; 65c8e949b3Sksagiyam PetscLayout layout; 66c8e949b3Sksagiyam PetscInt N, n; 67c8e949b3Sksagiyam PetscInt nA = -1, *A, offsetA = -1; 68c8e949b3Sksagiyam PetscInt nB = -1, *B, offsetB = -1; 69c8e949b3Sksagiyam PetscMPIInt size, rank; 70c8e949b3Sksagiyam PetscInt testnum; 71c8e949b3Sksagiyam 72327415f7SBarry Smith PetscFunctionBeginUser; 739566063dSJacob Faibussowitsch PetscCall(PetscInitialize(&argc, &argv, NULL, help)); 749566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetInt(NULL, NULL, "-testnum", &testnum, NULL)); 759566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_size(PETSC_COMM_WORLD, &size)); 769566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank)); 7708401ef6SPierre Jolivet PetscCheck(size == 3, PETSC_COMM_WORLD, PETSC_ERR_WRONG_MPI_SIZE, "Must run with 3 MPI processes"); 78c8e949b3Sksagiyam 79c8e949b3Sksagiyam switch (testnum) { 80c8e949b3Sksagiyam case 0: 81c8e949b3Sksagiyam N = 4; 82c8e949b3Sksagiyam n = PETSC_DECIDE; 83c8e949b3Sksagiyam switch (rank) { 84*9371c9d4SSatish Balay case 0: 85*9371c9d4SSatish Balay nA = 3; 86*9371c9d4SSatish Balay offsetA = 100; 87*9371c9d4SSatish Balay nB = 1; 88*9371c9d4SSatish Balay offsetB = 400; 89*9371c9d4SSatish Balay break; 90*9371c9d4SSatish Balay case 1: 91*9371c9d4SSatish Balay nA = 1; 92*9371c9d4SSatish Balay offsetA = 200; 93*9371c9d4SSatish Balay nB = 1; 94*9371c9d4SSatish Balay offsetB = 500; 95*9371c9d4SSatish Balay break; 96*9371c9d4SSatish Balay case 2: 97*9371c9d4SSatish Balay nA = 1; 98*9371c9d4SSatish Balay offsetA = 300; 99*9371c9d4SSatish Balay nB = 2; 100*9371c9d4SSatish Balay offsetB = 600; 101*9371c9d4SSatish Balay break; 102c8e949b3Sksagiyam default: SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_WRONG_MPI_SIZE, "Must run with 3 MPI processes"); 103c8e949b3Sksagiyam } 1049566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(nA, &A)); 1059566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(nB, &B)); 106c8e949b3Sksagiyam switch (rank) { 107c8e949b3Sksagiyam case 0: 108*9371c9d4SSatish Balay A[0] = 1; 109*9371c9d4SSatish Balay A[1] = 0; 110*9371c9d4SSatish Balay A[2] = 2; 111c8e949b3Sksagiyam B[0] = 0; 112c8e949b3Sksagiyam break; 113c8e949b3Sksagiyam case 1: 114c8e949b3Sksagiyam A[0] = 3; 115c8e949b3Sksagiyam B[0] = 2; 116c8e949b3Sksagiyam break; 117c8e949b3Sksagiyam case 2: 118c8e949b3Sksagiyam A[0] = 3; 119*9371c9d4SSatish Balay B[0] = 0; 120*9371c9d4SSatish Balay B[1] = 3; 121c8e949b3Sksagiyam break; 122c8e949b3Sksagiyam default: SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_WRONG_MPI_SIZE, "Must run with 3 MPI processes"); 123c8e949b3Sksagiyam } 124c8e949b3Sksagiyam break; 125c8e949b3Sksagiyam case 1: 126c8e949b3Sksagiyam N = 4; 127c8e949b3Sksagiyam n = PETSC_DECIDE; 128c8e949b3Sksagiyam switch (rank) { 129*9371c9d4SSatish Balay case 0: 130*9371c9d4SSatish Balay nA = 3; 131*9371c9d4SSatish Balay offsetA = 100; 132*9371c9d4SSatish Balay break; 133*9371c9d4SSatish Balay case 1: 134*9371c9d4SSatish Balay nA = 1; 135*9371c9d4SSatish Balay offsetA = 200; 136*9371c9d4SSatish Balay break; 137*9371c9d4SSatish Balay case 2: 138*9371c9d4SSatish Balay nA = 1; 139*9371c9d4SSatish Balay offsetA = 300; 140*9371c9d4SSatish Balay break; 141c8e949b3Sksagiyam default: SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_WRONG_MPI_SIZE, "Must run with 3 MPI processes"); 142c8e949b3Sksagiyam } 1439566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(nA, &A)); 144c8e949b3Sksagiyam switch (rank) { 145c8e949b3Sksagiyam case 0: 146*9371c9d4SSatish Balay A[0] = 1; 147*9371c9d4SSatish Balay A[1] = 0; 148*9371c9d4SSatish Balay A[2] = 2; 149c8e949b3Sksagiyam break; 150*9371c9d4SSatish Balay case 1: A[0] = 3; break; 151*9371c9d4SSatish Balay case 2: A[0] = 3; break; 152c8e949b3Sksagiyam default: SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_WRONG_MPI_SIZE, "Must run with 3 MPI processes"); 153c8e949b3Sksagiyam } 154c8e949b3Sksagiyam nB = nA; 155c8e949b3Sksagiyam B = A; 156c8e949b3Sksagiyam offsetB = offsetA; 157c8e949b3Sksagiyam break; 158c8e949b3Sksagiyam case 2: 159c8e949b3Sksagiyam N = 4; 160c8e949b3Sksagiyam n = PETSC_DECIDE; 161c8e949b3Sksagiyam switch (rank) { 162*9371c9d4SSatish Balay case 0: 163*9371c9d4SSatish Balay nA = 2; 164*9371c9d4SSatish Balay offsetA = 100; 165*9371c9d4SSatish Balay nB = 1; 166*9371c9d4SSatish Balay offsetB = 400; 167*9371c9d4SSatish Balay break; 168*9371c9d4SSatish Balay case 1: 169*9371c9d4SSatish Balay nA = 1; 170*9371c9d4SSatish Balay offsetA = 200; 171*9371c9d4SSatish Balay nB = 1; 172*9371c9d4SSatish Balay offsetB = 500; 173*9371c9d4SSatish Balay break; 174*9371c9d4SSatish Balay case 2: 175*9371c9d4SSatish Balay nA = 1; 176*9371c9d4SSatish Balay offsetA = 300; 177*9371c9d4SSatish Balay nB = 2; 178*9371c9d4SSatish Balay offsetB = 600; 179*9371c9d4SSatish Balay break; 180c8e949b3Sksagiyam default: SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_WRONG_MPI_SIZE, "Must run with 3 MPI processes"); 181c8e949b3Sksagiyam } 1829566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(nA, &A)); 1839566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(nB, &B)); 184c8e949b3Sksagiyam switch (rank) { 185c8e949b3Sksagiyam case 0: 186*9371c9d4SSatish Balay A[0] = 0; 187*9371c9d4SSatish Balay A[1] = 2; 188c8e949b3Sksagiyam B[0] = 0; 189c8e949b3Sksagiyam break; 190c8e949b3Sksagiyam case 1: 191c8e949b3Sksagiyam A[0] = 3; 192c8e949b3Sksagiyam B[0] = 2; 193c8e949b3Sksagiyam break; 194c8e949b3Sksagiyam case 2: 195c8e949b3Sksagiyam A[0] = 3; 196*9371c9d4SSatish Balay B[0] = 0; 197*9371c9d4SSatish Balay B[1] = 3; 198c8e949b3Sksagiyam break; 199c8e949b3Sksagiyam default: SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_WRONG_MPI_SIZE, "Must run with 3 MPI processes"); 200c8e949b3Sksagiyam } 201c8e949b3Sksagiyam break; 202c8e949b3Sksagiyam } 2039566063dSJacob Faibussowitsch PetscCall(PetscLayoutCreate(PETSC_COMM_WORLD, &layout)); 2049566063dSJacob Faibussowitsch PetscCall(PetscLayoutSetSize(layout, N)); 2059566063dSJacob Faibussowitsch PetscCall(PetscLayoutSetLocalSize(layout, n)); 2069566063dSJacob Faibussowitsch PetscCall(PetscLayoutSetBlockSize(layout, 1)); 2079566063dSJacob Faibussowitsch PetscCall(PetscSFCreateByMatchingIndices(layout, nA, A, NULL, offsetA, nB, B, NULL, offsetB, NULL, &sf)); 2089566063dSJacob Faibussowitsch PetscCall(PetscLayoutDestroy(&layout)); 2099566063dSJacob Faibussowitsch PetscCall(PetscFree(A)); 2109566063dSJacob Faibussowitsch if (testnum != 1) PetscCall(PetscFree(B)); 2119566063dSJacob Faibussowitsch PetscCall(PetscObjectSetName((PetscObject)sf, "sf")); 2129566063dSJacob Faibussowitsch PetscCall(PetscSFView(sf, NULL)); 2139566063dSJacob Faibussowitsch PetscCall(PetscSFDestroy(&sf)); 214c8e949b3Sksagiyam 2159566063dSJacob Faibussowitsch PetscCall(PetscFinalize()); 216b122ec5aSJacob Faibussowitsch return 0; 217c8e949b3Sksagiyam } 218c8e949b3Sksagiyam 219c8e949b3Sksagiyam /*TEST 220c8e949b3Sksagiyam 221c8e949b3Sksagiyam test: 222c8e949b3Sksagiyam suffix: 0 223c8e949b3Sksagiyam nsize: 3 224c8e949b3Sksagiyam args: -testnum 0 225c8e949b3Sksagiyam 226c8e949b3Sksagiyam test: 227c8e949b3Sksagiyam suffix: 1 228c8e949b3Sksagiyam nsize: 3 229c8e949b3Sksagiyam args: -testnum 1 230c8e949b3Sksagiyam 231c8e949b3Sksagiyam test: 232c8e949b3Sksagiyam suffix: 2 233c8e949b3Sksagiyam nsize: 3 234c8e949b3Sksagiyam args: -testnum 2 235c8e949b3Sksagiyam 236c8e949b3Sksagiyam TEST*/ 237