Actual source code: ex194.c
petsc-3.14.6 2021-03-30
2: static char help[] = "Tests MatCreateSubmatrix() with certain entire rows of matrix, modified from ex181.c.";
4: #include <petscmat.h>
6: int main(int argc,char **args)
7: {
8: Mat C,A;
9: PetscInt i,j,m = 3,n = 2,rstart,rend,cstart,cend;
10: PetscMPIInt size,rank;
12: PetscScalar v;
13: IS isrow,iscol;
15: PetscInitialize(&argc,&args,(char*)0,help);if (ierr) return ierr;
16: MPI_Comm_rank(PETSC_COMM_WORLD,&rank);
17: MPI_Comm_size(PETSC_COMM_WORLD,&size);
18: n = 2*size;
20: MatCreate(PETSC_COMM_WORLD,&C);
21: MatSetSizes(C,PETSC_DECIDE,PETSC_DECIDE,m*n,m*n);
22: MatSetFromOptions(C);
23: MatSetUp(C);
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: MatGetOwnershipRange(C,&rstart,&rend);
30: for (i=rstart; i<rend; i++) {
31: for (j=0; j<m*n; j++) {
32: v = i + j + 1;
33: MatSetValues(C,1,&i,1,&j,&v,INSERT_VALUES);
34: }
35: }
36: MatAssemblyBegin(C,MAT_FINAL_ASSEMBLY);
37: MatAssemblyEnd(C,MAT_FINAL_ASSEMBLY);
38: PetscViewerPushFormat(PETSC_VIEWER_STDOUT_WORLD,PETSC_VIEWER_ASCII_COMMON);
39: MatView(C,PETSC_VIEWER_STDOUT_WORLD);
40: PetscViewerPopFormat(PETSC_VIEWER_STDOUT_WORLD);
42: /*
43: Generate a new matrix consisting every column of the original matrix
44: */
45: MatGetOwnershipRange(C,&rstart,&rend);
46: MatGetOwnershipRangeColumn(C,&cstart,&cend);
48: ISCreateStride(PETSC_COMM_WORLD,rend-rstart > 0 ? rend-rstart-1 : 0,rstart,1,&isrow);
49: ISCreateStride(PETSC_COMM_WORLD,cend-cstart,cstart,1,&iscol);
50: MatCreateSubMatrix(C,isrow,NULL,MAT_INITIAL_MATRIX,&A);
52: /* Change C to test the case MAT_REUSE_MATRIX */
53: if (!rank) {
54: i = 0; j = 0; v = 100;
55: MatSetValues(C,1,&i,1,&j,&v,INSERT_VALUES);
56: }
57: MatAssemblyBegin(C,MAT_FINAL_ASSEMBLY);
58: MatAssemblyEnd(C,MAT_FINAL_ASSEMBLY);
60: MatCreateSubMatrix(C,isrow,NULL,MAT_REUSE_MATRIX,&A);
61: PetscViewerPushFormat(PETSC_VIEWER_STDOUT_WORLD,PETSC_VIEWER_ASCII_COMMON);
62: MatView(A,PETSC_VIEWER_STDOUT_WORLD);
63: PetscViewerPopFormat(PETSC_VIEWER_STDOUT_WORLD);
65: ISDestroy(&isrow);
66: ISDestroy(&iscol);
67: MatDestroy(&A);
68: MatDestroy(&C);
69: PetscFinalize();
70: return ierr;
71: }
74: /*TEST
76: test:
77: nsize: 2
79: TEST*/