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