xref: /petsc/src/mat/impls/transpose/htransm.c (revision 06511a5cf323ab2731ded08d9cab89344878b831)
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