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*d71ae5a4SJacob Faibussowitsch int main(int argc, char *argv[]) 6*d71ae5a4SJacob Faibussowitsch { 7c4762a1bSJed Brown IS is0a, is0b, is0, is1, isl0a, isl0b, isl0, isl1; 8c4762a1bSJed Brown Mat A, Aexplicit; 9c4762a1bSJed Brown PetscBool usenest; 10c4762a1bSJed Brown PetscMPIInt rank, size; 11c4762a1bSJed Brown PetscInt i, j; 12c4762a1bSJed Brown 13327415f7SBarry Smith PetscFunctionBeginUser; 149566063dSJacob Faibussowitsch PetscCall(PetscInitialize(&argc, &argv, NULL, help)); 159566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank)); 169566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_size(PETSC_COMM_WORLD, &size)); 17c4762a1bSJed Brown 18c4762a1bSJed Brown { 19c4762a1bSJed Brown PetscInt ix0a[1], ix0b[1], ix0[2], ix1[1]; 20c4762a1bSJed Brown 21c4762a1bSJed Brown ix0a[0] = rank * 2 + 0; 22c4762a1bSJed Brown ix0b[0] = rank * 2 + 1; 239371c9d4SSatish Balay ix0[0] = rank * 3 + 0; 249371c9d4SSatish Balay ix0[1] = rank * 3 + 1; 25c4762a1bSJed Brown ix1[0] = rank * 3 + 2; 269566063dSJacob Faibussowitsch PetscCall(ISCreateGeneral(PETSC_COMM_WORLD, 1, ix0a, PETSC_COPY_VALUES, &is0a)); 279566063dSJacob Faibussowitsch PetscCall(ISCreateGeneral(PETSC_COMM_WORLD, 1, ix0b, PETSC_COPY_VALUES, &is0b)); 289566063dSJacob Faibussowitsch PetscCall(ISCreateGeneral(PETSC_COMM_WORLD, 2, ix0, PETSC_COPY_VALUES, &is0)); 299566063dSJacob Faibussowitsch PetscCall(ISCreateGeneral(PETSC_COMM_WORLD, 1, ix1, PETSC_COPY_VALUES, &is1)); 30c4762a1bSJed Brown } 31c4762a1bSJed Brown { 329566063dSJacob Faibussowitsch PetscCall(ISCreateStride(PETSC_COMM_SELF, 6, 0, 1, &isl0)); 339566063dSJacob Faibussowitsch PetscCall(ISCreateStride(PETSC_COMM_SELF, 3, 0, 1, &isl0a)); 349566063dSJacob Faibussowitsch PetscCall(ISCreateStride(PETSC_COMM_SELF, 3, 3, 1, &isl0b)); 359566063dSJacob Faibussowitsch PetscCall(ISCreateStride(PETSC_COMM_SELF, 3, 6, 1, &isl1)); 36c4762a1bSJed Brown } 37c4762a1bSJed Brown 38c4762a1bSJed Brown usenest = PETSC_FALSE; 399566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetBool(NULL, NULL, "-nest", &usenest, NULL)); 40c4762a1bSJed Brown if (usenest) { 41c4762a1bSJed Brown ISLocalToGlobalMapping l2g; 42c4762a1bSJed Brown PetscInt l2gind[3]; 43c4762a1bSJed Brown Mat B[9]; 44c4762a1bSJed Brown 459371c9d4SSatish Balay l2gind[0] = (rank - 1 + size) % size; 469371c9d4SSatish Balay l2gind[1] = rank; 479371c9d4SSatish Balay l2gind[2] = (rank + 1) % size; 489566063dSJacob Faibussowitsch PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD, 1, 3, l2gind, PETSC_COPY_VALUES, &l2g)); 49c4762a1bSJed Brown for (i = 0; i < 9; i++) { 509566063dSJacob Faibussowitsch PetscCall(MatCreateAIJ(PETSC_COMM_WORLD, 1, 1, PETSC_DECIDE, PETSC_DECIDE, PETSC_DECIDE, NULL, PETSC_DECIDE, NULL, &B[i])); 519566063dSJacob Faibussowitsch PetscCall(MatSetUp(B[i])); 529566063dSJacob Faibussowitsch PetscCall(MatSetLocalToGlobalMapping(B[i], l2g, l2g)); 53c4762a1bSJed Brown } 54c4762a1bSJed Brown { 55c4762a1bSJed Brown IS isx[2]; 56c4762a1bSJed Brown Mat Bx00[4], Bx01[2], Bx10[2]; 57c4762a1bSJed Brown Mat B00, B01, B10; 58c4762a1bSJed Brown 599371c9d4SSatish Balay isx[0] = is0a; 609371c9d4SSatish Balay isx[1] = is0b; 619371c9d4SSatish Balay Bx00[0] = B[0]; 629371c9d4SSatish Balay Bx00[1] = B[1]; 639371c9d4SSatish Balay Bx00[2] = B[3]; 649371c9d4SSatish Balay Bx00[3] = B[4]; 659371c9d4SSatish Balay Bx01[0] = B[2]; 669371c9d4SSatish Balay Bx01[1] = B[5]; 679371c9d4SSatish Balay Bx10[0] = B[6]; 689371c9d4SSatish Balay Bx10[1] = B[7]; 69c4762a1bSJed Brown 709566063dSJacob Faibussowitsch PetscCall(MatCreateNest(PETSC_COMM_WORLD, 2, isx, 2, isx, Bx00, &B00)); 719566063dSJacob Faibussowitsch PetscCall(MatSetUp(B00)); 729566063dSJacob Faibussowitsch PetscCall(MatCreateNest(PETSC_COMM_WORLD, 2, isx, 1, NULL, Bx01, &B01)); 739566063dSJacob Faibussowitsch PetscCall(MatSetUp(B01)); 749566063dSJacob Faibussowitsch PetscCall(MatCreateNest(PETSC_COMM_WORLD, 1, NULL, 2, isx, Bx10, &B10)); 759566063dSJacob Faibussowitsch PetscCall(MatSetUp(B10)); 76c4762a1bSJed Brown { 77c4762a1bSJed Brown Mat By[4]; 78c4762a1bSJed Brown IS isy[2]; 79c4762a1bSJed Brown 809371c9d4SSatish Balay By[0] = B00; 819371c9d4SSatish Balay By[1] = B01; 829371c9d4SSatish Balay By[2] = B10; 839371c9d4SSatish Balay By[3] = B[8]; 849371c9d4SSatish Balay isy[0] = is0; 859371c9d4SSatish Balay isy[1] = is1; 86c4762a1bSJed Brown 879566063dSJacob Faibussowitsch PetscCall(MatCreateNest(PETSC_COMM_WORLD, 2, isy, 2, isy, By, &A)); 889566063dSJacob Faibussowitsch PetscCall(MatSetUp(A)); 89c4762a1bSJed Brown } 909566063dSJacob Faibussowitsch PetscCall(MatDestroy(&B00)); 919566063dSJacob Faibussowitsch PetscCall(MatDestroy(&B01)); 929566063dSJacob Faibussowitsch PetscCall(MatDestroy(&B10)); 93c4762a1bSJed Brown } 949566063dSJacob Faibussowitsch for (i = 0; i < 9; i++) PetscCall(MatDestroy(&B[i])); 959566063dSJacob Faibussowitsch PetscCall(ISLocalToGlobalMappingDestroy(&l2g)); 96c4762a1bSJed Brown } else { 97c4762a1bSJed Brown ISLocalToGlobalMapping l2g; 98c4762a1bSJed Brown PetscInt l2gind[9]; 999371c9d4SSatish Balay for (i = 0; i < 3; i++) 1009371c9d4SSatish Balay for (j = 0; j < 3; j++) l2gind[3 * i + j] = ((rank - 1 + j + size) % size) * 3 + i; 1019566063dSJacob Faibussowitsch PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD, 1, 9, l2gind, PETSC_COPY_VALUES, &l2g)); 1029566063dSJacob Faibussowitsch PetscCall(MatCreateAIJ(PETSC_COMM_WORLD, 3, 3, PETSC_DECIDE, PETSC_DECIDE, PETSC_DECIDE, NULL, PETSC_DECIDE, NULL, &A)); 1039566063dSJacob Faibussowitsch PetscCall(MatSetLocalToGlobalMapping(A, l2g, l2g)); 1049566063dSJacob Faibussowitsch PetscCall(ISLocalToGlobalMappingDestroy(&l2g)); 105c4762a1bSJed Brown } 106c4762a1bSJed Brown 107c4762a1bSJed Brown { 108c4762a1bSJed Brown Mat A00, A11, A0a0a, A0a0b; 1099566063dSJacob Faibussowitsch PetscCall(MatGetLocalSubMatrix(A, isl0, isl0, &A00)); 1109566063dSJacob Faibussowitsch PetscCall(MatGetLocalSubMatrix(A, isl1, isl1, &A11)); 1119566063dSJacob Faibussowitsch PetscCall(MatGetLocalSubMatrix(A00, isl0a, isl0a, &A0a0a)); 1129566063dSJacob Faibussowitsch PetscCall(MatGetLocalSubMatrix(A00, isl0a, isl0b, &A0a0b)); 113c4762a1bSJed Brown 1149566063dSJacob Faibussowitsch PetscCall(MatSetValueLocal(A0a0a, 0, 0, 100 * rank + 1, ADD_VALUES)); 1159566063dSJacob Faibussowitsch PetscCall(MatSetValueLocal(A0a0a, 0, 1, 100 * rank + 2, ADD_VALUES)); 1169566063dSJacob Faibussowitsch PetscCall(MatSetValueLocal(A0a0a, 2, 2, 100 * rank + 9, ADD_VALUES)); 117c4762a1bSJed Brown 1189566063dSJacob Faibussowitsch PetscCall(MatSetValueLocal(A0a0b, 1, 1, 100 * rank + 50 + 5, ADD_VALUES)); 119c4762a1bSJed Brown 1209566063dSJacob Faibussowitsch PetscCall(MatSetValueLocal(A11, 0, 0, 1000 * (rank + 1) + 1, ADD_VALUES)); 1219566063dSJacob Faibussowitsch PetscCall(MatSetValueLocal(A11, 1, 2, 1000 * (rank + 1) + 6, ADD_VALUES)); 122c4762a1bSJed Brown 1239566063dSJacob Faibussowitsch PetscCall(MatRestoreLocalSubMatrix(A00, isl0a, isl0a, &A0a0a)); 1249566063dSJacob Faibussowitsch PetscCall(MatRestoreLocalSubMatrix(A00, isl0a, isl0b, &A0a0b)); 1259566063dSJacob Faibussowitsch PetscCall(MatRestoreLocalSubMatrix(A, isl0, isl0, &A00)); 1269566063dSJacob Faibussowitsch PetscCall(MatRestoreLocalSubMatrix(A, isl1, isl1, &A11)); 127c4762a1bSJed Brown } 1289566063dSJacob Faibussowitsch PetscCall(MatAssemblyBegin(A, MAT_FINAL_ASSEMBLY)); 1299566063dSJacob Faibussowitsch PetscCall(MatAssemblyEnd(A, MAT_FINAL_ASSEMBLY)); 130c4762a1bSJed Brown 1319566063dSJacob Faibussowitsch PetscCall(MatComputeOperator(A, MATAIJ, &Aexplicit)); 1329566063dSJacob Faibussowitsch PetscCall(MatView(Aexplicit, PETSC_VIEWER_STDOUT_WORLD)); 133c4762a1bSJed Brown 1349566063dSJacob Faibussowitsch PetscCall(MatDestroy(&A)); 1359566063dSJacob Faibussowitsch PetscCall(MatDestroy(&Aexplicit)); 1369566063dSJacob Faibussowitsch PetscCall(ISDestroy(&is0a)); 1379566063dSJacob Faibussowitsch PetscCall(ISDestroy(&is0b)); 1389566063dSJacob Faibussowitsch PetscCall(ISDestroy(&is0)); 1399566063dSJacob Faibussowitsch PetscCall(ISDestroy(&is1)); 1409566063dSJacob Faibussowitsch PetscCall(ISDestroy(&isl0a)); 1419566063dSJacob Faibussowitsch PetscCall(ISDestroy(&isl0b)); 1429566063dSJacob Faibussowitsch PetscCall(ISDestroy(&isl0)); 1439566063dSJacob Faibussowitsch PetscCall(ISDestroy(&isl1)); 1449566063dSJacob Faibussowitsch PetscCall(PetscFinalize()); 145b122ec5aSJacob Faibussowitsch return 0; 146c4762a1bSJed Brown } 147c4762a1bSJed Brown 148c4762a1bSJed Brown /*TEST 149c4762a1bSJed Brown 150c4762a1bSJed Brown test: 151c4762a1bSJed Brown nsize: 3 152c4762a1bSJed Brown 153c4762a1bSJed Brown test: 154c4762a1bSJed Brown suffix: nest 155c4762a1bSJed Brown nsize: 3 156c4762a1bSJed Brown args: -nest 157c4762a1bSJed Brown 158c4762a1bSJed Brown TEST*/ 159