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