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