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 PetscErrorCode ierr; 73c8e949b3Sksagiyam 74c8e949b3Sksagiyam ierr = PetscInitialize(&argc,&argv,NULL,help);if (ierr) return ierr; 75*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsGetInt(NULL,NULL, "-testnum", &testnum, NULL)); 76*5f80ce2aSJacob Faibussowitsch CHKERRMPI(MPI_Comm_size(PETSC_COMM_WORLD,&size)); 77*5f80ce2aSJacob Faibussowitsch CHKERRMPI(MPI_Comm_rank(PETSC_COMM_WORLD,&rank)); 782c71b3e2SJacob Faibussowitsch PetscCheckFalse(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 } 90*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscMalloc1(nA, &A)); 91*5f80ce2aSJacob Faibussowitsch CHKERRQ(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 } 117*5f80ce2aSJacob Faibussowitsch CHKERRQ(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 } 143*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscMalloc1(nA, &A)); 144*5f80ce2aSJacob Faibussowitsch CHKERRQ(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 } 162*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscLayoutCreate(PETSC_COMM_WORLD, &layout)); 163*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscLayoutSetSize(layout, N)); 164*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscLayoutSetLocalSize(layout, n)); 165*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscLayoutSetBlockSize(layout, 1)); 166*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscSFCreateByMatchingIndices(layout, nA, A, NULL, offsetA, nB, B, NULL, offsetB, NULL, &sf)); 167*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscLayoutDestroy(&layout)); 168*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscFree(A)); 169*5f80ce2aSJacob Faibussowitsch if (testnum != 1) CHKERRQ(PetscFree(B)); 170*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscObjectSetName((PetscObject)sf, "sf")); 171*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscSFView(sf, NULL)); 172*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscSFDestroy(&sf)); 173c8e949b3Sksagiyam 174c8e949b3Sksagiyam ierr = PetscFinalize(); 175c8e949b3Sksagiyam return ierr; 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