1*85e3dda7SBarry Smith #define PETSCMAT_DLL 2*85e3dda7SBarry Smith 3*85e3dda7SBarry Smith #include "include/private/matimpl.h" /*I "petscmat.h" I*/ 4*85e3dda7SBarry Smith 5*85e3dda7SBarry Smith typedef struct { 6*85e3dda7SBarry Smith Mat A; 7*85e3dda7SBarry Smith Vec w; 8*85e3dda7SBarry Smith } Mat_Transpose; 9*85e3dda7SBarry Smith 10*85e3dda7SBarry Smith #undef __FUNCT__ 11*85e3dda7SBarry Smith #define __FUNCT__ "MatMult_Transpose" 12*85e3dda7SBarry Smith PetscErrorCode MatMult_Transpose(Mat N,Vec x,Vec y) 13*85e3dda7SBarry Smith { 14*85e3dda7SBarry Smith Mat_Transpose *Na = (Mat_Transpose*)N->data; 15*85e3dda7SBarry Smith PetscErrorCode ierr; 16*85e3dda7SBarry Smith 17*85e3dda7SBarry Smith PetscFunctionBegin; 18*85e3dda7SBarry Smith ierr = MatMultTranspose(Na->A,x,y);CHKERRQ(ierr); 19*85e3dda7SBarry Smith PetscFunctionReturn(0); 20*85e3dda7SBarry Smith } 21*85e3dda7SBarry Smith 22*85e3dda7SBarry Smith #undef __FUNCT__ 23*85e3dda7SBarry Smith #define __FUNCT__ "MatMultAdd_Transpose" 24*85e3dda7SBarry Smith PetscErrorCode MatMultAdd_Transpose(Mat N,Vec v1,Vec v2,Vec v3) 25*85e3dda7SBarry Smith { 26*85e3dda7SBarry Smith Mat_Transpose *Na = (Mat_Transpose*)N->data; 27*85e3dda7SBarry Smith PetscErrorCode ierr; 28*85e3dda7SBarry Smith 29*85e3dda7SBarry Smith PetscFunctionBegin; 30*85e3dda7SBarry Smith ierr = MatMultTransposeAdd(Na->A,v1,v2,v3);CHKERRQ(ierr); 31*85e3dda7SBarry Smith PetscFunctionReturn(0); 32*85e3dda7SBarry Smith } 33*85e3dda7SBarry Smith 34*85e3dda7SBarry Smith #undef __FUNCT__ 35*85e3dda7SBarry Smith #define __FUNCT__ "MatDestroy_Transpose" 36*85e3dda7SBarry Smith PetscErrorCode MatDestroy_Transpose(Mat N) 37*85e3dda7SBarry Smith { 38*85e3dda7SBarry Smith Mat_Transpose *Na = (Mat_Transpose*)N->data; 39*85e3dda7SBarry Smith PetscErrorCode ierr; 40*85e3dda7SBarry Smith 41*85e3dda7SBarry Smith PetscFunctionBegin; 42*85e3dda7SBarry Smith if (Na->A) { ierr = MatDestroy(Na->A);CHKERRQ(ierr); } 43*85e3dda7SBarry Smith ierr = PetscFree(Na);CHKERRQ(ierr); 44*85e3dda7SBarry Smith PetscFunctionReturn(0); 45*85e3dda7SBarry Smith } 46*85e3dda7SBarry Smith 47*85e3dda7SBarry Smith #undef __FUNCT__ 48*85e3dda7SBarry Smith #define __FUNCT__ "MatCreateTranspose" 49*85e3dda7SBarry Smith /*@ 50*85e3dda7SBarry Smith MatCreateTranspose - Creates a new matrix object that behaves like A' 51*85e3dda7SBarry Smith 52*85e3dda7SBarry Smith Collective on Mat 53*85e3dda7SBarry Smith 54*85e3dda7SBarry Smith Input Parameter: 55*85e3dda7SBarry Smith . A - the (possibly rectangular) matrix 56*85e3dda7SBarry Smith 57*85e3dda7SBarry Smith Output Parameter: 58*85e3dda7SBarry Smith . N - the matrix that represents A' 59*85e3dda7SBarry Smith 60*85e3dda7SBarry Smith Level: intermediate 61*85e3dda7SBarry Smith 62*85e3dda7SBarry Smith Notes: The transpose A' is NOT actually formed! Rather the new matrix 63*85e3dda7SBarry Smith object performs the matrix-vector product by using the MatMultTranspose() on 64*85e3dda7SBarry Smith the original matrix 65*85e3dda7SBarry Smith 66*85e3dda7SBarry Smith .seealso: MatCreateNormal(), MatMult(), MatMultTranspose(), MatCreate() 67*85e3dda7SBarry Smith 68*85e3dda7SBarry Smith @*/ 69*85e3dda7SBarry Smith PetscErrorCode PETSCMAT_DLLEXPORT MatCreateTranspose(Mat A,Mat *N) 70*85e3dda7SBarry Smith { 71*85e3dda7SBarry Smith PetscErrorCode ierr; 72*85e3dda7SBarry Smith PetscInt m,n; 73*85e3dda7SBarry Smith Mat_Transpose *Na; 74*85e3dda7SBarry Smith 75*85e3dda7SBarry Smith PetscFunctionBegin; 76*85e3dda7SBarry Smith ierr = MatGetLocalSize(A,&m,&n);CHKERRQ(ierr); 77*85e3dda7SBarry Smith ierr = MatCreate(((PetscObject)A)->comm,N);CHKERRQ(ierr); 78*85e3dda7SBarry Smith ierr = MatSetSizes(*N,n,m,PETSC_DECIDE,PETSC_DECIDE);CHKERRQ(ierr); 79*85e3dda7SBarry Smith ierr = PetscObjectChangeTypeName((PetscObject)*N,MATTRANSPOSE);CHKERRQ(ierr); 80*85e3dda7SBarry Smith 81*85e3dda7SBarry Smith ierr = PetscNewLog(*N,Mat_Transpose,&Na);CHKERRQ(ierr); 82*85e3dda7SBarry Smith (*N)->data = (void*) Na; 83*85e3dda7SBarry Smith ierr = PetscObjectReference((PetscObject)A);CHKERRQ(ierr); 84*85e3dda7SBarry Smith Na->A = A; 85*85e3dda7SBarry Smith 86*85e3dda7SBarry Smith (*N)->ops->destroy = MatDestroy_Transpose; 87*85e3dda7SBarry Smith (*N)->ops->mult = MatMult_Transpose; 88*85e3dda7SBarry Smith (*N)->ops->multadd = MatMultAdd_Transpose; 89*85e3dda7SBarry Smith (*N)->assembled = PETSC_TRUE; 90*85e3dda7SBarry Smith 91*85e3dda7SBarry Smith (*N)->rmap.bs = (*N)->cmap.bs = A->rmap.bs; 92*85e3dda7SBarry Smith ierr = PetscMapSetUp(&(*N)->rmap);CHKERRQ(ierr); 93*85e3dda7SBarry Smith ierr = PetscMapSetUp(&(*N)->cmap);CHKERRQ(ierr); 94*85e3dda7SBarry Smith PetscFunctionReturn(0); 95*85e3dda7SBarry Smith } 96*85e3dda7SBarry Smith 97