xref: /petsc/src/mat/impls/transpose/transm.c (revision 7c4f633dc6bb6149cca88d301ead35a99e103cbb)
185e3dda7SBarry Smith #define PETSCMAT_DLL
285e3dda7SBarry Smith 
3*7c4f633dSBarry Smith #include "private/matimpl.h"          /*I "petscmat.h" I*/
485e3dda7SBarry Smith 
585e3dda7SBarry Smith typedef struct {
685e3dda7SBarry Smith   Mat A;
785e3dda7SBarry Smith   Vec w;
885e3dda7SBarry Smith } Mat_Transpose;
985e3dda7SBarry Smith 
1085e3dda7SBarry Smith #undef __FUNCT__
1185e3dda7SBarry Smith #define __FUNCT__ "MatMult_Transpose"
1285e3dda7SBarry Smith PetscErrorCode MatMult_Transpose(Mat N,Vec x,Vec y)
1385e3dda7SBarry Smith {
1485e3dda7SBarry Smith   Mat_Transpose  *Na = (Mat_Transpose*)N->data;
1585e3dda7SBarry Smith   PetscErrorCode ierr;
1685e3dda7SBarry Smith 
1785e3dda7SBarry Smith   PetscFunctionBegin;
1885e3dda7SBarry Smith   ierr = MatMultTranspose(Na->A,x,y);CHKERRQ(ierr);
1985e3dda7SBarry Smith   PetscFunctionReturn(0);
2085e3dda7SBarry Smith }
2185e3dda7SBarry Smith 
2285e3dda7SBarry Smith #undef __FUNCT__
2385e3dda7SBarry Smith #define __FUNCT__ "MatMultAdd_Transpose"
2485e3dda7SBarry Smith PetscErrorCode MatMultAdd_Transpose(Mat N,Vec v1,Vec v2,Vec v3)
2585e3dda7SBarry Smith {
2685e3dda7SBarry Smith   Mat_Transpose  *Na = (Mat_Transpose*)N->data;
2785e3dda7SBarry Smith   PetscErrorCode ierr;
2885e3dda7SBarry Smith 
2985e3dda7SBarry Smith   PetscFunctionBegin;
3085e3dda7SBarry Smith   ierr = MatMultTransposeAdd(Na->A,v1,v2,v3);CHKERRQ(ierr);
3185e3dda7SBarry Smith   PetscFunctionReturn(0);
3285e3dda7SBarry Smith }
3385e3dda7SBarry Smith 
3485e3dda7SBarry Smith #undef __FUNCT__
3585e3dda7SBarry Smith #define __FUNCT__ "MatDestroy_Transpose"
3685e3dda7SBarry Smith PetscErrorCode MatDestroy_Transpose(Mat N)
3785e3dda7SBarry Smith {
3885e3dda7SBarry Smith   Mat_Transpose  *Na = (Mat_Transpose*)N->data;
3985e3dda7SBarry Smith   PetscErrorCode ierr;
4085e3dda7SBarry Smith 
4185e3dda7SBarry Smith   PetscFunctionBegin;
4285e3dda7SBarry Smith   if (Na->A) { ierr = MatDestroy(Na->A);CHKERRQ(ierr); }
4385e3dda7SBarry Smith   ierr = PetscFree(Na);CHKERRQ(ierr);
4485e3dda7SBarry Smith   PetscFunctionReturn(0);
4585e3dda7SBarry Smith }
4685e3dda7SBarry Smith 
4785e3dda7SBarry Smith #undef __FUNCT__
4885e3dda7SBarry Smith #define __FUNCT__ "MatCreateTranspose"
4985e3dda7SBarry Smith /*@
5085e3dda7SBarry Smith       MatCreateTranspose - Creates a new matrix object that behaves like A'
5185e3dda7SBarry Smith 
5285e3dda7SBarry Smith    Collective on Mat
5385e3dda7SBarry Smith 
5485e3dda7SBarry Smith    Input Parameter:
5585e3dda7SBarry Smith .   A  - the (possibly rectangular) matrix
5685e3dda7SBarry Smith 
5785e3dda7SBarry Smith    Output Parameter:
5885e3dda7SBarry Smith .   N - the matrix that represents A'
5985e3dda7SBarry Smith 
6085e3dda7SBarry Smith    Level: intermediate
6185e3dda7SBarry Smith 
6285e3dda7SBarry Smith    Notes: The transpose A' is NOT actually formed! Rather the new matrix
6385e3dda7SBarry Smith           object performs the matrix-vector product by using the MatMultTranspose() on
6485e3dda7SBarry Smith           the original matrix
6585e3dda7SBarry Smith 
6685e3dda7SBarry Smith .seealso: MatCreateNormal(), MatMult(), MatMultTranspose(), MatCreate()
6785e3dda7SBarry Smith 
6885e3dda7SBarry Smith @*/
6985e3dda7SBarry Smith PetscErrorCode PETSCMAT_DLLEXPORT MatCreateTranspose(Mat A,Mat *N)
7085e3dda7SBarry Smith {
7185e3dda7SBarry Smith   PetscErrorCode ierr;
7285e3dda7SBarry Smith   PetscInt       m,n;
7385e3dda7SBarry Smith   Mat_Transpose  *Na;
7485e3dda7SBarry Smith 
7585e3dda7SBarry Smith   PetscFunctionBegin;
7685e3dda7SBarry Smith   ierr = MatGetLocalSize(A,&m,&n);CHKERRQ(ierr);
7785e3dda7SBarry Smith   ierr = MatCreate(((PetscObject)A)->comm,N);CHKERRQ(ierr);
7885e3dda7SBarry Smith   ierr = MatSetSizes(*N,n,m,PETSC_DECIDE,PETSC_DECIDE);CHKERRQ(ierr);
79557cca28SSatish Balay   ierr = PetscObjectChangeTypeName((PetscObject)*N,MATTRANSPOSEMAT);CHKERRQ(ierr);
8085e3dda7SBarry Smith 
8185e3dda7SBarry Smith   ierr      = PetscNewLog(*N,Mat_Transpose,&Na);CHKERRQ(ierr);
8285e3dda7SBarry Smith   (*N)->data = (void*) Na;
8385e3dda7SBarry Smith   ierr      = PetscObjectReference((PetscObject)A);CHKERRQ(ierr);
8485e3dda7SBarry Smith   Na->A     = A;
8585e3dda7SBarry Smith 
8685e3dda7SBarry Smith   (*N)->ops->destroy     = MatDestroy_Transpose;
8785e3dda7SBarry Smith   (*N)->ops->mult        = MatMult_Transpose;
8885e3dda7SBarry Smith   (*N)->ops->multadd     = MatMultAdd_Transpose;
8985e3dda7SBarry Smith   (*N)->assembled        = PETSC_TRUE;
9085e3dda7SBarry Smith 
91d0f46423SBarry Smith   (*N)->rmap->bs = (*N)->cmap->bs = A->rmap->bs;
92d0f46423SBarry Smith   ierr = PetscMapSetUp((*N)->rmap);CHKERRQ(ierr);
93d0f46423SBarry Smith   ierr = PetscMapSetUp((*N)->cmap);CHKERRQ(ierr);
9485e3dda7SBarry Smith   PetscFunctionReturn(0);
9585e3dda7SBarry Smith }
9685e3dda7SBarry Smith 
97