xref: /petsc/src/mat/impls/aij/seq/mattransposematmult.c (revision 2cff05742d817e69c47e8fb3e46a17ff701159ce)
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