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 22f996eeb8SHong Zhang #undef __FUNCT__ 23f996eeb8SHong Zhang #define __FUNCT__ "MatMatMatMult_MPIAIJ_MPIAIJ_MPIAIJ" 24f996eeb8SHong Zhang PetscErrorCode MatMatMatMult_MPIAIJ_MPIAIJ_MPIAIJ(Mat A,Mat B,Mat C,MatReuse scall,PetscReal fill,Mat *D) 25f996eeb8SHong Zhang { 26f996eeb8SHong Zhang PetscErrorCode ierr; 27f996eeb8SHong Zhang 28f996eeb8SHong Zhang PetscFunctionBegin; 29f996eeb8SHong Zhang if (scall == MAT_INITIAL_MATRIX) { 30f996eeb8SHong Zhang ierr = PetscLogEventBegin(MAT_MatMatMultSymbolic,A,B,C,0);CHKERRQ(ierr); 31f996eeb8SHong Zhang ierr = MatMatMatMultSymbolic_MPIAIJ_MPIAIJ_MPIAIJ(A,B,C,fill,D);CHKERRQ(ierr); 32f996eeb8SHong Zhang ierr = PetscLogEventEnd(MAT_MatMatMultSymbolic,A,B,C,0);CHKERRQ(ierr); 33f996eeb8SHong Zhang } 34f996eeb8SHong Zhang ierr = PetscLogEventBegin(MAT_MatMatMultNumeric,A,B,C,0);CHKERRQ(ierr); 35f996eeb8SHong Zhang ierr = MatMatMatMultNumeric_MPIAIJ_MPIAIJ_MPIAIJ(A,B,C,*D);CHKERRQ(ierr); 36f996eeb8SHong Zhang ierr = PetscLogEventEnd(MAT_MatMatMultNumeric,A,B,C,0);CHKERRQ(ierr); 37f996eeb8SHong Zhang PetscFunctionReturn(0); 38f996eeb8SHong Zhang } 39f996eeb8SHong Zhang 40f996eeb8SHong Zhang #undef __FUNCT__ 41f996eeb8SHong Zhang #define __FUNCT__ "MatMatMatMultSymbolic_MPIAIJ_MPIAIJ_MPIAIJ" 42f996eeb8SHong Zhang PetscErrorCode MatMatMatMultSymbolic_MPIAIJ_MPIAIJ_MPIAIJ(Mat A,Mat B,Mat C,PetscReal fill,Mat *D) 43f996eeb8SHong Zhang { 44f996eeb8SHong Zhang PetscErrorCode ierr; 45f996eeb8SHong Zhang Mat BC; 46f996eeb8SHong Zhang Mat_MatMatMatMult *matmatmatmult; 47f996eeb8SHong Zhang Mat_MPIAIJ *d; 48f996eeb8SHong Zhang PetscBool scalable=PETSC_TRUE; 49f996eeb8SHong Zhang 50f996eeb8SHong Zhang PetscFunctionBegin; 51f996eeb8SHong Zhang ierr = PetscObjectOptionsBegin((PetscObject)B);CHKERRQ(ierr); 520298fd71SBarry Smith ierr = PetscOptionsBool("-matmatmatmult_scalable","Use a scalable but slower D=A*B*C","",scalable,&scalable,NULL);CHKERRQ(ierr); 53f996eeb8SHong Zhang ierr = PetscOptionsEnd();CHKERRQ(ierr); 54f996eeb8SHong Zhang if (scalable) { 55b2405163SHong Zhang ierr = MatMatMultSymbolic_MPIAIJ_MPIAIJ(B,C,fill,&BC);CHKERRQ(ierr); 56b2405163SHong Zhang ierr = MatMatMultSymbolic_MPIAIJ_MPIAIJ(A,BC,fill,D);CHKERRQ(ierr); 57f996eeb8SHong Zhang } else { 580fc8cf34SHong Zhang ierr = MatMatMultSymbolic_MPIAIJ_MPIAIJ_nonscalable(B,C,fill,&BC);CHKERRQ(ierr); 590fc8cf34SHong Zhang ierr = MatMatMultSymbolic_MPIAIJ_MPIAIJ_nonscalable(A,BC,fill,D);CHKERRQ(ierr); 60f996eeb8SHong Zhang } 61f996eeb8SHong Zhang 62f996eeb8SHong Zhang /* create struct Mat_MatMatMatMult and attached it to *D */ 63*b00a9115SJed Brown ierr = PetscNew(&matmatmatmult);CHKERRQ(ierr); 642205254eSKarl Rupp 65f996eeb8SHong Zhang matmatmatmult->BC = BC; 66f996eeb8SHong Zhang matmatmatmult->destroy = (*D)->ops->destroy; 67f996eeb8SHong Zhang d = (Mat_MPIAIJ*)(*D)->data; 68f996eeb8SHong Zhang d->matmatmatmult = matmatmatmult; 69f996eeb8SHong Zhang 70f996eeb8SHong Zhang (*D)->ops->matmatmultnumeric = MatMatMatMultNumeric_MPIAIJ_MPIAIJ_MPIAIJ; 71f996eeb8SHong Zhang (*D)->ops->destroy = MatDestroy_MPIAIJ_MatMatMatMult; 72f996eeb8SHong Zhang PetscFunctionReturn(0); 73f996eeb8SHong Zhang } 74f996eeb8SHong Zhang 75f996eeb8SHong Zhang #undef __FUNCT__ 76f996eeb8SHong Zhang #define __FUNCT__ "MatMatMatMultNumeric_MPIAIJ_MPIAIJ_MPIAIJ" 77f996eeb8SHong Zhang PetscErrorCode MatMatMatMultNumeric_MPIAIJ_MPIAIJ_MPIAIJ(Mat A,Mat B,Mat C,Mat D) 78f996eeb8SHong Zhang { 79f996eeb8SHong Zhang PetscErrorCode ierr; 80f996eeb8SHong Zhang Mat_MPIAIJ *d = (Mat_MPIAIJ*)D->data; 81f996eeb8SHong Zhang Mat_MatMatMatMult *matmatmatmult = d->matmatmatmult; 82f996eeb8SHong Zhang Mat BC = matmatmatmult->BC; 83f996eeb8SHong Zhang 84f996eeb8SHong Zhang PetscFunctionBegin; 85f996eeb8SHong Zhang ierr = (BC->ops->matmultnumeric)(B,C,BC);CHKERRQ(ierr); 86f996eeb8SHong Zhang ierr = (D->ops->matmultnumeric)(A,BC,D);CHKERRQ(ierr); 87f996eeb8SHong Zhang PetscFunctionReturn(0); 88f996eeb8SHong Zhang } 89