xref: /petsc/src/mat/tests/ex161.c (revision 2c71b3e237ead271e4f3aa1505f92bf476e3413d)
1c4762a1bSJed Brown static char help[] = "Test MatTransposeColoring for SeqAIJ matrices. Used for '-matmattransmult_color' on  MatMatTransposeMult \n\n";
2c4762a1bSJed Brown 
3c4762a1bSJed Brown #include <petscmat.h>
4c4762a1bSJed Brown #include <petsc/private/matimpl.h> /* Need struct _p_MatTransposeColoring for this test. */
5c4762a1bSJed Brown 
6c4762a1bSJed Brown int main(int argc,char **argv)
7c4762a1bSJed Brown {
8c4762a1bSJed Brown   Mat                  A,R,C,C_dense,C_sparse,Rt_dense,P,PtAP;
9c4762a1bSJed Brown   PetscInt             row,col,m,n;
10c4762a1bSJed Brown   PetscErrorCode       ierr;
11c4762a1bSJed Brown   MatScalar            one         =1.0,val;
12c4762a1bSJed Brown   MatColoring          mc;
13c4762a1bSJed Brown   MatTransposeColoring matcoloring = 0;
14c4762a1bSJed Brown   ISColoring           iscoloring;
15c4762a1bSJed Brown   PetscBool            equal;
16c4762a1bSJed Brown   PetscMPIInt          size;
17c4762a1bSJed Brown 
18c4762a1bSJed Brown   ierr = PetscInitialize(&argc,&argv,(char*)0,help);if (ierr) return ierr;
19ffc4695bSBarry Smith   ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRMPI(ierr);
20*2c71b3e2SJacob Faibussowitsch   PetscCheckFalse(size != 1,PETSC_COMM_WORLD,PETSC_ERR_SUP,"This is a uniprocessor example only!");
21c4762a1bSJed Brown 
22c4762a1bSJed Brown   /* Create seqaij A */
23c4762a1bSJed Brown   ierr = MatCreate(PETSC_COMM_SELF,&A);CHKERRQ(ierr);
24c4762a1bSJed Brown   ierr = MatSetSizes(A,4,4,4,4);CHKERRQ(ierr);
25c4762a1bSJed Brown   ierr = MatSetType(A,MATSEQAIJ);CHKERRQ(ierr);
26c4762a1bSJed Brown   ierr = MatSetFromOptions(A);CHKERRQ(ierr);
27c4762a1bSJed Brown   ierr = MatSetUp(A);CHKERRQ(ierr);
28c4762a1bSJed Brown   row  = 0; col=0; val=1.0; ierr = MatSetValues(A,1,&row,1,&col,&val,ADD_VALUES);CHKERRQ(ierr);
29c4762a1bSJed Brown   row  = 1; col=3; val=2.0; ierr = MatSetValues(A,1,&row,1,&col,&val,ADD_VALUES);CHKERRQ(ierr);
30c4762a1bSJed Brown   row  = 2; col=2; val=3.0; ierr = MatSetValues(A,1,&row,1,&col,&val,ADD_VALUES);CHKERRQ(ierr);
31c4762a1bSJed Brown   row  = 3; col=0; val=4.0; ierr = MatSetValues(A,1,&row,1,&col,&val,ADD_VALUES);CHKERRQ(ierr);
32c4762a1bSJed Brown   ierr = MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
33c4762a1bSJed Brown   ierr = MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
34c4762a1bSJed Brown   ierr = MatSetOptionsPrefix(A,"A_");CHKERRQ(ierr);
35c4762a1bSJed Brown   ierr = MatView(A,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr);
36c4762a1bSJed Brown   ierr = PetscPrintf(PETSC_COMM_SELF,"\n");CHKERRQ(ierr);
37c4762a1bSJed Brown 
38c4762a1bSJed Brown   /* Create seqaij R */
39c4762a1bSJed Brown   ierr = MatCreate(PETSC_COMM_SELF,&R);CHKERRQ(ierr);
40c4762a1bSJed Brown   ierr = MatSetSizes(R,2,4,2,4);CHKERRQ(ierr);
41c4762a1bSJed Brown   ierr = MatSetType(R,MATSEQAIJ);CHKERRQ(ierr);
42c4762a1bSJed Brown   ierr = MatSetFromOptions(R);CHKERRQ(ierr);
43c4762a1bSJed Brown   ierr = MatSetUp(R);CHKERRQ(ierr);
44c4762a1bSJed Brown   row  = 0; col=0; ierr = MatSetValues(R,1,&row,1,&col,&one,ADD_VALUES);CHKERRQ(ierr);
45c4762a1bSJed Brown   row  = 0; col=1; ierr = MatSetValues(R,1,&row,1,&col,&one,ADD_VALUES);CHKERRQ(ierr);
46c4762a1bSJed Brown 
47c4762a1bSJed Brown   row  = 1; col=1; ierr = MatSetValues(R,1,&row,1,&col,&one,ADD_VALUES);CHKERRQ(ierr);
48c4762a1bSJed Brown   row  = 1; col=2; ierr = MatSetValues(R,1,&row,1,&col,&one,ADD_VALUES);CHKERRQ(ierr);
49c4762a1bSJed Brown   row  = 1; col=3; ierr = MatSetValues(R,1,&row,1,&col,&one,ADD_VALUES);CHKERRQ(ierr);
50c4762a1bSJed Brown   ierr = MatAssemblyBegin(R,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
51c4762a1bSJed Brown   ierr = MatAssemblyEnd(R,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
52c4762a1bSJed Brown   ierr = MatSetOptionsPrefix(R,"R_");CHKERRQ(ierr);
53c4762a1bSJed Brown   ierr = MatView(R,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr);
54c4762a1bSJed Brown   ierr = PetscPrintf(PETSC_COMM_SELF,"\n");CHKERRQ(ierr);
55c4762a1bSJed Brown 
56c4762a1bSJed Brown   /* C = A*R^T */
57c4762a1bSJed Brown   ierr = MatMatTransposeMult(A,R,MAT_INITIAL_MATRIX,2.0,&C);CHKERRQ(ierr);
58c4762a1bSJed Brown   ierr = MatSetOptionsPrefix(C,"ARt_");CHKERRQ(ierr);
59c4762a1bSJed Brown   ierr = MatView(C,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr);
60c4762a1bSJed Brown   ierr = PetscPrintf(PETSC_COMM_SELF,"\n");CHKERRQ(ierr);
61c4762a1bSJed Brown 
62c4762a1bSJed Brown   /* Create MatTransposeColoring from symbolic C=A*R^T */
63c4762a1bSJed Brown   ierr = MatColoringCreate(C,&mc);CHKERRQ(ierr);
64c4762a1bSJed Brown   ierr = MatColoringSetDistance(mc,2);CHKERRQ(ierr);
65c4762a1bSJed Brown   /* ierr = MatColoringSetType(mc,MATCOLORINGSL);CHKERRQ(ierr); */
66c4762a1bSJed Brown   ierr = MatColoringSetFromOptions(mc);CHKERRQ(ierr);
67c4762a1bSJed Brown   ierr = MatColoringApply(mc,&iscoloring);CHKERRQ(ierr);
68c4762a1bSJed Brown   ierr = MatColoringDestroy(&mc);CHKERRQ(ierr);
69c4762a1bSJed Brown   ierr = MatTransposeColoringCreate(C,iscoloring,&matcoloring);CHKERRQ(ierr);
70c4762a1bSJed Brown   ierr = ISColoringDestroy(&iscoloring);CHKERRQ(ierr);
71c4762a1bSJed Brown 
72c4762a1bSJed Brown   /* Create Rt_dense */
73c4762a1bSJed Brown   ierr = MatCreate(PETSC_COMM_WORLD,&Rt_dense);CHKERRQ(ierr);
74c4762a1bSJed Brown   ierr = MatSetSizes(Rt_dense,4,matcoloring->ncolors,PETSC_DECIDE,PETSC_DECIDE);CHKERRQ(ierr);
75c4762a1bSJed Brown   ierr = MatSetType(Rt_dense,MATDENSE);CHKERRQ(ierr);
76c4762a1bSJed Brown   ierr = MatSeqDenseSetPreallocation(Rt_dense,NULL);CHKERRQ(ierr);
77c4762a1bSJed Brown   ierr = MatAssemblyBegin(Rt_dense,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
78c4762a1bSJed Brown   ierr = MatAssemblyEnd(Rt_dense,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
79c4762a1bSJed Brown   ierr = MatGetLocalSize(Rt_dense,&m,&n);CHKERRQ(ierr);
808fffc762SJacob Faibussowitsch   ierr = PetscPrintf(PETSC_COMM_SELF,"Rt_dense: %" PetscInt_FMT ",%" PetscInt_FMT "\n",m,n);CHKERRQ(ierr);
81c4762a1bSJed Brown 
82c4762a1bSJed Brown   /* Get Rt_dense by Apply MatTransposeColoring to R */
83c4762a1bSJed Brown   ierr = MatTransColoringApplySpToDen(matcoloring,R,Rt_dense);CHKERRQ(ierr);
84c4762a1bSJed Brown 
85c4762a1bSJed Brown   /* C_dense = A*Rt_dense */
86c4762a1bSJed Brown   ierr = MatMatMult(A,Rt_dense,MAT_INITIAL_MATRIX,2.0,&C_dense);CHKERRQ(ierr);
87c4762a1bSJed Brown   ierr = MatSetOptionsPrefix(C_dense,"ARt_dense_");CHKERRQ(ierr);
88c4762a1bSJed Brown   /*ierr = MatView(C_dense,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr); */
89c4762a1bSJed Brown   /*ierr = PetscPrintf(PETSC_COMM_SELF,"\n");CHKERRQ(ierr); */
90c4762a1bSJed Brown 
91c4762a1bSJed Brown   /* Recover C from C_dense */
92c4762a1bSJed Brown   ierr = MatDuplicate(C,MAT_DO_NOT_COPY_VALUES,&C_sparse);CHKERRQ(ierr);
93c4762a1bSJed Brown   ierr = MatTransColoringApplyDenToSp(matcoloring,C_dense,C_sparse);CHKERRQ(ierr);
94c4762a1bSJed Brown   ierr = MatSetOptionsPrefix(C_sparse,"ARt_color_");CHKERRQ(ierr);
95c4762a1bSJed Brown   ierr = MatView(C_sparse,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr);
96c4762a1bSJed Brown   ierr = PetscPrintf(PETSC_COMM_SELF,"\n");CHKERRQ(ierr);
97c4762a1bSJed Brown 
98c4762a1bSJed Brown   ierr = MatDestroy(&C_dense);CHKERRQ(ierr);
99c4762a1bSJed Brown   ierr = MatDestroy(&C_sparse);CHKERRQ(ierr);
100c4762a1bSJed Brown   ierr = MatDestroy(&Rt_dense);CHKERRQ(ierr);
101c4762a1bSJed Brown   ierr = MatTransposeColoringDestroy(&matcoloring);CHKERRQ(ierr);
102c4762a1bSJed Brown   ierr = MatDestroy(&C);CHKERRQ(ierr);
103c4762a1bSJed Brown 
104c4762a1bSJed Brown   /* Test PtAP = P^T*A*P, P = R^T */
105c4762a1bSJed Brown   ierr = MatTranspose(R,MAT_INITIAL_MATRIX,&P);CHKERRQ(ierr);
106c4762a1bSJed Brown   ierr = MatPtAP(A,P,MAT_INITIAL_MATRIX,2.0,&PtAP);CHKERRQ(ierr);
107c4762a1bSJed Brown   ierr = MatSetOptionsPrefix(PtAP,"PtAP_");CHKERRQ(ierr);
108c4762a1bSJed Brown   ierr = MatView(PtAP,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr);
109c4762a1bSJed Brown   ierr = MatDestroy(&P);CHKERRQ(ierr);
110c4762a1bSJed Brown 
111c4762a1bSJed Brown   /* Test C = RARt */
112c4762a1bSJed Brown   ierr = MatRARt(A,R,MAT_INITIAL_MATRIX,2.0,&C);CHKERRQ(ierr);
113c4762a1bSJed Brown   ierr = MatRARt(A,R,MAT_REUSE_MATRIX,2.0,&C);CHKERRQ(ierr);
114c4762a1bSJed Brown   ierr = MatEqual(C,PtAP,&equal);CHKERRQ(ierr);
115*2c71b3e2SJacob Faibussowitsch   PetscCheckFalse(!equal,PETSC_COMM_SELF,PETSC_ERR_PLIB,"Error: PtAP != RARt");
116c4762a1bSJed Brown 
117c4762a1bSJed Brown   /* Free spaces */
118c4762a1bSJed Brown   ierr = MatDestroy(&C);CHKERRQ(ierr);
119c4762a1bSJed Brown   ierr = MatDestroy(&A);CHKERRQ(ierr);
120c4762a1bSJed Brown   ierr = MatDestroy(&R);CHKERRQ(ierr);
121c4762a1bSJed Brown   ierr = MatDestroy(&PtAP);CHKERRQ(ierr);
122c4762a1bSJed Brown   ierr = PetscFinalize();
123c4762a1bSJed Brown   return ierr;
124c4762a1bSJed Brown }
125c4762a1bSJed Brown 
126c4762a1bSJed Brown /*TEST
127c4762a1bSJed Brown 
128c4762a1bSJed Brown    test:
129c4762a1bSJed Brown       output_file: output/ex161.out
130c4762a1bSJed Brown    test:
131c4762a1bSJed Brown       suffix: 2
132c20d7725SJed Brown       args: -matmattransmult_via color
133c4762a1bSJed Brown       output_file: output/ex161.out
134c4762a1bSJed Brown 
135c4762a1bSJed Brown    test:
136c4762a1bSJed Brown       suffix: 3
137c20d7725SJed Brown       args: -matmattransmult_via color -matden2sp_brows 3
138c4762a1bSJed Brown       output_file: output/ex161.out
139c4762a1bSJed Brown 
140c4762a1bSJed Brown    test:
141c4762a1bSJed Brown       suffix: 4
142c20d7725SJed Brown       args: -matmattransmult_via color -matrart_via r*art
143c4762a1bSJed Brown       output_file: output/ex161.out
144c4762a1bSJed Brown 
145c4762a1bSJed Brown    test:
146c4762a1bSJed Brown       suffix: 5
147c20d7725SJed Brown       args: -matmattransmult_via color -matrart_via coloring_rart
148c4762a1bSJed Brown       output_file: output/ex161.out
149c4762a1bSJed Brown 
150c4762a1bSJed Brown TEST*/
151