1*c8e949b3Sksagiyam static char help[]= "Test PetscSFCreateByMatchingIndices\n\n"; 2*c8e949b3Sksagiyam 3*c8e949b3Sksagiyam #include <petsc.h> 4*c8e949b3Sksagiyam #include <petscsf.h> 5*c8e949b3Sksagiyam 6*c8e949b3Sksagiyam /* Test PetscSFCreateByMatchingIndices. 7*c8e949b3Sksagiyam 8*c8e949b3Sksagiyam testnum 0: 9*c8e949b3Sksagiyam 10*c8e949b3Sksagiyam rank : 0 1 2 11*c8e949b3Sksagiyam numRootIndices : 3 1 1 12*c8e949b3Sksagiyam rootIndices : [1 0 2] [3] [3] 13*c8e949b3Sksagiyam rootLocalOffset : 100 200 300 14*c8e949b3Sksagiyam layout : [0 1] [2] [3] 15*c8e949b3Sksagiyam numLeafIndices : 1 1 2 16*c8e949b3Sksagiyam leafIndices : [0] [2] [0 3] 17*c8e949b3Sksagiyam leafLocalOffset : 400 500 600 18*c8e949b3Sksagiyam 19*c8e949b3Sksagiyam would build the following SF: 20*c8e949b3Sksagiyam 21*c8e949b3Sksagiyam [0] 400 <- (0,101) 22*c8e949b3Sksagiyam [1] 500 <- (0,102) 23*c8e949b3Sksagiyam [2] 600 <- (0,101) 24*c8e949b3Sksagiyam [2] 601 <- (2,300) 25*c8e949b3Sksagiyam 26*c8e949b3Sksagiyam testnum 1: 27*c8e949b3Sksagiyam 28*c8e949b3Sksagiyam rank : 0 1 2 29*c8e949b3Sksagiyam numRootIndices : 3 1 1 30*c8e949b3Sksagiyam rootIndices : [1 0 2] [3] [3] 31*c8e949b3Sksagiyam rootLocalOffset : 100 200 300 32*c8e949b3Sksagiyam layout : [0 1] [2] [3] 33*c8e949b3Sksagiyam numLeafIndices : numRootIndices numRootIndices numRootIndices 34*c8e949b3Sksagiyam leafIndices : rootIndices rootIndices rootIndices 35*c8e949b3Sksagiyam leafLocalOffset : rootLocalOffset rootLocalOffset rootLocalOffset 36*c8e949b3Sksagiyam 37*c8e949b3Sksagiyam would build the following SF: 38*c8e949b3Sksagiyam 39*c8e949b3Sksagiyam [1] 200 <- (2,300) 40*c8e949b3Sksagiyam 41*c8e949b3Sksagiyam testnum 2: 42*c8e949b3Sksagiyam 43*c8e949b3Sksagiyam No one claims ownership of global index 1, but no one needs it. 44*c8e949b3Sksagiyam 45*c8e949b3Sksagiyam rank : 0 1 2 46*c8e949b3Sksagiyam numRootIndices : 2 1 1 47*c8e949b3Sksagiyam rootIndices : [0 2] [3] [3] 48*c8e949b3Sksagiyam rootLocalOffset : 100 200 300 49*c8e949b3Sksagiyam layout : [0 1] [2] [3] 50*c8e949b3Sksagiyam numLeafIndices : 1 1 2 51*c8e949b3Sksagiyam leafIndices : [0] [2] [0 3] 52*c8e949b3Sksagiyam leafLocalOffset : 400 500 600 53*c8e949b3Sksagiyam 54*c8e949b3Sksagiyam would build the following SF: 55*c8e949b3Sksagiyam 56*c8e949b3Sksagiyam [0] 400 <- (0,100) 57*c8e949b3Sksagiyam [1] 500 <- (0,101) 58*c8e949b3Sksagiyam [2] 600 <- (0,100) 59*c8e949b3Sksagiyam [2] 601 <- (2,300) 60*c8e949b3Sksagiyam 61*c8e949b3Sksagiyam */ 62*c8e949b3Sksagiyam 63*c8e949b3Sksagiyam int main(int argc, char **argv) 64*c8e949b3Sksagiyam { 65*c8e949b3Sksagiyam PetscSF sf; 66*c8e949b3Sksagiyam PetscLayout layout; 67*c8e949b3Sksagiyam PetscInt N, n; 68*c8e949b3Sksagiyam PetscInt nA=-1, *A, offsetA=-1; 69*c8e949b3Sksagiyam PetscInt nB=-1, *B, offsetB=-1; 70*c8e949b3Sksagiyam PetscMPIInt size, rank; 71*c8e949b3Sksagiyam PetscInt testnum; 72*c8e949b3Sksagiyam PetscErrorCode ierr; 73*c8e949b3Sksagiyam 74*c8e949b3Sksagiyam ierr = PetscInitialize(&argc,&argv,NULL,help);if (ierr) return ierr; 75*c8e949b3Sksagiyam ierr = PetscOptionsGetInt(NULL,NULL, "-testnum", &testnum, NULL);CHKERRQ(ierr); 76*c8e949b3Sksagiyam ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRMPI(ierr); 77*c8e949b3Sksagiyam ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRMPI(ierr); 78*c8e949b3Sksagiyam if (size != 3) SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_WRONG_MPI_SIZE,"Must run with 3 MPI processes"); 79*c8e949b3Sksagiyam 80*c8e949b3Sksagiyam switch (testnum) { 81*c8e949b3Sksagiyam case 0: 82*c8e949b3Sksagiyam N = 4; 83*c8e949b3Sksagiyam n = PETSC_DECIDE; 84*c8e949b3Sksagiyam switch (rank) { 85*c8e949b3Sksagiyam case 0: nA = 3; offsetA = 100; nB = 1; offsetB = 400; break; 86*c8e949b3Sksagiyam case 1: nA = 1; offsetA = 200; nB = 1; offsetB = 500; break; 87*c8e949b3Sksagiyam case 2: nA = 1; offsetA = 300; nB = 2; offsetB = 600; break; 88*c8e949b3Sksagiyam default: SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_WRONG_MPI_SIZE,"Must run with 3 MPI processes"); 89*c8e949b3Sksagiyam } 90*c8e949b3Sksagiyam ierr = PetscMalloc1(nA, &A);CHKERRQ(ierr); 91*c8e949b3Sksagiyam ierr = PetscMalloc1(nB, &B);CHKERRQ(ierr); 92*c8e949b3Sksagiyam switch (rank) { 93*c8e949b3Sksagiyam case 0: 94*c8e949b3Sksagiyam A[0] = 1; A[1] = 0; A[2] = 2; 95*c8e949b3Sksagiyam B[0] = 0; 96*c8e949b3Sksagiyam break; 97*c8e949b3Sksagiyam case 1: 98*c8e949b3Sksagiyam A[0] = 3; 99*c8e949b3Sksagiyam B[0] = 2; 100*c8e949b3Sksagiyam break; 101*c8e949b3Sksagiyam case 2: 102*c8e949b3Sksagiyam A[0] = 3; 103*c8e949b3Sksagiyam B[0] = 0; B[1] = 3; 104*c8e949b3Sksagiyam break; 105*c8e949b3Sksagiyam default: SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_WRONG_MPI_SIZE,"Must run with 3 MPI processes"); 106*c8e949b3Sksagiyam } 107*c8e949b3Sksagiyam break; 108*c8e949b3Sksagiyam case 1: 109*c8e949b3Sksagiyam N = 4; 110*c8e949b3Sksagiyam n = PETSC_DECIDE; 111*c8e949b3Sksagiyam switch (rank) { 112*c8e949b3Sksagiyam case 0: nA = 3; offsetA = 100; break; 113*c8e949b3Sksagiyam case 1: nA = 1; offsetA = 200; break; 114*c8e949b3Sksagiyam case 2: nA = 1; offsetA = 300; break; 115*c8e949b3Sksagiyam default: SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_WRONG_MPI_SIZE,"Must run with 3 MPI processes"); 116*c8e949b3Sksagiyam } 117*c8e949b3Sksagiyam ierr = PetscMalloc1(nA, &A);CHKERRQ(ierr); 118*c8e949b3Sksagiyam switch (rank) { 119*c8e949b3Sksagiyam case 0: 120*c8e949b3Sksagiyam A[0] = 1; A[1] = 0; A[2] = 2; 121*c8e949b3Sksagiyam break; 122*c8e949b3Sksagiyam case 1: 123*c8e949b3Sksagiyam A[0] = 3; 124*c8e949b3Sksagiyam break; 125*c8e949b3Sksagiyam case 2: 126*c8e949b3Sksagiyam A[0] = 3; 127*c8e949b3Sksagiyam break; 128*c8e949b3Sksagiyam default: SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_WRONG_MPI_SIZE,"Must run with 3 MPI processes"); 129*c8e949b3Sksagiyam } 130*c8e949b3Sksagiyam nB = nA; 131*c8e949b3Sksagiyam B = A; 132*c8e949b3Sksagiyam offsetB = offsetA; 133*c8e949b3Sksagiyam break; 134*c8e949b3Sksagiyam case 2: 135*c8e949b3Sksagiyam N = 4; 136*c8e949b3Sksagiyam n = PETSC_DECIDE; 137*c8e949b3Sksagiyam switch (rank) { 138*c8e949b3Sksagiyam case 0: nA = 2; offsetA = 100; nB = 1; offsetB = 400; break; 139*c8e949b3Sksagiyam case 1: nA = 1; offsetA = 200; nB = 1; offsetB = 500; break; 140*c8e949b3Sksagiyam case 2: nA = 1; offsetA = 300; nB = 2; offsetB = 600; break; 141*c8e949b3Sksagiyam default: SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_WRONG_MPI_SIZE,"Must run with 3 MPI processes"); 142*c8e949b3Sksagiyam } 143*c8e949b3Sksagiyam ierr = PetscMalloc1(nA, &A);CHKERRQ(ierr); 144*c8e949b3Sksagiyam ierr = PetscMalloc1(nB, &B);CHKERRQ(ierr); 145*c8e949b3Sksagiyam switch (rank) { 146*c8e949b3Sksagiyam case 0: 147*c8e949b3Sksagiyam A[0] = 0; A[1] = 2; 148*c8e949b3Sksagiyam B[0] = 0; 149*c8e949b3Sksagiyam break; 150*c8e949b3Sksagiyam case 1: 151*c8e949b3Sksagiyam A[0] = 3; 152*c8e949b3Sksagiyam B[0] = 2; 153*c8e949b3Sksagiyam break; 154*c8e949b3Sksagiyam case 2: 155*c8e949b3Sksagiyam A[0] = 3; 156*c8e949b3Sksagiyam B[0] = 0; B[1] = 3; 157*c8e949b3Sksagiyam break; 158*c8e949b3Sksagiyam default: SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_WRONG_MPI_SIZE,"Must run with 3 MPI processes"); 159*c8e949b3Sksagiyam } 160*c8e949b3Sksagiyam break; 161*c8e949b3Sksagiyam } 162*c8e949b3Sksagiyam ierr = PetscLayoutCreate(PETSC_COMM_WORLD, &layout);CHKERRQ(ierr); 163*c8e949b3Sksagiyam ierr = PetscLayoutSetSize(layout, N);CHKERRQ(ierr); 164*c8e949b3Sksagiyam ierr = PetscLayoutSetLocalSize(layout, n);CHKERRQ(ierr); 165*c8e949b3Sksagiyam ierr = PetscLayoutSetBlockSize(layout, 1);CHKERRQ(ierr); 166*c8e949b3Sksagiyam ierr = PetscSFCreateByMatchingIndices(layout, nA, A, NULL, offsetA, nB, B, NULL, offsetB, NULL, &sf);CHKERRQ(ierr); 167*c8e949b3Sksagiyam ierr = PetscLayoutDestroy(&layout);CHKERRQ(ierr); 168*c8e949b3Sksagiyam ierr = PetscFree(A);CHKERRQ(ierr); 169*c8e949b3Sksagiyam if (testnum != 1) {ierr = PetscFree(B);CHKERRQ(ierr);} 170*c8e949b3Sksagiyam ierr = PetscObjectSetName((PetscObject)sf, "sf");CHKERRQ(ierr); 171*c8e949b3Sksagiyam ierr = PetscSFView(sf, NULL);CHKERRQ(ierr); 172*c8e949b3Sksagiyam ierr = PetscSFDestroy(&sf);CHKERRQ(ierr); 173*c8e949b3Sksagiyam 174*c8e949b3Sksagiyam ierr = PetscFinalize(); 175*c8e949b3Sksagiyam return ierr; 176*c8e949b3Sksagiyam } 177*c8e949b3Sksagiyam 178*c8e949b3Sksagiyam /*TEST 179*c8e949b3Sksagiyam 180*c8e949b3Sksagiyam test: 181*c8e949b3Sksagiyam suffix: 0 182*c8e949b3Sksagiyam nsize: 3 183*c8e949b3Sksagiyam args: -testnum 0 184*c8e949b3Sksagiyam 185*c8e949b3Sksagiyam test: 186*c8e949b3Sksagiyam suffix: 1 187*c8e949b3Sksagiyam nsize: 3 188*c8e949b3Sksagiyam args: -testnum 1 189*c8e949b3Sksagiyam 190*c8e949b3Sksagiyam test: 191*c8e949b3Sksagiyam suffix: 2 192*c8e949b3Sksagiyam nsize: 3 193*c8e949b3Sksagiyam args: -testnum 2 194*c8e949b3Sksagiyam 195*c8e949b3Sksagiyam TEST*/ 196