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