xref: /petsc/src/mat/impls/normal/normm.c (revision c8a8475e04bcaa43590892a5c3e60c6f87bc31f7)
1*c8a8475eSBarry Smith /*$Id: bvec2.c,v 1.202 2001/09/12 03:26:24 bsmith Exp $*/
2*c8a8475eSBarry Smith 
3*c8a8475eSBarry Smith #include "src/mat/matimpl.h"          /*I "petscmat.h" I*/
4*c8a8475eSBarry Smith 
5*c8a8475eSBarry Smith typedef struct {
6*c8a8475eSBarry Smith   Mat A;
7*c8a8475eSBarry Smith   Vec w;
8*c8a8475eSBarry Smith } Mat_Normal;
9*c8a8475eSBarry Smith 
10*c8a8475eSBarry Smith #undef __FUNCT__
11*c8a8475eSBarry Smith #define __FUNCT__ "MatMult_Normal"
12*c8a8475eSBarry Smith int MatMult_Normal(Mat N,Vec x,Vec y)
13*c8a8475eSBarry Smith {
14*c8a8475eSBarry Smith   Mat_Normal *Na = (Mat_Normal*)N->data;
15*c8a8475eSBarry Smith   int        ierr;
16*c8a8475eSBarry Smith 
17*c8a8475eSBarry Smith   PetscFunctionBegin;
18*c8a8475eSBarry Smith   ierr = MatMult(Na->A,x,Na->w);CHKERRQ(ierr);
19*c8a8475eSBarry Smith   ierr = MatMultTranspose(Na->A,Na->w,y);CHKERRQ(ierr);
20*c8a8475eSBarry Smith   PetscFunctionReturn(0);
21*c8a8475eSBarry Smith }
22*c8a8475eSBarry Smith 
23*c8a8475eSBarry Smith #undef __FUNCT__
24*c8a8475eSBarry Smith #define __FUNCT__ "MatDestroy_Normal"
25*c8a8475eSBarry Smith int MatDestroy_Normal(Mat N)
26*c8a8475eSBarry Smith {
27*c8a8475eSBarry Smith   Mat_Normal *Na = (Mat_Normal*)N->data;
28*c8a8475eSBarry Smith   int        ierr;
29*c8a8475eSBarry Smith 
30*c8a8475eSBarry Smith   PetscFunctionBegin;
31*c8a8475eSBarry Smith   ierr = PetscObjectDereference((PetscObject)Na->A);CHKERRQ(ierr);
32*c8a8475eSBarry Smith   ierr = VecDestroy(Na->w);CHKERRQ(ierr);
33*c8a8475eSBarry Smith   ierr = PetscFree(Na);CHKERRQ(ierr);
34*c8a8475eSBarry Smith   PetscFunctionReturn(0);
35*c8a8475eSBarry Smith }
36*c8a8475eSBarry Smith 
37*c8a8475eSBarry Smith 
38*c8a8475eSBarry Smith #undef __FUNCT__
39*c8a8475eSBarry Smith #define __FUNCT__ "MatCreateNormal"
40*c8a8475eSBarry Smith /*@
41*c8a8475eSBarry Smith       MatCreateNormal - Creates a new matrix object that behaves like A'*A.
42*c8a8475eSBarry Smith 
43*c8a8475eSBarry Smith    Collective on Mat
44*c8a8475eSBarry Smith 
45*c8a8475eSBarry Smith    Input Parameter:
46*c8a8475eSBarry Smith .   A  - the (possibly rectangular) matrix
47*c8a8475eSBarry Smith 
48*c8a8475eSBarry Smith    Output Parameter:
49*c8a8475eSBarry Smith .   N - the matrix that represents A'*A
50*c8a8475eSBarry Smith 
51*c8a8475eSBarry Smith    Notes: The product A'*A is NOT actually formed! Rather the new matrix
52*c8a8475eSBarry Smith           object performs the matrix-vector product by first multiplying by
53*c8a8475eSBarry Smith           A and then A'
54*c8a8475eSBarry Smith @*/
55*c8a8475eSBarry Smith int MatCreateNormal(Mat A,Mat *N)
56*c8a8475eSBarry Smith {
57*c8a8475eSBarry Smith   int        ierr,m,n;
58*c8a8475eSBarry Smith   Mat_Normal *Na;
59*c8a8475eSBarry Smith 
60*c8a8475eSBarry Smith   PetscFunctionBegin;
61*c8a8475eSBarry Smith   ierr = MatGetLocalSize(A,&m,&n);CHKERRQ(ierr);
62*c8a8475eSBarry Smith   ierr = MatCreate(A->comm,n,n,PETSC_DECIDE,PETSC_DECIDE,N);CHKERRQ(ierr);
63*c8a8475eSBarry Smith   ierr = PetscObjectChangeTypeName((PetscObject)*N,MATNORMAL);CHKERRQ(ierr);
64*c8a8475eSBarry Smith 
65*c8a8475eSBarry Smith   ierr      = PetscNew(Mat_Normal,&Na);CHKERRQ(ierr);
66*c8a8475eSBarry Smith   Na->A     = A;
67*c8a8475eSBarry Smith   ierr      = PetscObjectReference((PetscObject)A);CHKERRQ(ierr);
68*c8a8475eSBarry Smith   (*N)->data = (void*) Na;
69*c8a8475eSBarry Smith 
70*c8a8475eSBarry Smith   ierr    = VecCreateMPI(A->comm,m,PETSC_DECIDE,&Na->w);CHKERRQ(ierr);
71*c8a8475eSBarry Smith   (*N)->ops->destroy = MatDestroy_Normal;
72*c8a8475eSBarry Smith   (*N)->ops->mult    = MatMult_Normal;
73*c8a8475eSBarry Smith   (*N)->assembled    = PETSC_TRUE;
74*c8a8475eSBarry Smith   (*N)->N            = A->N;
75*c8a8475eSBarry Smith   (*N)->M            = A->N;
76*c8a8475eSBarry Smith   (*N)->n            = A->n;
77*c8a8475eSBarry Smith   (*N)->m            = A->n;
78*c8a8475eSBarry Smith   PetscFunctionReturn(0);
79*c8a8475eSBarry Smith }
80*c8a8475eSBarry Smith 
81