xref: /petsc/src/mat/impls/transpose/transm.c (revision ce94432eddcd14845bc7e8083b7f8ea723b9bf7d)
185e3dda7SBarry Smith 
2b45d2f2cSJed Brown #include <petsc-private/matimpl.h>          /*I "petscmat.h" I*/
385e3dda7SBarry Smith 
485e3dda7SBarry Smith typedef struct {
585e3dda7SBarry Smith   Mat A;
685e3dda7SBarry Smith } Mat_Transpose;
785e3dda7SBarry Smith 
885e3dda7SBarry Smith #undef __FUNCT__
985e3dda7SBarry Smith #define __FUNCT__ "MatMult_Transpose"
1085e3dda7SBarry Smith PetscErrorCode MatMult_Transpose(Mat N,Vec x,Vec y)
1185e3dda7SBarry Smith {
1285e3dda7SBarry Smith   Mat_Transpose  *Na = (Mat_Transpose*)N->data;
1385e3dda7SBarry Smith   PetscErrorCode ierr;
1485e3dda7SBarry Smith 
1585e3dda7SBarry Smith   PetscFunctionBegin;
1685e3dda7SBarry Smith   ierr = MatMultTranspose(Na->A,x,y);CHKERRQ(ierr);
1785e3dda7SBarry Smith   PetscFunctionReturn(0);
1885e3dda7SBarry Smith }
1985e3dda7SBarry Smith 
2085e3dda7SBarry Smith #undef __FUNCT__
2185e3dda7SBarry Smith #define __FUNCT__ "MatMultAdd_Transpose"
2285e3dda7SBarry Smith PetscErrorCode MatMultAdd_Transpose(Mat N,Vec v1,Vec v2,Vec v3)
2385e3dda7SBarry Smith {
2485e3dda7SBarry Smith   Mat_Transpose  *Na = (Mat_Transpose*)N->data;
2585e3dda7SBarry Smith   PetscErrorCode ierr;
2685e3dda7SBarry Smith 
2785e3dda7SBarry Smith   PetscFunctionBegin;
2885e3dda7SBarry Smith   ierr = MatMultTransposeAdd(Na->A,v1,v2,v3);CHKERRQ(ierr);
2985e3dda7SBarry Smith   PetscFunctionReturn(0);
3085e3dda7SBarry Smith }
3185e3dda7SBarry Smith 
3285e3dda7SBarry Smith #undef __FUNCT__
3347a9afc9SBarry Smith #define __FUNCT__ "MatMultTranspose_Transpose"
3447a9afc9SBarry Smith PetscErrorCode MatMultTranspose_Transpose(Mat N,Vec x,Vec y)
3547a9afc9SBarry Smith {
3647a9afc9SBarry Smith   Mat_Transpose  *Na = (Mat_Transpose*)N->data;
3747a9afc9SBarry Smith   PetscErrorCode ierr;
3847a9afc9SBarry Smith 
3947a9afc9SBarry Smith   PetscFunctionBegin;
4047a9afc9SBarry Smith   ierr = MatMult(Na->A,x,y);CHKERRQ(ierr);
4147a9afc9SBarry Smith   PetscFunctionReturn(0);
4247a9afc9SBarry Smith }
4347a9afc9SBarry Smith 
4447a9afc9SBarry Smith #undef __FUNCT__
4547a9afc9SBarry Smith #define __FUNCT__ "MatMultTransposeAdd_Transpose"
4647a9afc9SBarry Smith PetscErrorCode MatMultTransposeAdd_Transpose(Mat N,Vec v1,Vec v2,Vec v3)
4747a9afc9SBarry Smith {
4847a9afc9SBarry Smith   Mat_Transpose  *Na = (Mat_Transpose*)N->data;
4947a9afc9SBarry Smith   PetscErrorCode ierr;
5047a9afc9SBarry Smith 
5147a9afc9SBarry Smith   PetscFunctionBegin;
5247a9afc9SBarry Smith   ierr = MatMultAdd(Na->A,v1,v2,v3);CHKERRQ(ierr);
5347a9afc9SBarry Smith   PetscFunctionReturn(0);
5447a9afc9SBarry Smith }
5547a9afc9SBarry Smith 
5647a9afc9SBarry Smith #undef __FUNCT__
5785e3dda7SBarry Smith #define __FUNCT__ "MatDestroy_Transpose"
5885e3dda7SBarry Smith PetscErrorCode MatDestroy_Transpose(Mat N)
5985e3dda7SBarry Smith {
6085e3dda7SBarry Smith   Mat_Transpose  *Na = (Mat_Transpose*)N->data;
6185e3dda7SBarry Smith   PetscErrorCode ierr;
6285e3dda7SBarry Smith 
6385e3dda7SBarry Smith   PetscFunctionBegin;
646bf464f9SBarry Smith   ierr = MatDestroy(&Na->A);CHKERRQ(ierr);
65bf0cc555SLisandro Dalcin   ierr = PetscFree(N->data);CHKERRQ(ierr);
6685e3dda7SBarry Smith   PetscFunctionReturn(0);
6785e3dda7SBarry Smith }
6885e3dda7SBarry Smith 
6985e3dda7SBarry Smith #undef __FUNCT__
7085e3dda7SBarry Smith #define __FUNCT__ "MatCreateTranspose"
7185e3dda7SBarry Smith /*@
7285e3dda7SBarry Smith       MatCreateTranspose - Creates a new matrix object that behaves like A'
7385e3dda7SBarry Smith 
7485e3dda7SBarry Smith    Collective on Mat
7585e3dda7SBarry Smith 
7685e3dda7SBarry Smith    Input Parameter:
7785e3dda7SBarry Smith .   A  - the (possibly rectangular) matrix
7885e3dda7SBarry Smith 
7985e3dda7SBarry Smith    Output Parameter:
8085e3dda7SBarry Smith .   N - the matrix that represents A'
8185e3dda7SBarry Smith 
8285e3dda7SBarry Smith    Level: intermediate
8385e3dda7SBarry Smith 
8485e3dda7SBarry Smith    Notes: The transpose A' is NOT actually formed! Rather the new matrix
8585e3dda7SBarry Smith           object performs the matrix-vector product by using the MatMultTranspose() on
8685e3dda7SBarry Smith           the original matrix
8785e3dda7SBarry Smith 
8885e3dda7SBarry Smith .seealso: MatCreateNormal(), MatMult(), MatMultTranspose(), MatCreate()
8985e3dda7SBarry Smith 
9085e3dda7SBarry Smith @*/
917087cfbeSBarry Smith PetscErrorCode  MatCreateTranspose(Mat A,Mat *N)
9285e3dda7SBarry Smith {
9385e3dda7SBarry Smith   PetscErrorCode ierr;
9485e3dda7SBarry Smith   PetscInt       m,n;
9585e3dda7SBarry Smith   Mat_Transpose  *Na;
9685e3dda7SBarry Smith 
9785e3dda7SBarry Smith   PetscFunctionBegin;
9885e3dda7SBarry Smith   ierr = MatGetLocalSize(A,&m,&n);CHKERRQ(ierr);
99*ce94432eSBarry Smith   ierr = MatCreate(PetscObjectComm((PetscObject)A),N);CHKERRQ(ierr);
10085e3dda7SBarry Smith   ierr = MatSetSizes(*N,n,m,PETSC_DECIDE,PETSC_DECIDE);CHKERRQ(ierr);
101557cca28SSatish Balay   ierr = PetscObjectChangeTypeName((PetscObject)*N,MATTRANSPOSEMAT);CHKERRQ(ierr);
10285e3dda7SBarry Smith 
10385e3dda7SBarry Smith   ierr       = PetscNewLog(*N,Mat_Transpose,&Na);CHKERRQ(ierr);
10485e3dda7SBarry Smith   (*N)->data = (void*) Na;
10585e3dda7SBarry Smith   ierr       = PetscObjectReference((PetscObject)A);CHKERRQ(ierr);
10685e3dda7SBarry Smith   Na->A      = A;
10785e3dda7SBarry Smith 
10885e3dda7SBarry Smith   (*N)->ops->destroy          = MatDestroy_Transpose;
10985e3dda7SBarry Smith   (*N)->ops->mult             = MatMult_Transpose;
1106d12b599SJed Brown   (*N)->ops->multadd          = MatMultAdd_Transpose;
11147a9afc9SBarry Smith   (*N)->ops->multtranspose    = MatMultTranspose_Transpose;
11247a9afc9SBarry Smith   (*N)->ops->multtransposeadd = MatMultTransposeAdd_Transpose;
11385e3dda7SBarry Smith   (*N)->assembled             = PETSC_TRUE;
11485e3dda7SBarry Smith 
11526283091SBarry Smith   ierr = PetscLayoutSetBlockSize((*N)->rmap,A->cmap->bs);CHKERRQ(ierr);
11626283091SBarry Smith   ierr = PetscLayoutSetBlockSize((*N)->cmap,A->rmap->bs);CHKERRQ(ierr);
11726283091SBarry Smith   ierr = PetscLayoutSetUp((*N)->rmap);CHKERRQ(ierr);
11826283091SBarry Smith   ierr = PetscLayoutSetUp((*N)->cmap);CHKERRQ(ierr);
119037c98a2SJed Brown   ierr = MatSetUp(*N);CHKERRQ(ierr);
12085e3dda7SBarry Smith   PetscFunctionReturn(0);
12185e3dda7SBarry Smith }
12285e3dda7SBarry Smith 
123