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