xref: /petsc/src/mat/interface/matnull.c (revision 1332c70c93385e2a508e674ee0477a2b1a910d81)
1a5eb4965SSatish Balay #ifdef PETSC_RCS_HEADER
2*1332c70cSBarry Smith static char vcid[] = "$Id: pcnull.c,v 1.25 1999/06/30 22:51:03 bsmith Exp curfman $";
3f7765cecSBarry Smith #endif
4f7765cecSBarry Smith /*
5b4fd4287SBarry Smith     Routines to project vectors out of null spaces.
6f7765cecSBarry Smith */
7f7765cecSBarry Smith 
8f7765cecSBarry Smith #include "petsc.h"
983271157SBarry Smith #include "src/sles/pc/pcimpl.h"      /*I "pc.h" I*/
10f7765cecSBarry Smith #include "sys.h"
11f7765cecSBarry Smith 
12f7765cecSBarry Smith 
135615d1e5SSatish Balay #undef __FUNC__
145615d1e5SSatish Balay #define __FUNC__ "PCNullSpaceCreate"
15112a2221SBarry Smith /*@C
16*1332c70cSBarry Smith    PCNullSpaceCreate - Creates a data structure used to project vectors
17b4fd4287SBarry Smith    out of null spaces.
18f7765cecSBarry Smith 
194e472627SLois Curfman McInnes    Collective on MPI_Comm
204e472627SLois Curfman McInnes 
21f7765cecSBarry Smith    Input Parameters:
2283c3bef8SLois Curfman McInnes +  comm - the MPI communicator associated with the object
2383c3bef8SLois Curfman McInnes .  has_cnst - PETSC_TRUE if the null space contains the constant vector; otherwise PETSC_FALSE
24b4fd4287SBarry Smith .  n - number of vectors (excluding constant vector) in null space
2583c3bef8SLois Curfman McInnes -  vecs - the vectors that span the null space (excluding the constant vector);
264e472627SLois Curfman McInnes           these vectors must be orthonormal
27f7765cecSBarry Smith 
28f7765cecSBarry Smith    Output Parameter:
29b4fd4287SBarry Smith .  SP - the null space context
30f7765cecSBarry Smith 
3183c3bef8SLois Curfman McInnes    Level: advanced
3283c3bef8SLois Curfman McInnes 
3383c3bef8SLois Curfman McInnes .keywords: PC, null space, create
3441a59933SSatish Balay 
3583c3bef8SLois Curfman McInnes .seealso: PCNullSpaceDestroy(), PCNullSpaceRemove()
36f7765cecSBarry Smith @*/
37b4fd4287SBarry Smith int PCNullSpaceCreate(MPI_Comm comm, int has_cnst, int n, Vec *vecs,PCNullSpace *SP)
38f7765cecSBarry Smith {
39b4fd4287SBarry Smith   PCNullSpace sp;
40f7765cecSBarry Smith 
413a40ed3dSBarry Smith   PetscFunctionBegin;
423f1db9ecSBarry Smith   PetscHeaderCreate(sp,_p_PCNullSpace,int,PCNULLSPACE_COOKIE,0,"PCNullSpace",comm,PCNullSpaceDestroy,0);
43b4fd4287SBarry Smith   PLogObjectCreate(sp);
44f09e8eb9SSatish Balay   PLogObjectMemory(sp,sizeof(struct _p_PCNullSpace));
45f7765cecSBarry Smith 
46b4fd4287SBarry Smith   sp->has_cnst = has_cnst;
47b4fd4287SBarry Smith   sp->n        = n;
48b4fd4287SBarry Smith   sp->vecs     = vecs;
49b4fd4287SBarry Smith 
50b4fd4287SBarry Smith   *SP          = sp;
513a40ed3dSBarry Smith   PetscFunctionReturn(0);
52f7765cecSBarry Smith }
53f7765cecSBarry Smith 
545615d1e5SSatish Balay #undef __FUNC__
55d4bb536fSBarry Smith #define __FUNC__ "PCNullSpaceDestroy"
56f7765cecSBarry Smith /*@
57*1332c70cSBarry Smith    PCNullSpaceDestroy - Destroys a data structure used to project vectors
58b4fd4287SBarry Smith    out of null spaces.
59b4fd4287SBarry Smith 
604e472627SLois Curfman McInnes    Collective on PCNullSpace
614e472627SLois Curfman McInnes 
62b4fd4287SBarry Smith    Input Parameter:
63b9756687SLois Curfman McInnes .  sp - the null space context to be destroyed
64b9756687SLois Curfman McInnes 
65b9756687SLois Curfman McInnes    Level: advanced
66b4fd4287SBarry Smith 
6783c3bef8SLois Curfman McInnes .keywords: PC, null space, destroy
6841a59933SSatish Balay 
69*1332c70cSBarry Smith .seealso: PCNullSpaceCreate(), PCNullSpaceRemove()
70b4fd4287SBarry Smith @*/
71b4fd4287SBarry Smith int PCNullSpaceDestroy(PCNullSpace sp)
72b4fd4287SBarry Smith {
733a40ed3dSBarry Smith   PetscFunctionBegin;
7485614651SBarry Smith 
7585614651SBarry Smith   if (--sp->refct > 0) PetscFunctionReturn(0);
7685614651SBarry Smith 
77b4fd4287SBarry Smith   PLogObjectDestroy(sp);
78b4fd4287SBarry Smith   PetscHeaderDestroy(sp);
793a40ed3dSBarry Smith   PetscFunctionReturn(0);
80b4fd4287SBarry Smith }
81b4fd4287SBarry Smith 
825615d1e5SSatish Balay #undef __FUNC__
835615d1e5SSatish Balay #define __FUNC__ "PCNullSpaceRemove"
84b4fd4287SBarry Smith /*@
85b4fd4287SBarry Smith    PCNullSpaceRemove - Removes all the components of a null space from a vector.
86f7765cecSBarry Smith 
87fee21e36SBarry Smith    Collective on PCNullSpace
88f7765cecSBarry Smith 
894e472627SLois Curfman McInnes    Input Parameters:
904e472627SLois Curfman McInnes +  sp - the null space context
9183c3bef8SLois Curfman McInnes -  vec - the vector from which the null space is to be removed
924e472627SLois Curfman McInnes 
93b9756687SLois Curfman McInnes    Level: advanced
94b9756687SLois Curfman McInnes 
9583c3bef8SLois Curfman McInnes .keywords: PC, null space, remove
9641a59933SSatish Balay 
9783c3bef8SLois Curfman McInnes .seealso: PCNullSpaceCreate(), PCNullSpaceDestroy()
98f7765cecSBarry Smith @*/
99b4fd4287SBarry Smith int PCNullSpaceRemove(PCNullSpace sp,Vec vec)
100f7765cecSBarry Smith {
101b4fd4287SBarry Smith   Scalar sum;
102b4fd4287SBarry Smith   int    j, n = sp->n, N,ierr;
103f7765cecSBarry Smith 
1043a40ed3dSBarry Smith   PetscFunctionBegin;
105b4fd4287SBarry Smith   if (sp->has_cnst) {
106b4fd4287SBarry Smith     ierr = VecSum(vec,&sum);CHKERRQ(ierr);
107b4fd4287SBarry Smith     ierr = VecGetSize(vec,&N);CHKERRQ(ierr);
10818a7d68fSSatish Balay     sum  = sum/(-1.0*N);
109b4fd4287SBarry Smith     ierr = VecShift(&sum,vec);CHKERRQ(ierr);
110f7765cecSBarry Smith   }
111b4fd4287SBarry Smith 
112b4fd4287SBarry Smith   for ( j=0; j<n; j++ ) {
113b4fd4287SBarry Smith     ierr = VecDot(vec,sp->vecs[j],&sum);CHKERRQ(ierr);
114b4fd4287SBarry Smith     sum  = -sum;
11585614651SBarry Smith     ierr = VecAXPY(&sum,sp->vecs[j],vec);CHKERRQ(ierr);
116f7765cecSBarry Smith   }
117b4fd4287SBarry Smith 
1183a40ed3dSBarry Smith   PetscFunctionReturn(0);
119f7765cecSBarry Smith }
120