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