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; 195f80ce2aSJacob Faibussowitsch CHKERRMPI(MPI_Comm_size(PETSC_COMM_WORLD,&size)); 202c71b3e2SJacob Faibussowitsch PetscCheckFalse(size != 1,PETSC_COMM_WORLD,PETSC_ERR_SUP,"This is a uniprocessor example only!"); 21c4762a1bSJed Brown 22c4762a1bSJed Brown /* Create seqaij A */ 235f80ce2aSJacob Faibussowitsch CHKERRQ(MatCreate(PETSC_COMM_SELF,&A)); 245f80ce2aSJacob Faibussowitsch CHKERRQ(MatSetSizes(A,4,4,4,4)); 255f80ce2aSJacob Faibussowitsch CHKERRQ(MatSetType(A,MATSEQAIJ)); 265f80ce2aSJacob Faibussowitsch CHKERRQ(MatSetFromOptions(A)); 275f80ce2aSJacob Faibussowitsch CHKERRQ(MatSetUp(A)); 285f80ce2aSJacob Faibussowitsch row = 0; col=0; val=1.0; CHKERRQ(MatSetValues(A,1,&row,1,&col,&val,ADD_VALUES)); 295f80ce2aSJacob Faibussowitsch row = 1; col=3; val=2.0; CHKERRQ(MatSetValues(A,1,&row,1,&col,&val,ADD_VALUES)); 305f80ce2aSJacob Faibussowitsch row = 2; col=2; val=3.0; CHKERRQ(MatSetValues(A,1,&row,1,&col,&val,ADD_VALUES)); 315f80ce2aSJacob Faibussowitsch row = 3; col=0; val=4.0; CHKERRQ(MatSetValues(A,1,&row,1,&col,&val,ADD_VALUES)); 325f80ce2aSJacob Faibussowitsch CHKERRQ(MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY)); 335f80ce2aSJacob Faibussowitsch CHKERRQ(MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY)); 345f80ce2aSJacob Faibussowitsch CHKERRQ(MatSetOptionsPrefix(A,"A_")); 355f80ce2aSJacob Faibussowitsch CHKERRQ(MatView(A,PETSC_VIEWER_STDOUT_WORLD)); 365f80ce2aSJacob Faibussowitsch CHKERRQ(PetscPrintf(PETSC_COMM_SELF,"\n")); 37c4762a1bSJed Brown 38c4762a1bSJed Brown /* Create seqaij R */ 395f80ce2aSJacob Faibussowitsch CHKERRQ(MatCreate(PETSC_COMM_SELF,&R)); 405f80ce2aSJacob Faibussowitsch CHKERRQ(MatSetSizes(R,2,4,2,4)); 415f80ce2aSJacob Faibussowitsch CHKERRQ(MatSetType(R,MATSEQAIJ)); 425f80ce2aSJacob Faibussowitsch CHKERRQ(MatSetFromOptions(R)); 435f80ce2aSJacob Faibussowitsch CHKERRQ(MatSetUp(R)); 445f80ce2aSJacob Faibussowitsch row = 0; col=0; CHKERRQ(MatSetValues(R,1,&row,1,&col,&one,ADD_VALUES)); 455f80ce2aSJacob Faibussowitsch row = 0; col=1; CHKERRQ(MatSetValues(R,1,&row,1,&col,&one,ADD_VALUES)); 46c4762a1bSJed Brown 475f80ce2aSJacob Faibussowitsch row = 1; col=1; CHKERRQ(MatSetValues(R,1,&row,1,&col,&one,ADD_VALUES)); 485f80ce2aSJacob Faibussowitsch row = 1; col=2; CHKERRQ(MatSetValues(R,1,&row,1,&col,&one,ADD_VALUES)); 495f80ce2aSJacob Faibussowitsch row = 1; col=3; CHKERRQ(MatSetValues(R,1,&row,1,&col,&one,ADD_VALUES)); 505f80ce2aSJacob Faibussowitsch CHKERRQ(MatAssemblyBegin(R,MAT_FINAL_ASSEMBLY)); 515f80ce2aSJacob Faibussowitsch CHKERRQ(MatAssemblyEnd(R,MAT_FINAL_ASSEMBLY)); 525f80ce2aSJacob Faibussowitsch CHKERRQ(MatSetOptionsPrefix(R,"R_")); 535f80ce2aSJacob Faibussowitsch CHKERRQ(MatView(R,PETSC_VIEWER_STDOUT_WORLD)); 545f80ce2aSJacob Faibussowitsch CHKERRQ(PetscPrintf(PETSC_COMM_SELF,"\n")); 55c4762a1bSJed Brown 56c4762a1bSJed Brown /* C = A*R^T */ 575f80ce2aSJacob Faibussowitsch CHKERRQ(MatMatTransposeMult(A,R,MAT_INITIAL_MATRIX,2.0,&C)); 585f80ce2aSJacob Faibussowitsch CHKERRQ(MatSetOptionsPrefix(C,"ARt_")); 595f80ce2aSJacob Faibussowitsch CHKERRQ(MatView(C,PETSC_VIEWER_STDOUT_WORLD)); 605f80ce2aSJacob Faibussowitsch CHKERRQ(PetscPrintf(PETSC_COMM_SELF,"\n")); 61c4762a1bSJed Brown 62c4762a1bSJed Brown /* Create MatTransposeColoring from symbolic C=A*R^T */ 635f80ce2aSJacob Faibussowitsch CHKERRQ(MatColoringCreate(C,&mc)); 645f80ce2aSJacob Faibussowitsch CHKERRQ(MatColoringSetDistance(mc,2)); 655f80ce2aSJacob Faibussowitsch /* CHKERRQ(MatColoringSetType(mc,MATCOLORINGSL)); */ 665f80ce2aSJacob Faibussowitsch CHKERRQ(MatColoringSetFromOptions(mc)); 675f80ce2aSJacob Faibussowitsch CHKERRQ(MatColoringApply(mc,&iscoloring)); 685f80ce2aSJacob Faibussowitsch CHKERRQ(MatColoringDestroy(&mc)); 695f80ce2aSJacob Faibussowitsch CHKERRQ(MatTransposeColoringCreate(C,iscoloring,&matcoloring)); 705f80ce2aSJacob Faibussowitsch CHKERRQ(ISColoringDestroy(&iscoloring)); 71c4762a1bSJed Brown 72c4762a1bSJed Brown /* Create Rt_dense */ 735f80ce2aSJacob Faibussowitsch CHKERRQ(MatCreate(PETSC_COMM_WORLD,&Rt_dense)); 745f80ce2aSJacob Faibussowitsch CHKERRQ(MatSetSizes(Rt_dense,4,matcoloring->ncolors,PETSC_DECIDE,PETSC_DECIDE)); 755f80ce2aSJacob Faibussowitsch CHKERRQ(MatSetType(Rt_dense,MATDENSE)); 765f80ce2aSJacob Faibussowitsch CHKERRQ(MatSeqDenseSetPreallocation(Rt_dense,NULL)); 775f80ce2aSJacob Faibussowitsch CHKERRQ(MatAssemblyBegin(Rt_dense,MAT_FINAL_ASSEMBLY)); 785f80ce2aSJacob Faibussowitsch CHKERRQ(MatAssemblyEnd(Rt_dense,MAT_FINAL_ASSEMBLY)); 795f80ce2aSJacob Faibussowitsch CHKERRQ(MatGetLocalSize(Rt_dense,&m,&n)); 805f80ce2aSJacob Faibussowitsch CHKERRQ(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 */ 835f80ce2aSJacob Faibussowitsch CHKERRQ(MatTransColoringApplySpToDen(matcoloring,R,Rt_dense)); 84c4762a1bSJed Brown 85c4762a1bSJed Brown /* C_dense = A*Rt_dense */ 865f80ce2aSJacob Faibussowitsch CHKERRQ(MatMatMult(A,Rt_dense,MAT_INITIAL_MATRIX,2.0,&C_dense)); 875f80ce2aSJacob Faibussowitsch CHKERRQ(MatSetOptionsPrefix(C_dense,"ARt_dense_")); 885f80ce2aSJacob Faibussowitsch /*CHKERRQ(MatView(C_dense,PETSC_VIEWER_STDOUT_WORLD)); */ 895f80ce2aSJacob Faibussowitsch /*CHKERRQ(PetscPrintf(PETSC_COMM_SELF,"\n")); */ 90c4762a1bSJed Brown 91c4762a1bSJed Brown /* Recover C from C_dense */ 925f80ce2aSJacob Faibussowitsch CHKERRQ(MatDuplicate(C,MAT_DO_NOT_COPY_VALUES,&C_sparse)); 935f80ce2aSJacob Faibussowitsch CHKERRQ(MatTransColoringApplyDenToSp(matcoloring,C_dense,C_sparse)); 945f80ce2aSJacob Faibussowitsch CHKERRQ(MatSetOptionsPrefix(C_sparse,"ARt_color_")); 955f80ce2aSJacob Faibussowitsch CHKERRQ(MatView(C_sparse,PETSC_VIEWER_STDOUT_WORLD)); 965f80ce2aSJacob Faibussowitsch CHKERRQ(PetscPrintf(PETSC_COMM_SELF,"\n")); 97c4762a1bSJed Brown 985f80ce2aSJacob Faibussowitsch CHKERRQ(MatDestroy(&C_dense)); 995f80ce2aSJacob Faibussowitsch CHKERRQ(MatDestroy(&C_sparse)); 1005f80ce2aSJacob Faibussowitsch CHKERRQ(MatDestroy(&Rt_dense)); 1015f80ce2aSJacob Faibussowitsch CHKERRQ(MatTransposeColoringDestroy(&matcoloring)); 1025f80ce2aSJacob Faibussowitsch CHKERRQ(MatDestroy(&C)); 103c4762a1bSJed Brown 104c4762a1bSJed Brown /* Test PtAP = P^T*A*P, P = R^T */ 1055f80ce2aSJacob Faibussowitsch CHKERRQ(MatTranspose(R,MAT_INITIAL_MATRIX,&P)); 1065f80ce2aSJacob Faibussowitsch CHKERRQ(MatPtAP(A,P,MAT_INITIAL_MATRIX,2.0,&PtAP)); 1075f80ce2aSJacob Faibussowitsch CHKERRQ(MatSetOptionsPrefix(PtAP,"PtAP_")); 1085f80ce2aSJacob Faibussowitsch CHKERRQ(MatView(PtAP,PETSC_VIEWER_STDOUT_WORLD)); 1095f80ce2aSJacob Faibussowitsch CHKERRQ(MatDestroy(&P)); 110c4762a1bSJed Brown 111c4762a1bSJed Brown /* Test C = RARt */ 1125f80ce2aSJacob Faibussowitsch CHKERRQ(MatRARt(A,R,MAT_INITIAL_MATRIX,2.0,&C)); 1135f80ce2aSJacob Faibussowitsch CHKERRQ(MatRARt(A,R,MAT_REUSE_MATRIX,2.0,&C)); 1145f80ce2aSJacob Faibussowitsch CHKERRQ(MatEqual(C,PtAP,&equal)); 115*28b400f6SJacob Faibussowitsch PetscCheck(equal,PETSC_COMM_SELF,PETSC_ERR_PLIB,"Error: PtAP != RARt"); 116c4762a1bSJed Brown 117c4762a1bSJed Brown /* Free spaces */ 1185f80ce2aSJacob Faibussowitsch CHKERRQ(MatDestroy(&C)); 1195f80ce2aSJacob Faibussowitsch CHKERRQ(MatDestroy(&A)); 1205f80ce2aSJacob Faibussowitsch CHKERRQ(MatDestroy(&R)); 1215f80ce2aSJacob Faibussowitsch CHKERRQ(MatDestroy(&PtAP)); 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