1c4762a1bSJed Brown static const char help[] = "Test MatGetLocalSubMatrix() with multiple levels of nesting.\n\n"; 2c4762a1bSJed Brown 3c4762a1bSJed Brown #include <petscmat.h> 4c4762a1bSJed Brown 5*9371c9d4SSatish Balay int main(int argc, char *argv[]) { 6c4762a1bSJed Brown IS is0a, is0b, is0, is1, isl0a, isl0b, isl0, isl1; 7c4762a1bSJed Brown Mat A, Aexplicit; 8c4762a1bSJed Brown PetscBool usenest; 9c4762a1bSJed Brown PetscMPIInt rank, size; 10c4762a1bSJed Brown PetscInt i, j; 11c4762a1bSJed Brown 12327415f7SBarry Smith PetscFunctionBeginUser; 139566063dSJacob Faibussowitsch PetscCall(PetscInitialize(&argc, &argv, NULL, help)); 149566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank)); 159566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_size(PETSC_COMM_WORLD, &size)); 16c4762a1bSJed Brown 17c4762a1bSJed Brown { 18c4762a1bSJed Brown PetscInt ix0a[1], ix0b[1], ix0[2], ix1[1]; 19c4762a1bSJed Brown 20c4762a1bSJed Brown ix0a[0] = rank * 2 + 0; 21c4762a1bSJed Brown ix0b[0] = rank * 2 + 1; 22*9371c9d4SSatish Balay ix0[0] = rank * 3 + 0; 23*9371c9d4SSatish Balay ix0[1] = rank * 3 + 1; 24c4762a1bSJed Brown ix1[0] = rank * 3 + 2; 259566063dSJacob Faibussowitsch PetscCall(ISCreateGeneral(PETSC_COMM_WORLD, 1, ix0a, PETSC_COPY_VALUES, &is0a)); 269566063dSJacob Faibussowitsch PetscCall(ISCreateGeneral(PETSC_COMM_WORLD, 1, ix0b, PETSC_COPY_VALUES, &is0b)); 279566063dSJacob Faibussowitsch PetscCall(ISCreateGeneral(PETSC_COMM_WORLD, 2, ix0, PETSC_COPY_VALUES, &is0)); 289566063dSJacob Faibussowitsch PetscCall(ISCreateGeneral(PETSC_COMM_WORLD, 1, ix1, PETSC_COPY_VALUES, &is1)); 29c4762a1bSJed Brown } 30c4762a1bSJed Brown { 319566063dSJacob Faibussowitsch PetscCall(ISCreateStride(PETSC_COMM_SELF, 6, 0, 1, &isl0)); 329566063dSJacob Faibussowitsch PetscCall(ISCreateStride(PETSC_COMM_SELF, 3, 0, 1, &isl0a)); 339566063dSJacob Faibussowitsch PetscCall(ISCreateStride(PETSC_COMM_SELF, 3, 3, 1, &isl0b)); 349566063dSJacob Faibussowitsch PetscCall(ISCreateStride(PETSC_COMM_SELF, 3, 6, 1, &isl1)); 35c4762a1bSJed Brown } 36c4762a1bSJed Brown 37c4762a1bSJed Brown usenest = PETSC_FALSE; 389566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetBool(NULL, NULL, "-nest", &usenest, NULL)); 39c4762a1bSJed Brown if (usenest) { 40c4762a1bSJed Brown ISLocalToGlobalMapping l2g; 41c4762a1bSJed Brown PetscInt l2gind[3]; 42c4762a1bSJed Brown Mat B[9]; 43c4762a1bSJed Brown 44*9371c9d4SSatish Balay l2gind[0] = (rank - 1 + size) % size; 45*9371c9d4SSatish Balay l2gind[1] = rank; 46*9371c9d4SSatish Balay l2gind[2] = (rank + 1) % size; 479566063dSJacob Faibussowitsch PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD, 1, 3, l2gind, PETSC_COPY_VALUES, &l2g)); 48c4762a1bSJed Brown for (i = 0; i < 9; i++) { 499566063dSJacob Faibussowitsch PetscCall(MatCreateAIJ(PETSC_COMM_WORLD, 1, 1, PETSC_DECIDE, PETSC_DECIDE, PETSC_DECIDE, NULL, PETSC_DECIDE, NULL, &B[i])); 509566063dSJacob Faibussowitsch PetscCall(MatSetUp(B[i])); 519566063dSJacob Faibussowitsch PetscCall(MatSetLocalToGlobalMapping(B[i], l2g, l2g)); 52c4762a1bSJed Brown } 53c4762a1bSJed Brown { 54c4762a1bSJed Brown IS isx[2]; 55c4762a1bSJed Brown Mat Bx00[4], Bx01[2], Bx10[2]; 56c4762a1bSJed Brown Mat B00, B01, B10; 57c4762a1bSJed Brown 58*9371c9d4SSatish Balay isx[0] = is0a; 59*9371c9d4SSatish Balay isx[1] = is0b; 60*9371c9d4SSatish Balay Bx00[0] = B[0]; 61*9371c9d4SSatish Balay Bx00[1] = B[1]; 62*9371c9d4SSatish Balay Bx00[2] = B[3]; 63*9371c9d4SSatish Balay Bx00[3] = B[4]; 64*9371c9d4SSatish Balay Bx01[0] = B[2]; 65*9371c9d4SSatish Balay Bx01[1] = B[5]; 66*9371c9d4SSatish Balay Bx10[0] = B[6]; 67*9371c9d4SSatish Balay Bx10[1] = B[7]; 68c4762a1bSJed Brown 699566063dSJacob Faibussowitsch PetscCall(MatCreateNest(PETSC_COMM_WORLD, 2, isx, 2, isx, Bx00, &B00)); 709566063dSJacob Faibussowitsch PetscCall(MatSetUp(B00)); 719566063dSJacob Faibussowitsch PetscCall(MatCreateNest(PETSC_COMM_WORLD, 2, isx, 1, NULL, Bx01, &B01)); 729566063dSJacob Faibussowitsch PetscCall(MatSetUp(B01)); 739566063dSJacob Faibussowitsch PetscCall(MatCreateNest(PETSC_COMM_WORLD, 1, NULL, 2, isx, Bx10, &B10)); 749566063dSJacob Faibussowitsch PetscCall(MatSetUp(B10)); 75c4762a1bSJed Brown { 76c4762a1bSJed Brown Mat By[4]; 77c4762a1bSJed Brown IS isy[2]; 78c4762a1bSJed Brown 79*9371c9d4SSatish Balay By[0] = B00; 80*9371c9d4SSatish Balay By[1] = B01; 81*9371c9d4SSatish Balay By[2] = B10; 82*9371c9d4SSatish Balay By[3] = B[8]; 83*9371c9d4SSatish Balay isy[0] = is0; 84*9371c9d4SSatish Balay isy[1] = is1; 85c4762a1bSJed Brown 869566063dSJacob Faibussowitsch PetscCall(MatCreateNest(PETSC_COMM_WORLD, 2, isy, 2, isy, By, &A)); 879566063dSJacob Faibussowitsch PetscCall(MatSetUp(A)); 88c4762a1bSJed Brown } 899566063dSJacob Faibussowitsch PetscCall(MatDestroy(&B00)); 909566063dSJacob Faibussowitsch PetscCall(MatDestroy(&B01)); 919566063dSJacob Faibussowitsch PetscCall(MatDestroy(&B10)); 92c4762a1bSJed Brown } 939566063dSJacob Faibussowitsch for (i = 0; i < 9; i++) PetscCall(MatDestroy(&B[i])); 949566063dSJacob Faibussowitsch PetscCall(ISLocalToGlobalMappingDestroy(&l2g)); 95c4762a1bSJed Brown } else { 96c4762a1bSJed Brown ISLocalToGlobalMapping l2g; 97c4762a1bSJed Brown PetscInt l2gind[9]; 98*9371c9d4SSatish Balay for (i = 0; i < 3; i++) 99*9371c9d4SSatish Balay for (j = 0; j < 3; j++) l2gind[3 * i + j] = ((rank - 1 + j + size) % size) * 3 + i; 1009566063dSJacob Faibussowitsch PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD, 1, 9, l2gind, PETSC_COPY_VALUES, &l2g)); 1019566063dSJacob Faibussowitsch PetscCall(MatCreateAIJ(PETSC_COMM_WORLD, 3, 3, PETSC_DECIDE, PETSC_DECIDE, PETSC_DECIDE, NULL, PETSC_DECIDE, NULL, &A)); 1029566063dSJacob Faibussowitsch PetscCall(MatSetLocalToGlobalMapping(A, l2g, l2g)); 1039566063dSJacob Faibussowitsch PetscCall(ISLocalToGlobalMappingDestroy(&l2g)); 104c4762a1bSJed Brown } 105c4762a1bSJed Brown 106c4762a1bSJed Brown { 107c4762a1bSJed Brown Mat A00, A11, A0a0a, A0a0b; 1089566063dSJacob Faibussowitsch PetscCall(MatGetLocalSubMatrix(A, isl0, isl0, &A00)); 1099566063dSJacob Faibussowitsch PetscCall(MatGetLocalSubMatrix(A, isl1, isl1, &A11)); 1109566063dSJacob Faibussowitsch PetscCall(MatGetLocalSubMatrix(A00, isl0a, isl0a, &A0a0a)); 1119566063dSJacob Faibussowitsch PetscCall(MatGetLocalSubMatrix(A00, isl0a, isl0b, &A0a0b)); 112c4762a1bSJed Brown 1139566063dSJacob Faibussowitsch PetscCall(MatSetValueLocal(A0a0a, 0, 0, 100 * rank + 1, ADD_VALUES)); 1149566063dSJacob Faibussowitsch PetscCall(MatSetValueLocal(A0a0a, 0, 1, 100 * rank + 2, ADD_VALUES)); 1159566063dSJacob Faibussowitsch PetscCall(MatSetValueLocal(A0a0a, 2, 2, 100 * rank + 9, ADD_VALUES)); 116c4762a1bSJed Brown 1179566063dSJacob Faibussowitsch PetscCall(MatSetValueLocal(A0a0b, 1, 1, 100 * rank + 50 + 5, ADD_VALUES)); 118c4762a1bSJed Brown 1199566063dSJacob Faibussowitsch PetscCall(MatSetValueLocal(A11, 0, 0, 1000 * (rank + 1) + 1, ADD_VALUES)); 1209566063dSJacob Faibussowitsch PetscCall(MatSetValueLocal(A11, 1, 2, 1000 * (rank + 1) + 6, ADD_VALUES)); 121c4762a1bSJed Brown 1229566063dSJacob Faibussowitsch PetscCall(MatRestoreLocalSubMatrix(A00, isl0a, isl0a, &A0a0a)); 1239566063dSJacob Faibussowitsch PetscCall(MatRestoreLocalSubMatrix(A00, isl0a, isl0b, &A0a0b)); 1249566063dSJacob Faibussowitsch PetscCall(MatRestoreLocalSubMatrix(A, isl0, isl0, &A00)); 1259566063dSJacob Faibussowitsch PetscCall(MatRestoreLocalSubMatrix(A, isl1, isl1, &A11)); 126c4762a1bSJed Brown } 1279566063dSJacob Faibussowitsch PetscCall(MatAssemblyBegin(A, MAT_FINAL_ASSEMBLY)); 1289566063dSJacob Faibussowitsch PetscCall(MatAssemblyEnd(A, MAT_FINAL_ASSEMBLY)); 129c4762a1bSJed Brown 1309566063dSJacob Faibussowitsch PetscCall(MatComputeOperator(A, MATAIJ, &Aexplicit)); 1319566063dSJacob Faibussowitsch PetscCall(MatView(Aexplicit, PETSC_VIEWER_STDOUT_WORLD)); 132c4762a1bSJed Brown 1339566063dSJacob Faibussowitsch PetscCall(MatDestroy(&A)); 1349566063dSJacob Faibussowitsch PetscCall(MatDestroy(&Aexplicit)); 1359566063dSJacob Faibussowitsch PetscCall(ISDestroy(&is0a)); 1369566063dSJacob Faibussowitsch PetscCall(ISDestroy(&is0b)); 1379566063dSJacob Faibussowitsch PetscCall(ISDestroy(&is0)); 1389566063dSJacob Faibussowitsch PetscCall(ISDestroy(&is1)); 1399566063dSJacob Faibussowitsch PetscCall(ISDestroy(&isl0a)); 1409566063dSJacob Faibussowitsch PetscCall(ISDestroy(&isl0b)); 1419566063dSJacob Faibussowitsch PetscCall(ISDestroy(&isl0)); 1429566063dSJacob Faibussowitsch PetscCall(ISDestroy(&isl1)); 1439566063dSJacob Faibussowitsch PetscCall(PetscFinalize()); 144b122ec5aSJacob Faibussowitsch return 0; 145c4762a1bSJed Brown } 146c4762a1bSJed Brown 147c4762a1bSJed Brown /*TEST 148c4762a1bSJed Brown 149c4762a1bSJed Brown test: 150c4762a1bSJed Brown nsize: 3 151c4762a1bSJed Brown 152c4762a1bSJed Brown test: 153c4762a1bSJed Brown suffix: nest 154c4762a1bSJed Brown nsize: 3 155c4762a1bSJed Brown args: -nest 156c4762a1bSJed Brown 157c4762a1bSJed Brown TEST*/ 158