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