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 74*06511a5cSPierre Jolivet PetscErrorCode MatCreateVecs_HT(Mat N,Vec *r, Vec *l) 75*06511a5cSPierre Jolivet { 76*06511a5cSPierre Jolivet Mat_HT *Na = (Mat_HT*)N->data; 77*06511a5cSPierre Jolivet PetscErrorCode ierr; 78*06511a5cSPierre Jolivet 79*06511a5cSPierre Jolivet PetscFunctionBegin; 80*06511a5cSPierre Jolivet ierr = MatCreateVecs(Na->A,l,r);CHKERRQ(ierr); 81*06511a5cSPierre Jolivet PetscFunctionReturn(0); 82*06511a5cSPierre Jolivet } 83*06511a5cSPierre Jolivet 84*06511a5cSPierre Jolivet PetscErrorCode MatHermitianTransposeGetMat_HT(Mat N,Mat *M) 85*06511a5cSPierre Jolivet { 86*06511a5cSPierre Jolivet Mat_HT *Na = (Mat_HT*)N->data; 87*06511a5cSPierre Jolivet 88*06511a5cSPierre Jolivet PetscFunctionBegin; 89*06511a5cSPierre Jolivet *M = Na->A; 90*06511a5cSPierre Jolivet PetscFunctionReturn(0); 91*06511a5cSPierre Jolivet } 92*06511a5cSPierre Jolivet 93*06511a5cSPierre Jolivet /*@ 94*06511a5cSPierre Jolivet MatHermitianTransposeGetMat - Gets the Mat object stored inside a MATTRANSPOSEMAT 95*06511a5cSPierre Jolivet 96*06511a5cSPierre Jolivet Logically collective on Mat 97*06511a5cSPierre Jolivet 98*06511a5cSPierre Jolivet Input Parameter: 99*06511a5cSPierre Jolivet . A - the MATTRANSPOSE matrix 100*06511a5cSPierre Jolivet 101*06511a5cSPierre Jolivet Output Parameter: 102*06511a5cSPierre Jolivet . M - the matrix object stored inside A 103*06511a5cSPierre Jolivet 104*06511a5cSPierre Jolivet Level: intermediate 105*06511a5cSPierre Jolivet 106*06511a5cSPierre Jolivet .seealso: MatCreateHermitianTranspose() 107*06511a5cSPierre Jolivet 108*06511a5cSPierre Jolivet @*/ 109*06511a5cSPierre Jolivet PetscErrorCode MatHermitianTransposeGetMat(Mat A,Mat *M) 110*06511a5cSPierre Jolivet { 111*06511a5cSPierre Jolivet PetscErrorCode ierr; 112*06511a5cSPierre Jolivet 113*06511a5cSPierre Jolivet PetscFunctionBegin; 114*06511a5cSPierre Jolivet PetscValidHeaderSpecific(A,MAT_CLASSID,1); 115*06511a5cSPierre Jolivet PetscValidType(A,1); 116*06511a5cSPierre Jolivet PetscValidPointer(M,2); 117*06511a5cSPierre Jolivet ierr = PetscUseMethod(A,"MatHermitianTransposeGetMat_C",(Mat,Mat*),(A,M));CHKERRQ(ierr); 118*06511a5cSPierre Jolivet PetscFunctionReturn(0); 119*06511a5cSPierre Jolivet } 120*06511a5cSPierre Jolivet 121d0de2241SAndrew Spott /*@ 122d0de2241SAndrew Spott MatCreateHermitianTranspose - Creates a new matrix object that behaves like A'* 123d0de2241SAndrew Spott 124d0de2241SAndrew Spott Collective on Mat 125d0de2241SAndrew Spott 126d0de2241SAndrew Spott Input Parameter: 127d0de2241SAndrew Spott . A - the (possibly rectangular) matrix 128d0de2241SAndrew Spott 129d0de2241SAndrew Spott Output Parameter: 130d0de2241SAndrew Spott . N - the matrix that represents A'* 131d0de2241SAndrew Spott 132d0de2241SAndrew Spott Level: intermediate 133d0de2241SAndrew Spott 13495452b02SPatrick Sanan Notes: 13595452b02SPatrick Sanan The hermitian transpose A' is NOT actually formed! Rather the new matrix 136d0de2241SAndrew Spott object performs the matrix-vector product by using the MatMultHermitianTranspose() on 137d0de2241SAndrew Spott the original matrix 138d0de2241SAndrew Spott 139d0de2241SAndrew Spott .seealso: MatCreateNormal(), MatMult(), MatMultHermitianTranspose(), MatCreate() 140d0de2241SAndrew Spott 141d0de2241SAndrew Spott @*/ 142d0de2241SAndrew Spott PetscErrorCode MatCreateHermitianTranspose(Mat A,Mat *N) 143d0de2241SAndrew Spott { 144d0de2241SAndrew Spott PetscErrorCode ierr; 145d0de2241SAndrew Spott PetscInt m,n; 146fb41c00aSBarry Smith Mat_HT *Na; 147d0de2241SAndrew Spott 148d0de2241SAndrew Spott PetscFunctionBegin; 149d0de2241SAndrew Spott ierr = MatGetLocalSize(A,&m,&n);CHKERRQ(ierr); 150d0de2241SAndrew Spott ierr = MatCreate(PetscObjectComm((PetscObject)A),N);CHKERRQ(ierr); 151d0de2241SAndrew Spott ierr = MatSetSizes(*N,n,m,PETSC_DECIDE,PETSC_DECIDE);CHKERRQ(ierr); 152d0de2241SAndrew Spott ierr = PetscLayoutSetUp((*N)->rmap);CHKERRQ(ierr); 153d0de2241SAndrew Spott ierr = PetscLayoutSetUp((*N)->cmap);CHKERRQ(ierr); 154d0de2241SAndrew Spott ierr = PetscObjectChangeTypeName((PetscObject)*N,MATTRANSPOSEMAT);CHKERRQ(ierr); 155d0de2241SAndrew Spott 156d0de2241SAndrew Spott ierr = PetscNewLog(*N,&Na);CHKERRQ(ierr); 157d0de2241SAndrew Spott (*N)->data = (void*) Na; 158d0de2241SAndrew Spott ierr = PetscObjectReference((PetscObject)A);CHKERRQ(ierr); 159d0de2241SAndrew Spott Na->A = A; 160d0de2241SAndrew Spott 161fb41c00aSBarry Smith (*N)->ops->destroy = MatDestroy_HT; 162fb41c00aSBarry Smith (*N)->ops->mult = MatMult_HT; 163fb41c00aSBarry Smith (*N)->ops->multadd = MatMultAdd_HT; 164fb41c00aSBarry Smith (*N)->ops->multhermitiantranspose = MatMultHermitianTranspose_HT; 165fb41c00aSBarry Smith (*N)->ops->multhermitiantransposeadd = MatMultHermitianTransposeAdd_HT; 166fb41c00aSBarry Smith (*N)->ops->duplicate = MatDuplicate_HT; 167*06511a5cSPierre Jolivet (*N)->ops->getvecs = MatCreateVecs_HT; 168d0de2241SAndrew Spott (*N)->assembled = PETSC_TRUE; 169d0de2241SAndrew Spott 170*06511a5cSPierre Jolivet ierr = PetscObjectComposeFunction((PetscObject)(*N),"MatHermitianTransposeGetMat_C",MatHermitianTransposeGetMat_HT);CHKERRQ(ierr); 171d0de2241SAndrew Spott ierr = MatSetBlockSizes(*N,PetscAbs(A->cmap->bs),PetscAbs(A->rmap->bs));CHKERRQ(ierr); 172d0de2241SAndrew Spott ierr = MatSetUp(*N);CHKERRQ(ierr); 173d0de2241SAndrew Spott PetscFunctionReturn(0); 174d0de2241SAndrew Spott } 175