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 63c8e949b3Sksagiyam int main(int argc, char **argv) 64c8e949b3Sksagiyam { 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 73*327415f7SBarry 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) { 85c8e949b3Sksagiyam case 0: nA = 3; offsetA = 100; nB = 1; offsetB = 400; break; 86c8e949b3Sksagiyam case 1: nA = 1; offsetA = 200; nB = 1; offsetB = 500; break; 87c8e949b3Sksagiyam case 2: nA = 1; offsetA = 300; nB = 2; offsetB = 600; break; 88c8e949b3Sksagiyam default: SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_WRONG_MPI_SIZE,"Must run with 3 MPI processes"); 89c8e949b3Sksagiyam } 909566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(nA, &A)); 919566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(nB, &B)); 92c8e949b3Sksagiyam switch (rank) { 93c8e949b3Sksagiyam case 0: 94c8e949b3Sksagiyam A[0] = 1; A[1] = 0; A[2] = 2; 95c8e949b3Sksagiyam B[0] = 0; 96c8e949b3Sksagiyam break; 97c8e949b3Sksagiyam case 1: 98c8e949b3Sksagiyam A[0] = 3; 99c8e949b3Sksagiyam B[0] = 2; 100c8e949b3Sksagiyam break; 101c8e949b3Sksagiyam case 2: 102c8e949b3Sksagiyam A[0] = 3; 103c8e949b3Sksagiyam B[0] = 0; B[1] = 3; 104c8e949b3Sksagiyam break; 105c8e949b3Sksagiyam default: SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_WRONG_MPI_SIZE,"Must run with 3 MPI processes"); 106c8e949b3Sksagiyam } 107c8e949b3Sksagiyam break; 108c8e949b3Sksagiyam case 1: 109c8e949b3Sksagiyam N = 4; 110c8e949b3Sksagiyam n = PETSC_DECIDE; 111c8e949b3Sksagiyam switch (rank) { 112c8e949b3Sksagiyam case 0: nA = 3; offsetA = 100; break; 113c8e949b3Sksagiyam case 1: nA = 1; offsetA = 200; break; 114c8e949b3Sksagiyam case 2: nA = 1; offsetA = 300; break; 115c8e949b3Sksagiyam default: SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_WRONG_MPI_SIZE,"Must run with 3 MPI processes"); 116c8e949b3Sksagiyam } 1179566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(nA, &A)); 118c8e949b3Sksagiyam switch (rank) { 119c8e949b3Sksagiyam case 0: 120c8e949b3Sksagiyam A[0] = 1; A[1] = 0; A[2] = 2; 121c8e949b3Sksagiyam break; 122c8e949b3Sksagiyam case 1: 123c8e949b3Sksagiyam A[0] = 3; 124c8e949b3Sksagiyam break; 125c8e949b3Sksagiyam case 2: 126c8e949b3Sksagiyam A[0] = 3; 127c8e949b3Sksagiyam break; 128c8e949b3Sksagiyam default: SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_WRONG_MPI_SIZE,"Must run with 3 MPI processes"); 129c8e949b3Sksagiyam } 130c8e949b3Sksagiyam nB = nA; 131c8e949b3Sksagiyam B = A; 132c8e949b3Sksagiyam offsetB = offsetA; 133c8e949b3Sksagiyam break; 134c8e949b3Sksagiyam case 2: 135c8e949b3Sksagiyam N = 4; 136c8e949b3Sksagiyam n = PETSC_DECIDE; 137c8e949b3Sksagiyam switch (rank) { 138c8e949b3Sksagiyam case 0: nA = 2; offsetA = 100; nB = 1; offsetB = 400; break; 139c8e949b3Sksagiyam case 1: nA = 1; offsetA = 200; nB = 1; offsetB = 500; break; 140c8e949b3Sksagiyam case 2: nA = 1; offsetA = 300; nB = 2; offsetB = 600; 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)); 1449566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(nB, &B)); 145c8e949b3Sksagiyam switch (rank) { 146c8e949b3Sksagiyam case 0: 147c8e949b3Sksagiyam A[0] = 0; A[1] = 2; 148c8e949b3Sksagiyam B[0] = 0; 149c8e949b3Sksagiyam break; 150c8e949b3Sksagiyam case 1: 151c8e949b3Sksagiyam A[0] = 3; 152c8e949b3Sksagiyam B[0] = 2; 153c8e949b3Sksagiyam break; 154c8e949b3Sksagiyam case 2: 155c8e949b3Sksagiyam A[0] = 3; 156c8e949b3Sksagiyam B[0] = 0; B[1] = 3; 157c8e949b3Sksagiyam break; 158c8e949b3Sksagiyam default: SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_WRONG_MPI_SIZE,"Must run with 3 MPI processes"); 159c8e949b3Sksagiyam } 160c8e949b3Sksagiyam break; 161c8e949b3Sksagiyam } 1629566063dSJacob Faibussowitsch PetscCall(PetscLayoutCreate(PETSC_COMM_WORLD, &layout)); 1639566063dSJacob Faibussowitsch PetscCall(PetscLayoutSetSize(layout, N)); 1649566063dSJacob Faibussowitsch PetscCall(PetscLayoutSetLocalSize(layout, n)); 1659566063dSJacob Faibussowitsch PetscCall(PetscLayoutSetBlockSize(layout, 1)); 1669566063dSJacob Faibussowitsch PetscCall(PetscSFCreateByMatchingIndices(layout, nA, A, NULL, offsetA, nB, B, NULL, offsetB, NULL, &sf)); 1679566063dSJacob Faibussowitsch PetscCall(PetscLayoutDestroy(&layout)); 1689566063dSJacob Faibussowitsch PetscCall(PetscFree(A)); 1699566063dSJacob Faibussowitsch if (testnum != 1) PetscCall(PetscFree(B)); 1709566063dSJacob Faibussowitsch PetscCall(PetscObjectSetName((PetscObject)sf, "sf")); 1719566063dSJacob Faibussowitsch PetscCall(PetscSFView(sf, NULL)); 1729566063dSJacob Faibussowitsch PetscCall(PetscSFDestroy(&sf)); 173c8e949b3Sksagiyam 1749566063dSJacob Faibussowitsch PetscCall(PetscFinalize()); 175b122ec5aSJacob Faibussowitsch return 0; 176c8e949b3Sksagiyam } 177c8e949b3Sksagiyam 178c8e949b3Sksagiyam /*TEST 179c8e949b3Sksagiyam 180c8e949b3Sksagiyam test: 181c8e949b3Sksagiyam suffix: 0 182c8e949b3Sksagiyam nsize: 3 183c8e949b3Sksagiyam args: -testnum 0 184c8e949b3Sksagiyam 185c8e949b3Sksagiyam test: 186c8e949b3Sksagiyam suffix: 1 187c8e949b3Sksagiyam nsize: 3 188c8e949b3Sksagiyam args: -testnum 1 189c8e949b3Sksagiyam 190c8e949b3Sksagiyam test: 191c8e949b3Sksagiyam suffix: 2 192c8e949b3Sksagiyam nsize: 3 193c8e949b3Sksagiyam args: -testnum 2 194c8e949b3Sksagiyam 195c8e949b3Sksagiyam TEST*/ 196