Actual source code: htransm.c
petsc-3.7.7 2017-09-25
2: #include <petsc/private/matimpl.h> /*I "petscmat.h" I*/
4: typedef struct {
5: Mat A;
6: } Mat_HT;
10: PetscErrorCode MatMult_HT(Mat N,Vec x,Vec y)
11: {
12: Mat_HT *Na = (Mat_HT*)N->data;
16: MatMultHermitianTranspose(Na->A,x,y);
17: return(0);
18: }
22: PetscErrorCode MatMultAdd_HT(Mat N,Vec v1,Vec v2,Vec v3)
23: {
24: Mat_HT *Na = (Mat_HT*)N->data;
28: MatMultHermitianTransposeAdd(Na->A,v1,v2,v3);
29: return(0);
30: }
34: PetscErrorCode MatMultHermitianTranspose_HT(Mat N,Vec x,Vec y)
35: {
36: Mat_HT *Na = (Mat_HT*)N->data;
40: MatMult(Na->A,x,y);
41: return(0);
42: }
46: PetscErrorCode MatMultHermitianTransposeAdd_HT(Mat N,Vec v1,Vec v2,Vec v3)
47: {
48: Mat_HT *Na = (Mat_HT*)N->data;
52: MatMultAdd(Na->A,v1,v2,v3);
53: return(0);
54: }
58: PetscErrorCode MatDestroy_HT(Mat N)
59: {
60: Mat_HT *Na = (Mat_HT*)N->data;
64: MatDestroy(&Na->A);
65: PetscFree(N->data);
66: return(0);
67: }
71: PetscErrorCode MatDuplicate_HT(Mat N, MatDuplicateOption op, Mat* m)
72: {
73: Mat_HT *Na = (Mat_HT*)N->data;
77: if (op == MAT_COPY_VALUES) {
78: MatHermitianTranspose(Na->A,MAT_INITIAL_MATRIX,m);
79: } else if (op == MAT_DO_NOT_COPY_VALUES) {
80: MatDuplicate(Na->A,MAT_DO_NOT_COPY_VALUES,m);
81: MatHermitianTranspose(*m,MAT_REUSE_MATRIX,m);
82: } else SETERRQ(PetscObjectComm((PetscObject)N),PETSC_ERR_SUP,"MAT_SHARE_NONZERO_PATTERN not supported for this matrix type");
83: return(0);
84: }
88: /*@
89: MatCreateHermitianTranspose - Creates a new matrix object that behaves like A'*
91: Collective on Mat
93: Input Parameter:
94: . A - the (possibly rectangular) matrix
96: Output Parameter:
97: . N - the matrix that represents A'*
99: Level: intermediate
101: Notes: The hermitian transpose A' is NOT actually formed! Rather the new matrix
102: object performs the matrix-vector product by using the MatMultHermitianTranspose() on
103: the original matrix
105: .seealso: MatCreateNormal(), MatMult(), MatMultHermitianTranspose(), MatCreate()
107: @*/
108: PetscErrorCode MatCreateHermitianTranspose(Mat A,Mat *N)
109: {
111: PetscInt m,n;
112: Mat_HT *Na;
115: MatGetLocalSize(A,&m,&n);
116: MatCreate(PetscObjectComm((PetscObject)A),N);
117: MatSetSizes(*N,n,m,PETSC_DECIDE,PETSC_DECIDE);
118: PetscLayoutSetUp((*N)->rmap);
119: PetscLayoutSetUp((*N)->cmap);
120: PetscObjectChangeTypeName((PetscObject)*N,MATTRANSPOSEMAT);
122: PetscNewLog(*N,&Na);
123: (*N)->data = (void*) Na;
124: PetscObjectReference((PetscObject)A);
125: Na->A = A;
127: (*N)->ops->destroy = MatDestroy_HT;
128: (*N)->ops->mult = MatMult_HT;
129: (*N)->ops->multadd = MatMultAdd_HT;
130: (*N)->ops->multhermitiantranspose = MatMultHermitianTranspose_HT;
131: (*N)->ops->multhermitiantransposeadd = MatMultHermitianTransposeAdd_HT;
132: (*N)->ops->duplicate = MatDuplicate_HT;
133: (*N)->assembled = PETSC_TRUE;
135: MatSetBlockSizes(*N,PetscAbs(A->cmap->bs),PetscAbs(A->rmap->bs));
136: MatSetUp(*N);
137: return(0);
138: }