xref: /petsc/src/mat/impls/transpose/transm.c (revision d4bf62d159b4eec940d9872c577cf78ea329f539)
1 #define PETSCMAT_DLL
2 
3 #include "private/matimpl.h"          /*I "petscmat.h" I*/
4 
5 typedef struct {
6   Mat A;
7 } Mat_Transpose;
8 
9 #undef __FUNCT__
10 #define __FUNCT__ "MatMult_Transpose"
11 PetscErrorCode MatMult_Transpose(Mat N,Vec x,Vec y)
12 {
13   Mat_Transpose  *Na = (Mat_Transpose*)N->data;
14   PetscErrorCode ierr;
15 
16   PetscFunctionBegin;
17   ierr = MatMultTranspose(Na->A,x,y);CHKERRQ(ierr);
18   PetscFunctionReturn(0);
19 }
20 
21 #undef __FUNCT__
22 #define __FUNCT__ "MatMultAdd_Transpose"
23 PetscErrorCode MatMultAdd_Transpose(Mat N,Vec v1,Vec v2,Vec v3)
24 {
25   Mat_Transpose  *Na = (Mat_Transpose*)N->data;
26   PetscErrorCode ierr;
27 
28   PetscFunctionBegin;
29   ierr = MatMultTransposeAdd(Na->A,v1,v2,v3);CHKERRQ(ierr);
30   PetscFunctionReturn(0);
31 }
32 
33 #undef __FUNCT__
34 #define __FUNCT__ "MatMultTranspose_Transpose"
35 PetscErrorCode MatMultTranspose_Transpose(Mat N,Vec x,Vec y)
36 {
37   Mat_Transpose  *Na = (Mat_Transpose*)N->data;
38   PetscErrorCode ierr;
39 
40   PetscFunctionBegin;
41   ierr = MatMult(Na->A,x,y);CHKERRQ(ierr);
42   PetscFunctionReturn(0);
43 }
44 
45 #undef __FUNCT__
46 #define __FUNCT__ "MatMultTransposeAdd_Transpose"
47 PetscErrorCode MatMultTransposeAdd_Transpose(Mat N,Vec v1,Vec v2,Vec v3)
48 {
49   Mat_Transpose  *Na = (Mat_Transpose*)N->data;
50   PetscErrorCode ierr;
51 
52   PetscFunctionBegin;
53   ierr = MatMultAdd(Na->A,v1,v2,v3);CHKERRQ(ierr);
54   PetscFunctionReturn(0);
55 }
56 
57 #undef __FUNCT__
58 #define __FUNCT__ "MatDestroy_Transpose"
59 PetscErrorCode MatDestroy_Transpose(Mat N)
60 {
61   Mat_Transpose  *Na = (Mat_Transpose*)N->data;
62   PetscErrorCode ierr;
63 
64   PetscFunctionBegin;
65   if (Na->A) { ierr = MatDestroy(Na->A);CHKERRQ(ierr); }
66   ierr = PetscFree(Na);CHKERRQ(ierr);
67   PetscFunctionReturn(0);
68 }
69 
70 #undef __FUNCT__
71 #define __FUNCT__ "MatCreateTranspose"
72 /*@
73       MatCreateTranspose - Creates a new matrix object that behaves like A'
74 
75    Collective on Mat
76 
77    Input Parameter:
78 .   A  - the (possibly rectangular) matrix
79 
80    Output Parameter:
81 .   N - the matrix that represents A'
82 
83    Level: intermediate
84 
85    Notes: The transpose A' is NOT actually formed! Rather the new matrix
86           object performs the matrix-vector product by using the MatMultTranspose() on
87           the original matrix
88 
89 .seealso: MatCreateNormal(), MatMult(), MatMultTranspose(), MatCreate()
90 
91 @*/
92 PetscErrorCode PETSCMAT_DLLEXPORT MatCreateTranspose(Mat A,Mat *N)
93 {
94   PetscErrorCode ierr;
95   PetscInt       m,n;
96   Mat_Transpose  *Na;
97 
98   PetscFunctionBegin;
99   ierr = MatGetLocalSize(A,&m,&n);CHKERRQ(ierr);
100   ierr = MatCreate(((PetscObject)A)->comm,N);CHKERRQ(ierr);
101   ierr = MatSetSizes(*N,n,m,PETSC_DECIDE,PETSC_DECIDE);CHKERRQ(ierr);
102   ierr = PetscObjectChangeTypeName((PetscObject)*N,MATTRANSPOSEMAT);CHKERRQ(ierr);
103 
104   ierr      = PetscNewLog(*N,Mat_Transpose,&Na);CHKERRQ(ierr);
105   (*N)->data = (void*) Na;
106   ierr      = PetscObjectReference((PetscObject)A);CHKERRQ(ierr);
107   Na->A     = A;
108 
109   (*N)->ops->destroy          = MatDestroy_Transpose;
110   (*N)->ops->mult             = MatMult_Transpose;
111   (*N)->ops->multadd          = MatMultAdd_Transpose;
112   (*N)->ops->multtranspose    = MatMultTranspose_Transpose;
113   (*N)->ops->multtransposeadd = MatMultTransposeAdd_Transpose;
114   (*N)->assembled             = PETSC_TRUE;
115 
116   ierr = PetscMapSetBlockSize((*N)->rmap,A->cmap->bs);CHKERRQ(ierr);
117   ierr = PetscMapSetBlockSize((*N)->cmap,A->rmap->bs);CHKERRQ(ierr);
118   ierr = PetscMapSetUp((*N)->rmap);CHKERRQ(ierr);
119   ierr = PetscMapSetUp((*N)->cmap);CHKERRQ(ierr);
120 
121   PetscFunctionReturn(0);
122 }
123 
124