1f996eeb8SHong Zhang /* 2f996eeb8SHong Zhang Defines matrix-matrix-matrix product routines for MPIAIJ matrices 3f996eeb8SHong Zhang D = A * B * C 4f996eeb8SHong Zhang */ 5f996eeb8SHong Zhang #include <../src/mat/impls/aij/mpi/mpiaij.h> /*I "petscmat.h" I*/ 6f996eeb8SHong Zhang 7f996eeb8SHong Zhang #undef __FUNCT__ 8f996eeb8SHong Zhang #define __FUNCT__ "MatDestroy_MPIAIJ_MatMatMatMult" 9f996eeb8SHong Zhang PetscErrorCode MatDestroy_MPIAIJ_MatMatMatMult(Mat A) 10f996eeb8SHong Zhang { 11f996eeb8SHong Zhang Mat_MPIAIJ *a = (Mat_MPIAIJ*)A->data; 12f996eeb8SHong Zhang Mat_MatMatMatMult *matmatmatmult=a->matmatmatmult; 13f996eeb8SHong Zhang PetscErrorCode ierr; 14f996eeb8SHong Zhang 15f996eeb8SHong Zhang PetscFunctionBegin; 16f996eeb8SHong Zhang ierr = MatDestroy(&matmatmatmult->BC);CHKERRQ(ierr); 17f996eeb8SHong Zhang ierr = matmatmatmult->destroy(A);CHKERRQ(ierr); 18f996eeb8SHong Zhang ierr = PetscFree(matmatmatmult);CHKERRQ(ierr); 19f996eeb8SHong Zhang PetscFunctionReturn(0); 20f996eeb8SHong Zhang } 21f996eeb8SHong Zhang 22*20e1dc0dSstefano_zampini #if defined(PETSC_HAVE_HYPRE) 23*20e1dc0dSstefano_zampini PETSC_INTERN PetscErrorCode MatMatMatMultSymbolic_AIJ_AIJ_AIJ_wHYPRE(Mat,Mat,Mat,PetscReal,Mat*); 24*20e1dc0dSstefano_zampini #endif 25*20e1dc0dSstefano_zampini 26f996eeb8SHong Zhang #undef __FUNCT__ 27f996eeb8SHong Zhang #define __FUNCT__ "MatMatMatMult_MPIAIJ_MPIAIJ_MPIAIJ" 28150d2497SBarry Smith PETSC_INTERN PetscErrorCode MatMatMatMult_MPIAIJ_MPIAIJ_MPIAIJ(Mat A,Mat B,Mat C,MatReuse scall,PetscReal fill,Mat *D) 29f996eeb8SHong Zhang { 30f996eeb8SHong Zhang PetscErrorCode ierr; 31f996eeb8SHong Zhang 32f996eeb8SHong Zhang PetscFunctionBegin; 33f996eeb8SHong Zhang if (scall == MAT_INITIAL_MATRIX) { 34*20e1dc0dSstefano_zampini #if defined(PETSC_HAVE_HYPRE) 35*20e1dc0dSstefano_zampini PetscBool hypre = PETSC_FALSE; 36*20e1dc0dSstefano_zampini 37*20e1dc0dSstefano_zampini ierr = PetscObjectOptionsBegin((PetscObject)B);CHKERRQ(ierr); 38*20e1dc0dSstefano_zampini ierr = PetscOptionsBool("-matmatmatmult_viahypre","Use HYPRE to perform D=A*B*C","",hypre,&hypre,NULL);CHKERRQ(ierr); 39*20e1dc0dSstefano_zampini ierr = PetscOptionsEnd();CHKERRQ(ierr); 40*20e1dc0dSstefano_zampini #endif 41f996eeb8SHong Zhang ierr = PetscLogEventBegin(MAT_MatMatMultSymbolic,A,B,C,0);CHKERRQ(ierr); 42*20e1dc0dSstefano_zampini #if !defined(PETSC_HAVE_HYPRE) 43f996eeb8SHong Zhang ierr = MatMatMatMultSymbolic_MPIAIJ_MPIAIJ_MPIAIJ(A,B,C,fill,D);CHKERRQ(ierr); 44*20e1dc0dSstefano_zampini #else 45*20e1dc0dSstefano_zampini if (hypre) { 46*20e1dc0dSstefano_zampini ierr = MatMatMatMultSymbolic_AIJ_AIJ_AIJ_wHYPRE(A,B,C,fill,D);CHKERRQ(ierr); 47*20e1dc0dSstefano_zampini } else { 48*20e1dc0dSstefano_zampini ierr = MatMatMatMultSymbolic_MPIAIJ_MPIAIJ_MPIAIJ(A,B,C,fill,D);CHKERRQ(ierr); 49*20e1dc0dSstefano_zampini } 50*20e1dc0dSstefano_zampini #endif 51f996eeb8SHong Zhang ierr = PetscLogEventEnd(MAT_MatMatMultSymbolic,A,B,C,0);CHKERRQ(ierr); 52f996eeb8SHong Zhang } 53f996eeb8SHong Zhang ierr = PetscLogEventBegin(MAT_MatMatMultNumeric,A,B,C,0);CHKERRQ(ierr); 54*20e1dc0dSstefano_zampini ierr = ((*D)->ops->matmatmultnumeric)(A,B,C,*D);CHKERRQ(ierr); 55f996eeb8SHong Zhang ierr = PetscLogEventEnd(MAT_MatMatMultNumeric,A,B,C,0);CHKERRQ(ierr); 56f996eeb8SHong Zhang PetscFunctionReturn(0); 57f996eeb8SHong Zhang } 58f996eeb8SHong Zhang 59f996eeb8SHong Zhang #undef __FUNCT__ 60f996eeb8SHong Zhang #define __FUNCT__ "MatMatMatMultSymbolic_MPIAIJ_MPIAIJ_MPIAIJ" 61f996eeb8SHong Zhang PetscErrorCode MatMatMatMultSymbolic_MPIAIJ_MPIAIJ_MPIAIJ(Mat A,Mat B,Mat C,PetscReal fill,Mat *D) 62f996eeb8SHong Zhang { 63f996eeb8SHong Zhang PetscErrorCode ierr; 64f996eeb8SHong Zhang Mat BC; 65f996eeb8SHong Zhang Mat_MatMatMatMult *matmatmatmult; 66f996eeb8SHong Zhang Mat_MPIAIJ *d; 67f996eeb8SHong Zhang PetscBool scalable=PETSC_TRUE; 68f996eeb8SHong Zhang 69f996eeb8SHong Zhang PetscFunctionBegin; 70f996eeb8SHong Zhang ierr = PetscObjectOptionsBegin((PetscObject)B);CHKERRQ(ierr); 710298fd71SBarry Smith ierr = PetscOptionsBool("-matmatmatmult_scalable","Use a scalable but slower D=A*B*C","",scalable,&scalable,NULL);CHKERRQ(ierr); 72f996eeb8SHong Zhang ierr = PetscOptionsEnd();CHKERRQ(ierr); 73f996eeb8SHong Zhang if (scalable) { 74b2405163SHong Zhang ierr = MatMatMultSymbolic_MPIAIJ_MPIAIJ(B,C,fill,&BC);CHKERRQ(ierr); 75b2405163SHong Zhang ierr = MatMatMultSymbolic_MPIAIJ_MPIAIJ(A,BC,fill,D);CHKERRQ(ierr); 76f996eeb8SHong Zhang } else { 770fc8cf34SHong Zhang ierr = MatMatMultSymbolic_MPIAIJ_MPIAIJ_nonscalable(B,C,fill,&BC);CHKERRQ(ierr); 780fc8cf34SHong Zhang ierr = MatMatMultSymbolic_MPIAIJ_MPIAIJ_nonscalable(A,BC,fill,D);CHKERRQ(ierr); 79f996eeb8SHong Zhang } 80f996eeb8SHong Zhang 81f996eeb8SHong Zhang /* create struct Mat_MatMatMatMult and attached it to *D */ 82b00a9115SJed Brown ierr = PetscNew(&matmatmatmult);CHKERRQ(ierr); 832205254eSKarl Rupp 84f996eeb8SHong Zhang matmatmatmult->BC = BC; 85f996eeb8SHong Zhang matmatmatmult->destroy = (*D)->ops->destroy; 86f996eeb8SHong Zhang d = (Mat_MPIAIJ*)(*D)->data; 87f996eeb8SHong Zhang d->matmatmatmult = matmatmatmult; 88f996eeb8SHong Zhang 89f996eeb8SHong Zhang (*D)->ops->matmatmultnumeric = MatMatMatMultNumeric_MPIAIJ_MPIAIJ_MPIAIJ; 90f996eeb8SHong Zhang (*D)->ops->destroy = MatDestroy_MPIAIJ_MatMatMatMult; 91f996eeb8SHong Zhang PetscFunctionReturn(0); 92f996eeb8SHong Zhang } 93f996eeb8SHong Zhang 94f996eeb8SHong Zhang #undef __FUNCT__ 95f996eeb8SHong Zhang #define __FUNCT__ "MatMatMatMultNumeric_MPIAIJ_MPIAIJ_MPIAIJ" 96f996eeb8SHong Zhang PetscErrorCode MatMatMatMultNumeric_MPIAIJ_MPIAIJ_MPIAIJ(Mat A,Mat B,Mat C,Mat D) 97f996eeb8SHong Zhang { 98f996eeb8SHong Zhang PetscErrorCode ierr; 99f996eeb8SHong Zhang Mat_MPIAIJ *d = (Mat_MPIAIJ*)D->data; 100f996eeb8SHong Zhang Mat_MatMatMatMult *matmatmatmult = d->matmatmatmult; 101f996eeb8SHong Zhang Mat BC = matmatmatmult->BC; 102f996eeb8SHong Zhang 103f996eeb8SHong Zhang PetscFunctionBegin; 104f996eeb8SHong Zhang ierr = (BC->ops->matmultnumeric)(B,C,BC);CHKERRQ(ierr); 105f996eeb8SHong Zhang ierr = (D->ops->matmultnumeric)(A,BC,D);CHKERRQ(ierr); 106f996eeb8SHong Zhang PetscFunctionReturn(0); 107f996eeb8SHong Zhang } 108