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