17a94429cSHong Zhang 27a94429cSHong Zhang /* 3*2cff0574SHong Zhang Defines matrix-matrix product routines 47a94429cSHong Zhang C = A^T * B 57a94429cSHong Zhang */ 67a94429cSHong Zhang 77a94429cSHong Zhang #include <../src/mat/impls/aij/seq/aij.h> /*I "petscmat.h" I*/ 87a94429cSHong Zhang 97a94429cSHong Zhang #undef __FUNCT__ 107a94429cSHong Zhang #define __FUNCT__ "MatTransposeMatMult_SeqAIJ_SeqDense" 117a94429cSHong Zhang PetscErrorCode MatTransposeMatMult_SeqAIJ_SeqDense(Mat A,Mat B,MatReuse scall,PetscReal fill,Mat *C) 127a94429cSHong Zhang { 137a94429cSHong Zhang PetscErrorCode ierr; 147a94429cSHong Zhang PetscInt i,j,k,m,n,dof=B->cmap->N; 157a94429cSHong Zhang Mat_MatTransMatMult *atb; 167a94429cSHong Zhang Mat Cdense; 177a94429cSHong Zhang PetscScalar *Barray,*Carray,*btarray,*ctarray; 187a94429cSHong Zhang Vec bt,ct; 197a94429cSHong Zhang 207a94429cSHong Zhang PetscFunctionBegin; 217a94429cSHong Zhang ierr = PetscNew(Mat_MatTransMatMult,&atb);CHKERRQ(ierr); 227a94429cSHong Zhang 237a94429cSHong Zhang /* create MAIJ matrix mA from A */ 247a94429cSHong Zhang ierr = MatCreateMAIJ(A,dof,&atb->mA);CHKERRQ(ierr); 257a94429cSHong Zhang 267a94429cSHong Zhang /* create output dense matrix C = A^T*B */ 277a94429cSHong Zhang ierr = MatGetLocalSize(A,&m,&n);CHKERRQ(ierr); 287a94429cSHong Zhang ierr = MatCreate(PetscObjectComm((PetscObject)A),&Cdense);CHKERRQ(ierr); 297a94429cSHong Zhang ierr = MatSetSizes(Cdense,n,dof,PETSC_DECIDE,PETSC_DECIDE);CHKERRQ(ierr); 307a94429cSHong Zhang ierr = MatSetType(Cdense,MATDENSE);CHKERRQ(ierr); 317a94429cSHong Zhang ierr = MatSeqDenseSetPreallocation(Cdense,NULL);CHKERRQ(ierr); 327a94429cSHong Zhang //ierr = MatMPIDenseSetPreallocation(Cdense,NULL);CHKERRQ(ierr); 337a94429cSHong Zhang 347a94429cSHong Zhang /* create vectors bt and ct to hold locally transposed arrays of B and C */ 357a94429cSHong Zhang ierr = VecCreate(PETSC_COMM_SELF,&bt);CHKERRQ(ierr); 367a94429cSHong Zhang ierr = VecSetSizes(bt,m*dof,m*dof);CHKERRQ(ierr); 377a94429cSHong Zhang ierr = VecSetFromOptions(bt);CHKERRQ(ierr); 387a94429cSHong Zhang ierr = VecCreate(PETSC_COMM_SELF,&ct);CHKERRQ(ierr); 397a94429cSHong Zhang ierr = VecSetSizes(ct,n*dof,n*dof);CHKERRQ(ierr); 407a94429cSHong Zhang ierr = VecSetFromOptions(ct);CHKERRQ(ierr); 417a94429cSHong Zhang atb->bt = bt; 427a94429cSHong Zhang atb->ct = ct; 437a94429cSHong Zhang 447a94429cSHong Zhang /* transpose local arry of B, then copy it to vector bt */ 457a94429cSHong Zhang ierr = MatDenseGetArray(B,&Barray);CHKERRQ(ierr); 467a94429cSHong Zhang ierr = VecGetArray(bt,&btarray);CHKERRQ(ierr); 477a94429cSHong Zhang 487a94429cSHong Zhang k=0; 497a94429cSHong Zhang for (j=0; j<dof; j++) { 507a94429cSHong Zhang for (i=0; i<m; i++) btarray[i*dof + j] = Barray[k++]; 517a94429cSHong Zhang } 527a94429cSHong Zhang ierr = VecRestoreArray(bt,&btarray);CHKERRQ(ierr); 537a94429cSHong Zhang ierr = MatDenseRestoreArray(B,&Barray);CHKERRQ(ierr); 547a94429cSHong Zhang 557a94429cSHong Zhang /* compute ct = mA^T * cb */ 567a94429cSHong Zhang ierr = MatMultTranspose(atb->mA,bt,ct);CHKERRQ(ierr); 577a94429cSHong Zhang 587a94429cSHong Zhang /* transpose local arry of ct to matrix C */ 597a94429cSHong Zhang ierr = MatDenseGetArray(Cdense,&Carray);CHKERRQ(ierr); 607a94429cSHong Zhang ierr = VecGetArray(ct,&ctarray);CHKERRQ(ierr); 617a94429cSHong Zhang k = 0; 627a94429cSHong Zhang for (j=0; j<dof; j++) { 637a94429cSHong Zhang for (i=0; i<n; i++) Carray[k++] = ctarray[i*dof + j]; 647a94429cSHong Zhang } 657a94429cSHong Zhang ierr = VecRestoreArray(ct,&ctarray);CHKERRQ(ierr); 667a94429cSHong Zhang ierr = MatDenseRestoreArray(Cdense,&Carray);CHKERRQ(ierr); 677a94429cSHong Zhang 687a94429cSHong Zhang *C = Cdense; 697a94429cSHong Zhang 707a94429cSHong Zhang ierr = MatDestroy(&atb->mA);CHKERRQ(ierr); 717a94429cSHong Zhang ierr = VecDestroy(&atb->bt);CHKERRQ(ierr); 727a94429cSHong Zhang ierr = VecDestroy(&atb->ct);CHKERRQ(ierr); 737a94429cSHong Zhang ierr = PetscFree(atb);CHKERRQ(ierr); 747a94429cSHong Zhang PetscFunctionReturn(0); 757a94429cSHong Zhang } 767a94429cSHong Zhang 777a94429cSHong Zhang #undef __FUNCT__ 787a94429cSHong Zhang #define __FUNCT__ "MatTransposeMatMultSymbolic_SeqAIJ_SeqDense" 797a94429cSHong Zhang PetscErrorCode MatTransposeMatMultSymbolic_SeqAIJ_SeqDense(Mat A,Mat B,PetscReal fill,Mat *C) 807a94429cSHong Zhang { 817a94429cSHong Zhang //PetscErrorCode ierr; 827a94429cSHong Zhang 837a94429cSHong Zhang PetscFunctionBegin; 847a94429cSHong Zhang PetscFunctionReturn(0); 857a94429cSHong Zhang } 867a94429cSHong Zhang 877a94429cSHong Zhang #undef __FUNCT__ 887a94429cSHong Zhang #define __FUNCT__ "MatTransposeMatMultNumeric_SeqAIJ_SeqDense" 897a94429cSHong Zhang PetscErrorCode MatTransposeMatMultNumeric_SeqAIJ_SeqDense(Mat A,Mat B,Mat C) 907a94429cSHong Zhang { 917a94429cSHong Zhang //PetscErrorCode ierr; 927a94429cSHong Zhang 937a94429cSHong Zhang PetscFunctionBegin; 947a94429cSHong Zhang PetscFunctionReturn(0); 957a94429cSHong Zhang } 96