xref: /petsc/src/mat/tests/ex159.c (revision 0b46e949f18ac28417071477034640c76a0832a0)
1c4762a1bSJed Brown static const char help[] = "Test MatGetLocalSubMatrix() with multiple levels of nesting.\n\n";
2c4762a1bSJed Brown 
3c4762a1bSJed Brown #include <petscmat.h>
4c4762a1bSJed Brown 
main(int argc,char * argv[])5d71ae5a4SJacob Faibussowitsch int main(int argc, char *argv[])
6d71ae5a4SJacob Faibussowitsch {
7c4762a1bSJed Brown   IS          is0a, is0b, is0, is1, isl0a, isl0b, isl0, isl1;
8c4762a1bSJed Brown   Mat         A, Aexplicit;
939b6f3f9SStefano Zampini   PetscBool   usenest, test_mat_is;
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 
1839b6f3f9SStefano Zampini   usenest     = PETSC_FALSE;
1939b6f3f9SStefano Zampini   test_mat_is = PETSC_FALSE;
2039b6f3f9SStefano Zampini   PetscCall(PetscOptionsGetBool(NULL, NULL, "-nest", &usenest, NULL));
2139b6f3f9SStefano Zampini   PetscCall(PetscOptionsGetBool(NULL, NULL, "-test_mat_is", &test_mat_is, NULL));
2239b6f3f9SStefano Zampini 
23c4762a1bSJed Brown   {
24c4762a1bSJed Brown     PetscInt ix0a[1], ix0b[1], ix0[2], ix1[1];
25c4762a1bSJed Brown 
26c4762a1bSJed Brown     ix0a[0] = rank * 2 + 0;
27c4762a1bSJed Brown     ix0b[0] = rank * 2 + 1;
289371c9d4SSatish Balay     ix0[0]  = rank * 3 + 0;
299371c9d4SSatish Balay     ix0[1]  = rank * 3 + 1;
30c4762a1bSJed Brown     ix1[0]  = rank * 3 + 2;
319566063dSJacob Faibussowitsch     PetscCall(ISCreateGeneral(PETSC_COMM_WORLD, 1, ix0a, PETSC_COPY_VALUES, &is0a));
329566063dSJacob Faibussowitsch     PetscCall(ISCreateGeneral(PETSC_COMM_WORLD, 1, ix0b, PETSC_COPY_VALUES, &is0b));
339566063dSJacob Faibussowitsch     PetscCall(ISCreateGeneral(PETSC_COMM_WORLD, 2, ix0, PETSC_COPY_VALUES, &is0));
349566063dSJacob Faibussowitsch     PetscCall(ISCreateGeneral(PETSC_COMM_WORLD, 1, ix1, PETSC_COPY_VALUES, &is1));
35c4762a1bSJed Brown   }
36c4762a1bSJed Brown   {
379566063dSJacob Faibussowitsch     PetscCall(ISCreateStride(PETSC_COMM_SELF, 6, 0, 1, &isl0));
389566063dSJacob Faibussowitsch     PetscCall(ISCreateStride(PETSC_COMM_SELF, 3, 0, 1, &isl0a));
399566063dSJacob Faibussowitsch     PetscCall(ISCreateStride(PETSC_COMM_SELF, 3, 3, 1, &isl0b));
409566063dSJacob Faibussowitsch     PetscCall(ISCreateStride(PETSC_COMM_SELF, 3, 6, 1, &isl1));
41c4762a1bSJed Brown   }
42c4762a1bSJed Brown 
43c4762a1bSJed Brown   if (usenest) {
44c4762a1bSJed Brown     ISLocalToGlobalMapping l2g;
45c4762a1bSJed Brown     PetscInt               l2gind[3];
46c4762a1bSJed Brown     Mat                    B[9];
47c4762a1bSJed Brown 
489371c9d4SSatish Balay     l2gind[0] = (rank - 1 + size) % size;
499371c9d4SSatish Balay     l2gind[1] = rank;
509371c9d4SSatish Balay     l2gind[2] = (rank + 1) % size;
519566063dSJacob Faibussowitsch     PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD, 1, 3, l2gind, PETSC_COPY_VALUES, &l2g));
52c4762a1bSJed Brown     for (i = 0; i < 9; i++) {
5339b6f3f9SStefano Zampini       if (test_mat_is) {
5439b6f3f9SStefano Zampini         PetscCall(MatCreateIS(PETSC_COMM_WORLD, 1, 1, 1, PETSC_DECIDE, PETSC_DECIDE, l2g, l2g, &B[i]));
5539b6f3f9SStefano Zampini       } else {
569566063dSJacob Faibussowitsch         PetscCall(MatCreateAIJ(PETSC_COMM_WORLD, 1, 1, PETSC_DECIDE, PETSC_DECIDE, PETSC_DECIDE, NULL, PETSC_DECIDE, NULL, &B[i]));
579566063dSJacob Faibussowitsch         PetscCall(MatSetUp(B[i]));
589566063dSJacob Faibussowitsch         PetscCall(MatSetLocalToGlobalMapping(B[i], l2g, l2g));
59c4762a1bSJed Brown       }
6039b6f3f9SStefano Zampini     }
61c4762a1bSJed Brown     {
62c4762a1bSJed Brown       IS  isx[2];
63c4762a1bSJed Brown       Mat Bx00[4], Bx01[2], Bx10[2];
64c4762a1bSJed Brown       Mat B00, B01, B10;
65c4762a1bSJed Brown 
669371c9d4SSatish Balay       isx[0]  = is0a;
679371c9d4SSatish Balay       isx[1]  = is0b;
689371c9d4SSatish Balay       Bx00[0] = B[0];
699371c9d4SSatish Balay       Bx00[1] = B[1];
709371c9d4SSatish Balay       Bx00[2] = B[3];
719371c9d4SSatish Balay       Bx00[3] = B[4];
729371c9d4SSatish Balay       Bx01[0] = B[2];
739371c9d4SSatish Balay       Bx01[1] = B[5];
749371c9d4SSatish Balay       Bx10[0] = B[6];
759371c9d4SSatish Balay       Bx10[1] = B[7];
76c4762a1bSJed Brown 
779566063dSJacob Faibussowitsch       PetscCall(MatCreateNest(PETSC_COMM_WORLD, 2, isx, 2, isx, Bx00, &B00));
789566063dSJacob Faibussowitsch       PetscCall(MatSetUp(B00));
799566063dSJacob Faibussowitsch       PetscCall(MatCreateNest(PETSC_COMM_WORLD, 2, isx, 1, NULL, Bx01, &B01));
809566063dSJacob Faibussowitsch       PetscCall(MatSetUp(B01));
819566063dSJacob Faibussowitsch       PetscCall(MatCreateNest(PETSC_COMM_WORLD, 1, NULL, 2, isx, Bx10, &B10));
829566063dSJacob Faibussowitsch       PetscCall(MatSetUp(B10));
83c4762a1bSJed Brown       {
84c4762a1bSJed Brown         Mat By[4];
85c4762a1bSJed Brown         IS  isy[2];
86c4762a1bSJed Brown 
879371c9d4SSatish Balay         By[0]  = B00;
889371c9d4SSatish Balay         By[1]  = B01;
899371c9d4SSatish Balay         By[2]  = B10;
909371c9d4SSatish Balay         By[3]  = B[8];
919371c9d4SSatish Balay         isy[0] = is0;
929371c9d4SSatish Balay         isy[1] = is1;
93c4762a1bSJed Brown 
949566063dSJacob Faibussowitsch         PetscCall(MatCreateNest(PETSC_COMM_WORLD, 2, isy, 2, isy, By, &A));
959566063dSJacob Faibussowitsch         PetscCall(MatSetUp(A));
96c4762a1bSJed Brown       }
979566063dSJacob Faibussowitsch       PetscCall(MatDestroy(&B00));
989566063dSJacob Faibussowitsch       PetscCall(MatDestroy(&B01));
999566063dSJacob Faibussowitsch       PetscCall(MatDestroy(&B10));
100c4762a1bSJed Brown     }
1019566063dSJacob Faibussowitsch     for (i = 0; i < 9; i++) PetscCall(MatDestroy(&B[i]));
1029566063dSJacob Faibussowitsch     PetscCall(ISLocalToGlobalMappingDestroy(&l2g));
103c4762a1bSJed Brown   } else {
104c4762a1bSJed Brown     ISLocalToGlobalMapping l2g;
105c4762a1bSJed Brown     PetscInt               l2gind[9];
1069371c9d4SSatish Balay     for (i = 0; i < 3; i++)
1079371c9d4SSatish Balay       for (j = 0; j < 3; j++) l2gind[3 * i + j] = ((rank - 1 + j + size) % size) * 3 + i;
1089566063dSJacob Faibussowitsch     PetscCall(ISLocalToGlobalMappingCreate(PETSC_COMM_WORLD, 1, 9, l2gind, PETSC_COPY_VALUES, &l2g));
10939b6f3f9SStefano Zampini     if (test_mat_is) {
11039b6f3f9SStefano Zampini       PetscCall(MatCreateIS(PETSC_COMM_WORLD, 1, 3, 3, PETSC_DECIDE, PETSC_DECIDE, l2g, l2g, &A));
11139b6f3f9SStefano Zampini     } else {
1129566063dSJacob Faibussowitsch       PetscCall(MatCreateAIJ(PETSC_COMM_WORLD, 3, 3, PETSC_DECIDE, PETSC_DECIDE, PETSC_DECIDE, NULL, PETSC_DECIDE, NULL, &A));
1139566063dSJacob Faibussowitsch       PetscCall(MatSetLocalToGlobalMapping(A, l2g, l2g));
11439b6f3f9SStefano Zampini     }
1159566063dSJacob Faibussowitsch     PetscCall(ISLocalToGlobalMappingDestroy(&l2g));
116c4762a1bSJed Brown   }
117c4762a1bSJed Brown 
118c4762a1bSJed Brown   {
119c4762a1bSJed Brown     Mat A00, A11, A0a0a, A0a0b;
1209566063dSJacob Faibussowitsch     PetscCall(MatGetLocalSubMatrix(A, isl0, isl0, &A00));
1219566063dSJacob Faibussowitsch     PetscCall(MatGetLocalSubMatrix(A, isl1, isl1, &A11));
1229566063dSJacob Faibussowitsch     PetscCall(MatGetLocalSubMatrix(A00, isl0a, isl0a, &A0a0a));
1239566063dSJacob Faibussowitsch     PetscCall(MatGetLocalSubMatrix(A00, isl0a, isl0b, &A0a0b));
124c4762a1bSJed Brown 
1259566063dSJacob Faibussowitsch     PetscCall(MatSetValueLocal(A0a0a, 0, 0, 100 * rank + 1, ADD_VALUES));
1269566063dSJacob Faibussowitsch     PetscCall(MatSetValueLocal(A0a0a, 0, 1, 100 * rank + 2, ADD_VALUES));
1279566063dSJacob Faibussowitsch     PetscCall(MatSetValueLocal(A0a0a, 2, 2, 100 * rank + 9, ADD_VALUES));
128c4762a1bSJed Brown 
1299566063dSJacob Faibussowitsch     PetscCall(MatSetValueLocal(A0a0b, 1, 1, 100 * rank + 50 + 5, ADD_VALUES));
130c4762a1bSJed Brown 
1319566063dSJacob Faibussowitsch     PetscCall(MatSetValueLocal(A11, 0, 0, 1000 * (rank + 1) + 1, ADD_VALUES));
1329566063dSJacob Faibussowitsch     PetscCall(MatSetValueLocal(A11, 1, 2, 1000 * (rank + 1) + 6, ADD_VALUES));
133c4762a1bSJed Brown 
1349566063dSJacob Faibussowitsch     PetscCall(MatRestoreLocalSubMatrix(A00, isl0a, isl0a, &A0a0a));
1359566063dSJacob Faibussowitsch     PetscCall(MatRestoreLocalSubMatrix(A00, isl0a, isl0b, &A0a0b));
1369566063dSJacob Faibussowitsch     PetscCall(MatRestoreLocalSubMatrix(A, isl0, isl0, &A00));
1379566063dSJacob Faibussowitsch     PetscCall(MatRestoreLocalSubMatrix(A, isl1, isl1, &A11));
138c4762a1bSJed Brown   }
1399566063dSJacob Faibussowitsch   PetscCall(MatAssemblyBegin(A, MAT_FINAL_ASSEMBLY));
1409566063dSJacob Faibussowitsch   PetscCall(MatAssemblyEnd(A, MAT_FINAL_ASSEMBLY));
1419566063dSJacob Faibussowitsch   PetscCall(MatComputeOperator(A, MATAIJ, &Aexplicit));
1429566063dSJacob Faibussowitsch   PetscCall(MatView(Aexplicit, PETSC_VIEWER_STDOUT_WORLD));
143*0d2733adSStefano Zampini   PetscCall(MatDestroy(&Aexplicit));
144*0d2733adSStefano Zampini 
145*0d2733adSStefano Zampini   {
146*0d2733adSStefano Zampini     Mat      A00, A0a0a, A0a0b;
147*0d2733adSStefano Zampini     PetscInt rows[] = {0, 1};
148*0d2733adSStefano Zampini     PetscCall(MatGetLocalSubMatrix(A, isl0, isl0, &A00));
149*0d2733adSStefano Zampini     PetscCall(MatGetLocalSubMatrix(A00, isl0a, isl0a, &A0a0a));
150*0d2733adSStefano Zampini     PetscCall(MatGetLocalSubMatrix(A00, isl0a, isl0b, &A0a0b));
151*0d2733adSStefano Zampini 
152*0d2733adSStefano Zampini     PetscCall(MatZeroRowsColumnsLocal(A0a0a, 2, rows, 4.0, NULL, NULL));
153*0d2733adSStefano Zampini     PetscCall(MatZeroRowsLocal(A0a0b, 1, rows + 1, 0.0, NULL, NULL));
154*0d2733adSStefano Zampini 
155*0d2733adSStefano Zampini     PetscCall(MatRestoreLocalSubMatrix(A00, isl0a, isl0a, &A0a0a));
156*0d2733adSStefano Zampini     PetscCall(MatRestoreLocalSubMatrix(A00, isl0a, isl0b, &A0a0b));
157*0d2733adSStefano Zampini     PetscCall(MatRestoreLocalSubMatrix(A, isl0, isl0, &A00));
158*0d2733adSStefano Zampini   }
159*0d2733adSStefano Zampini   PetscCall(MatAssemblyBegin(A, MAT_FINAL_ASSEMBLY));
160*0d2733adSStefano Zampini   PetscCall(MatAssemblyEnd(A, MAT_FINAL_ASSEMBLY));
161*0d2733adSStefano Zampini   PetscCall(MatComputeOperator(A, MATAIJ, &Aexplicit));
162*0d2733adSStefano Zampini   PetscCall(MatView(Aexplicit, PETSC_VIEWER_STDOUT_WORLD));
163*0d2733adSStefano Zampini   PetscCall(MatDestroy(&Aexplicit));
164c4762a1bSJed Brown 
1659566063dSJacob Faibussowitsch   PetscCall(MatDestroy(&A));
1669566063dSJacob Faibussowitsch   PetscCall(ISDestroy(&is0a));
1679566063dSJacob Faibussowitsch   PetscCall(ISDestroy(&is0b));
1689566063dSJacob Faibussowitsch   PetscCall(ISDestroy(&is0));
1699566063dSJacob Faibussowitsch   PetscCall(ISDestroy(&is1));
1709566063dSJacob Faibussowitsch   PetscCall(ISDestroy(&isl0a));
1719566063dSJacob Faibussowitsch   PetscCall(ISDestroy(&isl0b));
1729566063dSJacob Faibussowitsch   PetscCall(ISDestroy(&isl0));
1739566063dSJacob Faibussowitsch   PetscCall(ISDestroy(&isl1));
1749566063dSJacob Faibussowitsch   PetscCall(PetscFinalize());
175b122ec5aSJacob Faibussowitsch   return 0;
176c4762a1bSJed Brown }
177c4762a1bSJed Brown 
178c4762a1bSJed Brown /*TEST
179c4762a1bSJed Brown 
180c4762a1bSJed Brown    test:
181c4762a1bSJed Brown       nsize: 3
18239b6f3f9SStefano Zampini       args: -test_mat_is {{0 1}}
18339b6f3f9SStefano Zampini       diff_args: -j
184c4762a1bSJed Brown 
185c4762a1bSJed Brown    test:
186c4762a1bSJed Brown       suffix: nest
187c4762a1bSJed Brown       nsize: 3
18839b6f3f9SStefano Zampini       args: -nest -test_mat_is {{0 1}}
18939b6f3f9SStefano Zampini       diff_args: -j
190c4762a1bSJed Brown 
191c4762a1bSJed Brown TEST*/
192