Actual source code: ex35.c
2: static char help[] = "Tests MatCreateSubMatrices().\n\n";
4: #include <petscmat.h>
6: int main(int argc,char **args)
7: {
8: Mat A,B,*Bsub;
9: PetscInt i,j,m = 6,n = 6,N = 36,Ii,J;
10: PetscScalar v;
11: IS isrow;
13: PetscInitialize(&argc,&args,(char*)0,help);
14: MatCreateSeqAIJ(PETSC_COMM_WORLD,N,N,5,NULL,&A);
15: for (i=0; i<m; i++) {
16: for (j=0; j<n; j++) {
17: v = -1.0; Ii = j + n*i;
18: if (i>0) {J = Ii - n; MatSetValues(A,1,&Ii,1,&J,&v,INSERT_VALUES);}
19: if (i<m-1) {J = Ii + n; MatSetValues(A,1,&Ii,1,&J,&v,INSERT_VALUES);}
20: if (j>0) {J = Ii - 1; MatSetValues(A,1,&Ii,1,&J,&v,INSERT_VALUES);}
21: if (j<n-1) {J = Ii + 1; MatSetValues(A,1,&Ii,1,&J,&v,INSERT_VALUES);}
22: v = 4.0; MatSetValues(A,1,&Ii,1,&Ii,&v,INSERT_VALUES);
23: }
24: }
25: MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY);
26: MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY);
27: MatView(A,PETSC_VIEWER_STDOUT_SELF);
29: /* take the first diagonal block */
30: ISCreateStride(PETSC_COMM_WORLD,m,0,1,&isrow);
31: MatCreateSubMatrices(A,1,&isrow,&isrow,MAT_INITIAL_MATRIX,&Bsub);
32: B = *Bsub;
33: ISDestroy(&isrow);
34: MatView(B,PETSC_VIEWER_STDOUT_SELF);
35: MatDestroySubMatrices(1,&Bsub);
37: /* take a strided block */
38: ISCreateStride(PETSC_COMM_WORLD,m,0,2,&isrow);
39: MatCreateSubMatrices(A,1,&isrow,&isrow,MAT_INITIAL_MATRIX,&Bsub);
40: B = *Bsub;
41: ISDestroy(&isrow);
42: MatView(B,PETSC_VIEWER_STDOUT_SELF);
43: MatDestroySubMatrices(1,&Bsub);
45: /* take the last block */
46: ISCreateStride(PETSC_COMM_WORLD,m,N-m-1,1,&isrow);
47: MatCreateSubMatrices(A,1,&isrow,&isrow,MAT_INITIAL_MATRIX,&Bsub);
48: B = *Bsub;
49: ISDestroy(&isrow);
50: MatView(B,PETSC_VIEWER_STDOUT_SELF);
52: MatDestroySubMatrices(1,&Bsub);
53: MatDestroy(&A);
55: PetscFinalize();
56: return 0;
57: }
59: /*TEST
61: test:
63: TEST*/