xref: /petsc/src/mat/tests/ex68.c (revision 030f984af8d8bb4c203755d35bded3c05b3d83ce)
1 
2 static char help[] = "Tests MatReorderForNonzeroDiagonal().\n\n";
3 
4 #include <petscmat.h>
5 
6 int main(int argc,char **argv)
7 {
8   Mat            mat,B,C;
9   PetscErrorCode ierr;
10   PetscInt       i,j;
11   PetscMPIInt    size;
12   PetscScalar    v;
13   IS             isrow,iscol,identity;
14   PetscViewer    viewer;
15 
16   ierr = PetscInitialize(&argc,&argv,(char*)0,help);if (ierr) return ierr;
17 
18   /* ------- Assemble matrix, --------- */
19 
20   ierr = MatCreate(PETSC_COMM_WORLD,&mat);CHKERRQ(ierr);
21   ierr = MatSetSizes(mat,PETSC_DECIDE,PETSC_DECIDE,4,4);CHKERRQ(ierr);
22   ierr = MatSetFromOptions(mat);CHKERRQ(ierr);
23   ierr = MatSetUp(mat);CHKERRQ(ierr);
24 
25   /* set anti-diagonal of matrix */
26   v    = 1.0;
27   i    = 0; j = 3;
28   ierr = MatSetValues(mat,1,&i,1,&j,&v,INSERT_VALUES);CHKERRQ(ierr);
29   v    = 2.0;
30   i    = 1; j = 2;
31   ierr = MatSetValues(mat,1,&i,1,&j,&v,INSERT_VALUES);CHKERRQ(ierr);
32   v    = 3.0;
33   i    = 2; j = 1;
34   ierr = MatSetValues(mat,1,&i,1,&j,&v,INSERT_VALUES);CHKERRQ(ierr);
35   v    = 4.0;
36   i    = 3; j = 0;
37   ierr = MatSetValues(mat,1,&i,1,&j,&v,INSERT_VALUES);CHKERRQ(ierr);
38   ierr = MatAssemblyBegin(mat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
39   ierr = MatAssemblyEnd(mat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
40 
41   ierr = PetscViewerASCIIGetStdout(PETSC_COMM_WORLD,&viewer);CHKERRQ(ierr);
42   ierr = PetscViewerPushFormat(viewer,PETSC_VIEWER_ASCII_DENSE);CHKERRQ(ierr);
43   ierr = PetscViewerASCIIPrintf(viewer,"Original matrix\n");CHKERRQ(ierr);
44   ierr = MatView(mat,viewer);CHKERRQ(ierr);
45 
46   ierr = MatGetOrdering(mat,MATORDERINGNATURAL,&isrow,&iscol);CHKERRQ(ierr);
47 
48   ierr = MatPermute(mat,isrow,iscol,&B);CHKERRQ(ierr);
49   ierr = PetscViewerASCIIPrintf(viewer,"Original matrix permuted by identity\n");CHKERRQ(ierr);
50   ierr = MatView(B,viewer);CHKERRQ(ierr);
51   ierr = MatDestroy(&B);CHKERRQ(ierr);
52 
53   ierr = MatReorderForNonzeroDiagonal(mat,1.e-8,isrow,iscol);CHKERRQ(ierr);
54   ierr = MatPermute(mat,isrow,iscol,&B);CHKERRQ(ierr);
55   ierr = PetscViewerASCIIPrintf(viewer,"Original matrix permuted by identity + NonzeroDiagonal()\n");CHKERRQ(ierr);
56   ierr = MatView(B,viewer);CHKERRQ(ierr);
57   ierr = PetscViewerASCIIPrintf(viewer,"Row permutation\n");CHKERRQ(ierr);
58   ierr = ISView(isrow,viewer);CHKERRQ(ierr);
59   ierr = PetscViewerASCIIPrintf(viewer,"Column permutation\n");CHKERRQ(ierr);
60   ierr = ISView(iscol,viewer);CHKERRQ(ierr);
61   ierr = MatDestroy(&B);CHKERRQ(ierr);
62 
63   ierr = ISDestroy(&isrow);CHKERRQ(ierr);
64   ierr = ISDestroy(&iscol);CHKERRQ(ierr);
65 
66   ierr = MatGetOrdering(mat,MATORDERINGND,&isrow,&iscol);CHKERRQ(ierr);
67   ierr = MatPermute(mat,isrow,iscol,&B);CHKERRQ(ierr);
68   ierr = PetscViewerASCIIPrintf(viewer,"Original matrix permuted by ND\n");CHKERRQ(ierr);
69   ierr = MatView(B,viewer);CHKERRQ(ierr);
70   ierr = MatDestroy(&B);CHKERRQ(ierr);
71   ierr = PetscViewerASCIIPrintf(viewer,"ND row permutation\n");CHKERRQ(ierr);
72   ierr = ISView(isrow,viewer);CHKERRQ(ierr);
73   ierr = PetscViewerASCIIPrintf(viewer,"ND column permutation\n");CHKERRQ(ierr);
74   ierr = ISView(iscol,viewer);CHKERRQ(ierr);
75 
76   ierr = MatReorderForNonzeroDiagonal(mat,1.e-8,isrow,iscol);CHKERRQ(ierr);
77   ierr = MatPermute(mat,isrow,iscol,&B);CHKERRQ(ierr);
78   ierr = PetscViewerASCIIPrintf(viewer,"Original matrix permuted by ND + NonzeroDiagonal()\n");CHKERRQ(ierr);
79   ierr = MatView(B,viewer);CHKERRQ(ierr);
80   ierr = MatDestroy(&B);CHKERRQ(ierr);
81   ierr = PetscViewerASCIIPrintf(viewer,"ND + NonzeroDiagonal() row permutation\n");CHKERRQ(ierr);
82   ierr = ISView(isrow,viewer);CHKERRQ(ierr);
83   ierr = PetscViewerASCIIPrintf(viewer,"ND + NonzeroDiagonal() column permutation\n");CHKERRQ(ierr);
84   ierr = ISView(iscol,viewer);CHKERRQ(ierr);
85 
86   ierr = ISDestroy(&isrow);CHKERRQ(ierr);
87   ierr = ISDestroy(&iscol);CHKERRQ(ierr);
88 
89   ierr = MatGetOrdering(mat,MATORDERINGRCM,&isrow,&iscol);CHKERRQ(ierr);
90   ierr = MatPermute(mat,isrow,iscol,&B);CHKERRQ(ierr);
91   ierr = PetscViewerASCIIPrintf(viewer,"Original matrix permuted by RCM\n");CHKERRQ(ierr);
92   ierr = MatView(B,viewer);CHKERRQ(ierr);
93   ierr = MatDestroy(&B);CHKERRQ(ierr);
94   ierr = PetscViewerASCIIPrintf(viewer,"RCM row permutation\n");CHKERRQ(ierr);
95   ierr = ISView(isrow,viewer);CHKERRQ(ierr);
96   ierr = PetscViewerASCIIPrintf(viewer,"RCM column permutation\n");CHKERRQ(ierr);
97   ierr = ISView(iscol,viewer);CHKERRQ(ierr);
98 
99   ierr = MatReorderForNonzeroDiagonal(mat,1.e-8,isrow,iscol);CHKERRQ(ierr);
100   ierr = MatPermute(mat,isrow,iscol,&B);CHKERRQ(ierr);
101   ierr = PetscViewerASCIIPrintf(viewer,"Original matrix permuted by RCM + NonzeroDiagonal()\n");CHKERRQ(ierr);
102   ierr = MatView(B,viewer);CHKERRQ(ierr);
103   ierr = PetscViewerASCIIPrintf(viewer,"RCM + NonzeroDiagonal() row permutation\n");CHKERRQ(ierr);
104   ierr = ISView(isrow,viewer);CHKERRQ(ierr);
105   ierr = PetscViewerASCIIPrintf(viewer,"RCM + NonzeroDiagonal() column permutation\n");CHKERRQ(ierr);
106   ierr = ISView(iscol,viewer);CHKERRQ(ierr);
107   ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRMPI(ierr);
108   if (size == 1) {
109     ierr = MatSetOption(B,MAT_SYMMETRIC,PETSC_TRUE);CHKERRQ(ierr);
110     ierr = ISCreateStride(PETSC_COMM_SELF,4,0,1,&identity);CHKERRQ(ierr);
111     ierr = MatPermute(B,identity,identity,&C);CHKERRQ(ierr);
112     ierr = MatConvert(C,MATSEQSBAIJ,MAT_INPLACE_MATRIX,&C);CHKERRQ(ierr);
113     ierr = MatDestroy(&C);CHKERRQ(ierr);
114     ierr = ISDestroy(&identity);CHKERRQ(ierr);
115   }
116   ierr = MatDestroy(&B);CHKERRQ(ierr);
117   /* Test MatLUFactor(); set diagonal as zeros as requested by PETSc matrix factorization */
118   for (i=0; i<4; i++) {
119     v = 0.0;
120     ierr = MatSetValues(mat,1,&i,1,&i,&v,INSERT_VALUES);CHKERRQ(ierr);
121   }
122   ierr = MatAssemblyBegin(mat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
123   ierr = MatAssemblyEnd(mat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
124   ierr = MatLUFactor(mat,isrow,iscol,NULL);CHKERRQ(ierr);
125 
126   /* Free data structures */
127   ierr = ISDestroy(&isrow);CHKERRQ(ierr);
128   ierr = ISDestroy(&iscol);CHKERRQ(ierr);
129   ierr = MatDestroy(&mat);CHKERRQ(ierr);
130 
131   ierr = PetscFinalize();
132   return ierr;
133 }
134 
135 /*TEST
136 
137    test:
138 
139 TEST*/
140