1d0de2241SAndrew Spott 2d0de2241SAndrew Spott #include <petsc-private/matimpl.h> /*I "petscmat.h" I*/ 3d0de2241SAndrew Spott 4d0de2241SAndrew Spott typedef struct { 5d0de2241SAndrew Spott Mat A; 6*fb41c00aSBarry Smith } Mat_HT; 7d0de2241SAndrew Spott 8d0de2241SAndrew Spott #undef __FUNCT__ 9*fb41c00aSBarry Smith #define __FUNCT__ "MatMult_HT" 10*fb41c00aSBarry Smith PetscErrorCode MatMult_HT(Mat N,Vec x,Vec y) 11d0de2241SAndrew Spott { 12*fb41c00aSBarry Smith Mat_HT *Na = (Mat_HT*)N->data; 13d0de2241SAndrew Spott PetscErrorCode ierr; 14d0de2241SAndrew Spott 15d0de2241SAndrew Spott PetscFunctionBegin; 16d0de2241SAndrew Spott ierr = MatMultHermitianTranspose(Na->A,x,y);CHKERRQ(ierr); 17d0de2241SAndrew Spott PetscFunctionReturn(0); 18d0de2241SAndrew Spott } 19d0de2241SAndrew Spott 20d0de2241SAndrew Spott #undef __FUNCT__ 21*fb41c00aSBarry Smith #define __FUNCT__ "MatMultAdd_HT" 22*fb41c00aSBarry Smith PetscErrorCode MatMultAdd_HT(Mat N,Vec v1,Vec v2,Vec v3) 23d0de2241SAndrew Spott { 24*fb41c00aSBarry Smith Mat_HT *Na = (Mat_HT*)N->data; 25d0de2241SAndrew Spott PetscErrorCode ierr; 26d0de2241SAndrew Spott 27d0de2241SAndrew Spott PetscFunctionBegin; 28d0de2241SAndrew Spott ierr = MatMultHermitianTransposeAdd(Na->A,v1,v2,v3);CHKERRQ(ierr); 29d0de2241SAndrew Spott PetscFunctionReturn(0); 30d0de2241SAndrew Spott } 31d0de2241SAndrew Spott 32d0de2241SAndrew Spott #undef __FUNCT__ 33*fb41c00aSBarry Smith #define __FUNCT__ "MatMultHermitianTranspose_HT" 34*fb41c00aSBarry Smith PetscErrorCode MatMultHermitianTranspose_HT(Mat N,Vec x,Vec y) 35d0de2241SAndrew Spott { 36*fb41c00aSBarry Smith Mat_HT *Na = (Mat_HT*)N->data; 37d0de2241SAndrew Spott PetscErrorCode ierr; 38d0de2241SAndrew Spott 39d0de2241SAndrew Spott PetscFunctionBegin; 40d0de2241SAndrew Spott ierr = MatMult(Na->A,x,y);CHKERRQ(ierr); 41d0de2241SAndrew Spott PetscFunctionReturn(0); 42d0de2241SAndrew Spott } 43d0de2241SAndrew Spott 44d0de2241SAndrew Spott #undef __FUNCT__ 45*fb41c00aSBarry Smith #define __FUNCT__ "MatMultHermitianTransposeAdd_HT" 46*fb41c00aSBarry Smith PetscErrorCode MatMultHermitianTransposeAdd_HT(Mat N,Vec v1,Vec v2,Vec v3) 47d0de2241SAndrew Spott { 48*fb41c00aSBarry Smith Mat_HT *Na = (Mat_HT*)N->data; 49d0de2241SAndrew Spott PetscErrorCode ierr; 50d0de2241SAndrew Spott 51d0de2241SAndrew Spott PetscFunctionBegin; 52d0de2241SAndrew Spott ierr = MatMultAdd(Na->A,v1,v2,v3);CHKERRQ(ierr); 53d0de2241SAndrew Spott PetscFunctionReturn(0); 54d0de2241SAndrew Spott } 55d0de2241SAndrew Spott 56d0de2241SAndrew Spott #undef __FUNCT__ 57*fb41c00aSBarry Smith #define __FUNCT__ "MatDestroy_HT" 58*fb41c00aSBarry Smith PetscErrorCode MatDestroy_HT(Mat N) 59d0de2241SAndrew Spott { 60*fb41c00aSBarry Smith Mat_HT *Na = (Mat_HT*)N->data; 61d0de2241SAndrew Spott PetscErrorCode ierr; 62d0de2241SAndrew Spott 63d0de2241SAndrew Spott PetscFunctionBegin; 64d0de2241SAndrew Spott ierr = MatDestroy(&Na->A);CHKERRQ(ierr); 65d0de2241SAndrew Spott ierr = PetscFree(N->data);CHKERRQ(ierr); 66d0de2241SAndrew Spott PetscFunctionReturn(0); 67d0de2241SAndrew Spott } 68d0de2241SAndrew Spott 69d0de2241SAndrew Spott #undef __FUNCT__ 70*fb41c00aSBarry Smith #define __FUNCT__ "MatDuplicate_HT" 71*fb41c00aSBarry Smith PetscErrorCode MatDuplicate_HT(Mat N, MatDuplicateOption op, Mat* m) 72d0de2241SAndrew Spott { 73*fb41c00aSBarry Smith Mat_HT *Na = (Mat_HT*)N->data; 74d0de2241SAndrew Spott PetscErrorCode ierr; 75d0de2241SAndrew Spott 76d0de2241SAndrew Spott PetscFunctionBegin; 77d0de2241SAndrew Spott if (op == MAT_COPY_VALUES) { 78d0de2241SAndrew Spott ierr = MatHermitianTranspose(Na->A,MAT_INITIAL_MATRIX,m);CHKERRQ(ierr); 79d0de2241SAndrew Spott } else if (op == MAT_DO_NOT_COPY_VALUES) { 80d0de2241SAndrew Spott ierr = MatDuplicate(Na->A,MAT_DO_NOT_COPY_VALUES,m);CHKERRQ(ierr); 81*fb41c00aSBarry Smith ierr = MatHermitianTranspose(*m,MAT_REUSE_MATRIX,m);CHKERRQ(ierr); 82*fb41c00aSBarry Smith } else SETERRQ(PetscObjectComm((PetscObject)N),PETSC_ERR_SUP,"MAT_SHARE_NONZERO_PATTERN not supported for this matrix type"); 83d0de2241SAndrew Spott PetscFunctionReturn(0); 84d0de2241SAndrew Spott } 85d0de2241SAndrew Spott 86d0de2241SAndrew Spott #undef __FUNCT__ 87d0de2241SAndrew Spott #define __FUNCT__ "MatCreateHermitianTranspose" 88d0de2241SAndrew Spott /*@ 89d0de2241SAndrew Spott MatCreateHermitianTranspose - Creates a new matrix object that behaves like A'* 90d0de2241SAndrew Spott 91d0de2241SAndrew Spott Collective on Mat 92d0de2241SAndrew Spott 93d0de2241SAndrew Spott Input Parameter: 94d0de2241SAndrew Spott . A - the (possibly rectangular) matrix 95d0de2241SAndrew Spott 96d0de2241SAndrew Spott Output Parameter: 97d0de2241SAndrew Spott . N - the matrix that represents A'* 98d0de2241SAndrew Spott 99d0de2241SAndrew Spott Level: intermediate 100d0de2241SAndrew Spott 101d0de2241SAndrew Spott Notes: The hermitian transpose A' is NOT actually formed! Rather the new matrix 102d0de2241SAndrew Spott object performs the matrix-vector product by using the MatMultHermitianTranspose() on 103d0de2241SAndrew Spott the original matrix 104d0de2241SAndrew Spott 105d0de2241SAndrew Spott .seealso: MatCreateNormal(), MatMult(), MatMultHermitianTranspose(), MatCreate() 106d0de2241SAndrew Spott 107d0de2241SAndrew Spott @*/ 108d0de2241SAndrew Spott PetscErrorCode MatCreateHermitianTranspose(Mat A,Mat *N) 109d0de2241SAndrew Spott { 110d0de2241SAndrew Spott PetscErrorCode ierr; 111d0de2241SAndrew Spott PetscInt m,n; 112*fb41c00aSBarry Smith Mat_HT *Na; 113d0de2241SAndrew Spott 114d0de2241SAndrew Spott PetscFunctionBegin; 115d0de2241SAndrew Spott ierr = MatGetLocalSize(A,&m,&n);CHKERRQ(ierr); 116d0de2241SAndrew Spott ierr = MatCreate(PetscObjectComm((PetscObject)A),N);CHKERRQ(ierr); 117d0de2241SAndrew Spott ierr = MatSetSizes(*N,n,m,PETSC_DECIDE,PETSC_DECIDE);CHKERRQ(ierr); 118d0de2241SAndrew Spott ierr = PetscLayoutSetUp((*N)->rmap);CHKERRQ(ierr); 119d0de2241SAndrew Spott ierr = PetscLayoutSetUp((*N)->cmap);CHKERRQ(ierr); 120d0de2241SAndrew Spott ierr = PetscObjectChangeTypeName((PetscObject)*N,MATTRANSPOSEMAT);CHKERRQ(ierr); 121d0de2241SAndrew Spott 122d0de2241SAndrew Spott ierr = PetscNewLog(*N,&Na);CHKERRQ(ierr); 123d0de2241SAndrew Spott (*N)->data = (void*) Na; 124d0de2241SAndrew Spott ierr = PetscObjectReference((PetscObject)A);CHKERRQ(ierr); 125d0de2241SAndrew Spott Na->A = A; 126d0de2241SAndrew Spott 127*fb41c00aSBarry Smith (*N)->ops->destroy = MatDestroy_HT; 128*fb41c00aSBarry Smith (*N)->ops->mult = MatMult_HT; 129*fb41c00aSBarry Smith (*N)->ops->multadd = MatMultAdd_HT; 130*fb41c00aSBarry Smith (*N)->ops->multhermitiantranspose = MatMultHermitianTranspose_HT; 131*fb41c00aSBarry Smith (*N)->ops->multhermitiantransposeadd = MatMultHermitianTransposeAdd_HT; 132*fb41c00aSBarry Smith (*N)->ops->duplicate = MatDuplicate_HT; 133d0de2241SAndrew Spott (*N)->assembled = PETSC_TRUE; 134d0de2241SAndrew Spott 135d0de2241SAndrew Spott ierr = MatSetBlockSizes(*N,PetscAbs(A->cmap->bs),PetscAbs(A->rmap->bs));CHKERRQ(ierr); 136d0de2241SAndrew Spott ierr = MatSetUp(*N);CHKERRQ(ierr); 137d0de2241SAndrew Spott PetscFunctionReturn(0); 138d0de2241SAndrew Spott } 139