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 MatScalar one =1.0,val; 11c4762a1bSJed Brown MatColoring mc; 12c4762a1bSJed Brown MatTransposeColoring matcoloring = 0; 13c4762a1bSJed Brown ISColoring iscoloring; 14c4762a1bSJed Brown PetscBool equal; 15c4762a1bSJed Brown PetscMPIInt size; 16c4762a1bSJed Brown 17*327415f7SBarry Smith PetscFunctionBeginUser; 189566063dSJacob Faibussowitsch PetscCall(PetscInitialize(&argc,&argv,(char*)0,help)); 199566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_size(PETSC_COMM_WORLD,&size)); 20be096a46SBarry Smith PetscCheck(size == 1,PETSC_COMM_WORLD,PETSC_ERR_WRONG_MPI_SIZE,"This is a uniprocessor example only!"); 21c4762a1bSJed Brown 22c4762a1bSJed Brown /* Create seqaij A */ 239566063dSJacob Faibussowitsch PetscCall(MatCreate(PETSC_COMM_SELF,&A)); 249566063dSJacob Faibussowitsch PetscCall(MatSetSizes(A,4,4,4,4)); 259566063dSJacob Faibussowitsch PetscCall(MatSetType(A,MATSEQAIJ)); 269566063dSJacob Faibussowitsch PetscCall(MatSetFromOptions(A)); 279566063dSJacob Faibussowitsch PetscCall(MatSetUp(A)); 289566063dSJacob Faibussowitsch row = 0; col=0; val=1.0; PetscCall(MatSetValues(A,1,&row,1,&col,&val,ADD_VALUES)); 299566063dSJacob Faibussowitsch row = 1; col=3; val=2.0; PetscCall(MatSetValues(A,1,&row,1,&col,&val,ADD_VALUES)); 309566063dSJacob Faibussowitsch row = 2; col=2; val=3.0; PetscCall(MatSetValues(A,1,&row,1,&col,&val,ADD_VALUES)); 319566063dSJacob Faibussowitsch row = 3; col=0; val=4.0; PetscCall(MatSetValues(A,1,&row,1,&col,&val,ADD_VALUES)); 329566063dSJacob Faibussowitsch PetscCall(MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY)); 339566063dSJacob Faibussowitsch PetscCall(MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY)); 349566063dSJacob Faibussowitsch PetscCall(MatSetOptionsPrefix(A,"A_")); 359566063dSJacob Faibussowitsch PetscCall(MatView(A,PETSC_VIEWER_STDOUT_WORLD)); 369566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_SELF,"\n")); 37c4762a1bSJed Brown 38c4762a1bSJed Brown /* Create seqaij R */ 399566063dSJacob Faibussowitsch PetscCall(MatCreate(PETSC_COMM_SELF,&R)); 409566063dSJacob Faibussowitsch PetscCall(MatSetSizes(R,2,4,2,4)); 419566063dSJacob Faibussowitsch PetscCall(MatSetType(R,MATSEQAIJ)); 429566063dSJacob Faibussowitsch PetscCall(MatSetFromOptions(R)); 439566063dSJacob Faibussowitsch PetscCall(MatSetUp(R)); 449566063dSJacob Faibussowitsch row = 0; col=0; PetscCall(MatSetValues(R,1,&row,1,&col,&one,ADD_VALUES)); 459566063dSJacob Faibussowitsch row = 0; col=1; PetscCall(MatSetValues(R,1,&row,1,&col,&one,ADD_VALUES)); 46c4762a1bSJed Brown 479566063dSJacob Faibussowitsch row = 1; col=1; PetscCall(MatSetValues(R,1,&row,1,&col,&one,ADD_VALUES)); 489566063dSJacob Faibussowitsch row = 1; col=2; PetscCall(MatSetValues(R,1,&row,1,&col,&one,ADD_VALUES)); 499566063dSJacob Faibussowitsch row = 1; col=3; PetscCall(MatSetValues(R,1,&row,1,&col,&one,ADD_VALUES)); 509566063dSJacob Faibussowitsch PetscCall(MatAssemblyBegin(R,MAT_FINAL_ASSEMBLY)); 519566063dSJacob Faibussowitsch PetscCall(MatAssemblyEnd(R,MAT_FINAL_ASSEMBLY)); 529566063dSJacob Faibussowitsch PetscCall(MatSetOptionsPrefix(R,"R_")); 539566063dSJacob Faibussowitsch PetscCall(MatView(R,PETSC_VIEWER_STDOUT_WORLD)); 549566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_SELF,"\n")); 55c4762a1bSJed Brown 56c4762a1bSJed Brown /* C = A*R^T */ 579566063dSJacob Faibussowitsch PetscCall(MatMatTransposeMult(A,R,MAT_INITIAL_MATRIX,2.0,&C)); 589566063dSJacob Faibussowitsch PetscCall(MatSetOptionsPrefix(C,"ARt_")); 599566063dSJacob Faibussowitsch PetscCall(MatView(C,PETSC_VIEWER_STDOUT_WORLD)); 609566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_SELF,"\n")); 61c4762a1bSJed Brown 62c4762a1bSJed Brown /* Create MatTransposeColoring from symbolic C=A*R^T */ 639566063dSJacob Faibussowitsch PetscCall(MatColoringCreate(C,&mc)); 649566063dSJacob Faibussowitsch PetscCall(MatColoringSetDistance(mc,2)); 659566063dSJacob Faibussowitsch /* PetscCall(MatColoringSetType(mc,MATCOLORINGSL)); */ 669566063dSJacob Faibussowitsch PetscCall(MatColoringSetFromOptions(mc)); 679566063dSJacob Faibussowitsch PetscCall(MatColoringApply(mc,&iscoloring)); 689566063dSJacob Faibussowitsch PetscCall(MatColoringDestroy(&mc)); 699566063dSJacob Faibussowitsch PetscCall(MatTransposeColoringCreate(C,iscoloring,&matcoloring)); 709566063dSJacob Faibussowitsch PetscCall(ISColoringDestroy(&iscoloring)); 71c4762a1bSJed Brown 72c4762a1bSJed Brown /* Create Rt_dense */ 739566063dSJacob Faibussowitsch PetscCall(MatCreate(PETSC_COMM_WORLD,&Rt_dense)); 749566063dSJacob Faibussowitsch PetscCall(MatSetSizes(Rt_dense,4,matcoloring->ncolors,PETSC_DECIDE,PETSC_DECIDE)); 759566063dSJacob Faibussowitsch PetscCall(MatSetType(Rt_dense,MATDENSE)); 769566063dSJacob Faibussowitsch PetscCall(MatSeqDenseSetPreallocation(Rt_dense,NULL)); 779566063dSJacob Faibussowitsch PetscCall(MatAssemblyBegin(Rt_dense,MAT_FINAL_ASSEMBLY)); 789566063dSJacob Faibussowitsch PetscCall(MatAssemblyEnd(Rt_dense,MAT_FINAL_ASSEMBLY)); 799566063dSJacob Faibussowitsch PetscCall(MatGetLocalSize(Rt_dense,&m,&n)); 809566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_SELF,"Rt_dense: %" PetscInt_FMT ",%" PetscInt_FMT "\n",m,n)); 81c4762a1bSJed Brown 82c4762a1bSJed Brown /* Get Rt_dense by Apply MatTransposeColoring to R */ 839566063dSJacob Faibussowitsch PetscCall(MatTransColoringApplySpToDen(matcoloring,R,Rt_dense)); 84c4762a1bSJed Brown 85c4762a1bSJed Brown /* C_dense = A*Rt_dense */ 869566063dSJacob Faibussowitsch PetscCall(MatMatMult(A,Rt_dense,MAT_INITIAL_MATRIX,2.0,&C_dense)); 879566063dSJacob Faibussowitsch PetscCall(MatSetOptionsPrefix(C_dense,"ARt_dense_")); 889566063dSJacob Faibussowitsch /*PetscCall(MatView(C_dense,PETSC_VIEWER_STDOUT_WORLD)); */ 899566063dSJacob Faibussowitsch /*PetscCall(PetscPrintf(PETSC_COMM_SELF,"\n")); */ 90c4762a1bSJed Brown 91c4762a1bSJed Brown /* Recover C from C_dense */ 929566063dSJacob Faibussowitsch PetscCall(MatDuplicate(C,MAT_DO_NOT_COPY_VALUES,&C_sparse)); 939566063dSJacob Faibussowitsch PetscCall(MatTransColoringApplyDenToSp(matcoloring,C_dense,C_sparse)); 949566063dSJacob Faibussowitsch PetscCall(MatSetOptionsPrefix(C_sparse,"ARt_color_")); 959566063dSJacob Faibussowitsch PetscCall(MatView(C_sparse,PETSC_VIEWER_STDOUT_WORLD)); 969566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_SELF,"\n")); 97c4762a1bSJed Brown 989566063dSJacob Faibussowitsch PetscCall(MatDestroy(&C_dense)); 999566063dSJacob Faibussowitsch PetscCall(MatDestroy(&C_sparse)); 1009566063dSJacob Faibussowitsch PetscCall(MatDestroy(&Rt_dense)); 1019566063dSJacob Faibussowitsch PetscCall(MatTransposeColoringDestroy(&matcoloring)); 1029566063dSJacob Faibussowitsch PetscCall(MatDestroy(&C)); 103c4762a1bSJed Brown 104c4762a1bSJed Brown /* Test PtAP = P^T*A*P, P = R^T */ 1059566063dSJacob Faibussowitsch PetscCall(MatTranspose(R,MAT_INITIAL_MATRIX,&P)); 1069566063dSJacob Faibussowitsch PetscCall(MatPtAP(A,P,MAT_INITIAL_MATRIX,2.0,&PtAP)); 1079566063dSJacob Faibussowitsch PetscCall(MatSetOptionsPrefix(PtAP,"PtAP_")); 1089566063dSJacob Faibussowitsch PetscCall(MatView(PtAP,PETSC_VIEWER_STDOUT_WORLD)); 1099566063dSJacob Faibussowitsch PetscCall(MatDestroy(&P)); 110c4762a1bSJed Brown 111c4762a1bSJed Brown /* Test C = RARt */ 1129566063dSJacob Faibussowitsch PetscCall(MatRARt(A,R,MAT_INITIAL_MATRIX,2.0,&C)); 1139566063dSJacob Faibussowitsch PetscCall(MatRARt(A,R,MAT_REUSE_MATRIX,2.0,&C)); 1149566063dSJacob Faibussowitsch PetscCall(MatEqual(C,PtAP,&equal)); 11528b400f6SJacob Faibussowitsch PetscCheck(equal,PETSC_COMM_SELF,PETSC_ERR_PLIB,"Error: PtAP != RARt"); 116c4762a1bSJed Brown 117c4762a1bSJed Brown /* Free spaces */ 1189566063dSJacob Faibussowitsch PetscCall(MatDestroy(&C)); 1199566063dSJacob Faibussowitsch PetscCall(MatDestroy(&A)); 1209566063dSJacob Faibussowitsch PetscCall(MatDestroy(&R)); 1219566063dSJacob Faibussowitsch PetscCall(MatDestroy(&PtAP)); 1229566063dSJacob Faibussowitsch PetscCall(PetscFinalize()); 123b122ec5aSJacob Faibussowitsch return 0; 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