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