xref: /petsc/src/mat/tests/ex59.c (revision c4762a1b19cd2af06abeed90e8f9d34fb975dd94)
1 
2 static char help[] = "Tests MatCreateSubmatrix() in parallel.";
3 
4 #include <petscmat.h>
5 
6 int main(int argc,char **args)
7 {
8   Mat            C,A;
9   PetscInt       i,j,m = 3,n = 2,rstart,rend;
10   PetscMPIInt    size,rank;
11   PetscErrorCode ierr;
12   PetscScalar    v;
13   IS             isrow,iscol;
14 
15   ierr = PetscInitialize(&argc,&args,(char*)0,help);if (ierr) return ierr;
16   ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr);
17   ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRQ(ierr);
18   n    = 2*size;
19 
20   ierr = MatCreate(PETSC_COMM_WORLD,&C);CHKERRQ(ierr);
21   ierr = MatSetSizes(C,PETSC_DECIDE,PETSC_DECIDE,m*n,m*n);CHKERRQ(ierr);
22   ierr = MatSetFromOptions(C);CHKERRQ(ierr);
23   ierr = MatSetUp(C);CHKERRQ(ierr);
24 
25   /*
26         This is JUST to generate a nice test matrix, all processors fill up
27     the entire matrix. This is not something one would ever do in practice.
28   */
29   ierr = MatGetOwnershipRange(C,&rstart,&rend);CHKERRQ(ierr);
30   for (i=rstart; i<rend; i++) {
31     for (j=0; j<m*n; j++) {
32       v    = i + j + 1;
33       ierr = MatSetValues(C,1,&i,1,&j,&v,INSERT_VALUES);CHKERRQ(ierr);
34     }
35   }
36 
37   ierr = MatAssemblyBegin(C,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
38   ierr = MatAssemblyEnd(C,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
39   ierr = PetscViewerPushFormat(PETSC_VIEWER_STDOUT_WORLD,PETSC_VIEWER_ASCII_COMMON);CHKERRQ(ierr);
40   ierr = MatView(C,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr);
41 
42   /*
43      Generate a new matrix consisting of every second row and column of
44    the original matrix
45   */
46   ierr = MatGetOwnershipRange(C,&rstart,&rend);CHKERRQ(ierr);
47   /* Create parallel IS with the rows we want on THIS processor */
48   ierr = ISCreateStride(PETSC_COMM_WORLD,(rend-rstart)/2,rstart,2,&isrow);CHKERRQ(ierr);
49   /* Create parallel IS with the rows we want on THIS processor (same as rows for now) */
50   ierr = ISCreateStride(PETSC_COMM_WORLD,(rend-rstart)/2,rstart,2,&iscol);CHKERRQ(ierr);
51 
52   ierr = MatCreateSubMatrix(C,isrow,iscol,MAT_INITIAL_MATRIX,&A);CHKERRQ(ierr);
53   ierr = MatCreateSubMatrix(C,isrow,iscol,MAT_REUSE_MATRIX,&A);CHKERRQ(ierr);
54   ierr = MatView(A,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr);
55 
56   ierr = ISDestroy(&isrow);CHKERRQ(ierr);
57   ierr = ISDestroy(&iscol);CHKERRQ(ierr);
58   ierr = MatDestroy(&A);CHKERRQ(ierr);
59   ierr = MatDestroy(&C);CHKERRQ(ierr);
60   ierr = PetscFinalize();
61   return ierr;
62 }
63 
64 
65 /*TEST
66 
67    test:
68 
69    test:
70       suffix: 2
71       nsize: 3
72 
73    test:
74       suffix: 2_baij
75       nsize: 3
76       args: -mat_type baij
77 
78    test:
79       suffix: 2_sbaij
80       nsize: 3
81       args: -mat_type sbaij
82 
83    test:
84       suffix: baij
85       args: -mat_type baij
86       output_file: output/ex59_1_baij.out
87 
88    test:
89       suffix: sbaij
90       args: -mat_type sbaij
91       output_file: output/ex59_1_sbaij.out
92 
93 TEST*/
94