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