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