xref: /petsc/src/mat/interface/matnull.c (revision 41a59933650a73140112d8d33671a29513303bac)
1a5eb4965SSatish Balay #ifdef PETSC_RCS_HEADER
2*41a59933SSatish Balay static char vcid[] = "$Id: pcnull.c,v 1.21 1999/01/31 21:14:38 curfman Exp balay $";
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*/
10f5eb4b81SSatish Balay #include "src/sys/nreg.h"
11f7765cecSBarry Smith #include "sys.h"
12f7765cecSBarry Smith 
13f7765cecSBarry Smith 
145615d1e5SSatish Balay #undef __FUNC__
155615d1e5SSatish Balay #define __FUNC__ "PCNullSpaceCreate"
16112a2221SBarry Smith /*@C
17b4fd4287SBarry Smith    PCNullSpaceCreate - Creates a data-structure used to project vectors
18b4fd4287SBarry Smith    out of null spaces.
19f7765cecSBarry Smith 
204e472627SLois Curfman McInnes    Collective on MPI_Comm
214e472627SLois Curfman McInnes 
22f7765cecSBarry Smith    Input Parameters:
2383c3bef8SLois Curfman McInnes +  comm - the MPI communicator associated with the object
2483c3bef8SLois Curfman McInnes .  has_cnst - PETSC_TRUE if the null space contains the constant vector; otherwise PETSC_FALSE
25b4fd4287SBarry Smith .  n - number of vectors (excluding constant vector) in null space
2683c3bef8SLois Curfman McInnes -  vecs - the vectors that span the null space (excluding the constant vector);
274e472627SLois Curfman McInnes           these vectors must be orthonormal
28f7765cecSBarry Smith 
29f7765cecSBarry Smith    Output Parameter:
30b4fd4287SBarry Smith .  SP - the null space context
31f7765cecSBarry Smith 
3283c3bef8SLois Curfman McInnes    Level: advanced
3383c3bef8SLois Curfman McInnes 
3483c3bef8SLois Curfman McInnes .keywords: PC, null space, create
35*41a59933SSatish Balay 
3683c3bef8SLois Curfman McInnes .seealso: PCNullSpaceDestroy(), PCNullSpaceRemove()
37f7765cecSBarry Smith @*/
38b4fd4287SBarry Smith int PCNullSpaceCreate(MPI_Comm comm, int has_cnst, int n, Vec *vecs,PCNullSpace *SP)
39f7765cecSBarry Smith {
40b4fd4287SBarry Smith   PCNullSpace sp;
41f7765cecSBarry Smith 
423a40ed3dSBarry Smith   PetscFunctionBegin;
433f1db9ecSBarry Smith   PetscHeaderCreate(sp,_p_PCNullSpace,int,PCNULLSPACE_COOKIE,0,"PCNullSpace",comm,PCNullSpaceDestroy,0);
44b4fd4287SBarry Smith   PLogObjectCreate(sp);
45f09e8eb9SSatish Balay   PLogObjectMemory(sp,sizeof(struct _p_PCNullSpace));
46f7765cecSBarry Smith 
47b4fd4287SBarry Smith   sp->has_cnst = has_cnst;
48b4fd4287SBarry Smith   sp->n        = n;
49b4fd4287SBarry Smith   sp->vecs     = vecs;
50b4fd4287SBarry Smith 
51b4fd4287SBarry Smith   *SP          = sp;
523a40ed3dSBarry Smith   PetscFunctionReturn(0);
53f7765cecSBarry Smith }
54f7765cecSBarry Smith 
555615d1e5SSatish Balay #undef __FUNC__
56d4bb536fSBarry Smith #define __FUNC__ "PCNullSpaceDestroy"
57f7765cecSBarry Smith /*@
58b4fd4287SBarry Smith    PCNullSpaceDestroy - Destroys a data-structure used to project vectors
59b4fd4287SBarry Smith    out of null spaces.
60b4fd4287SBarry Smith 
614e472627SLois Curfman McInnes    Collective on PCNullSpace
624e472627SLois Curfman McInnes 
63b4fd4287SBarry Smith    Input Parameter:
64b9756687SLois Curfman McInnes .  sp - the null space context to be destroyed
65b9756687SLois Curfman McInnes 
66b9756687SLois Curfman McInnes    Level: advanced
67b4fd4287SBarry Smith 
6883c3bef8SLois Curfman McInnes .keywords: PC, null space, destroy
69*41a59933SSatish Balay 
7083c3bef8SLois Curfman McInnes .seealso: PCNullSpaceDestroy(), PCNullSpaceRemove()
71b4fd4287SBarry Smith @*/
72b4fd4287SBarry Smith int PCNullSpaceDestroy(PCNullSpace sp)
73b4fd4287SBarry Smith {
743a40ed3dSBarry Smith   PetscFunctionBegin;
75b4fd4287SBarry Smith   PLogObjectDestroy(sp);
76b4fd4287SBarry Smith   PetscHeaderDestroy(sp);
773a40ed3dSBarry Smith   PetscFunctionReturn(0);
78b4fd4287SBarry Smith }
79b4fd4287SBarry Smith 
805615d1e5SSatish Balay #undef __FUNC__
815615d1e5SSatish Balay #define __FUNC__ "PCNullSpaceRemove"
82b4fd4287SBarry Smith /*@
83b4fd4287SBarry Smith    PCNullSpaceRemove - Removes all the components of a null space from a vector.
84f7765cecSBarry Smith 
85fee21e36SBarry Smith    Collective on PCNullSpace
86f7765cecSBarry Smith 
874e472627SLois Curfman McInnes    Input Parameters:
884e472627SLois Curfman McInnes +  sp - the null space context
8983c3bef8SLois Curfman McInnes -  vec - the vector from which the null space is to be removed
904e472627SLois Curfman McInnes 
91b9756687SLois Curfman McInnes    Level: advanced
92b9756687SLois Curfman McInnes 
9383c3bef8SLois Curfman McInnes .keywords: PC, null space, remove
94*41a59933SSatish Balay 
9583c3bef8SLois Curfman McInnes .seealso: PCNullSpaceCreate(), PCNullSpaceDestroy()
96f7765cecSBarry Smith @*/
97b4fd4287SBarry Smith int PCNullSpaceRemove(PCNullSpace sp,Vec vec)
98f7765cecSBarry Smith {
99b4fd4287SBarry Smith   Scalar sum;
100b4fd4287SBarry Smith   int    j, n = sp->n, N,ierr;
101f7765cecSBarry Smith 
1023a40ed3dSBarry Smith   PetscFunctionBegin;
103b4fd4287SBarry Smith   if (sp->has_cnst) {
104b4fd4287SBarry Smith     ierr = VecSum(vec,&sum); CHKERRQ(ierr);
105b4fd4287SBarry Smith     ierr = VecGetSize(vec,&N); CHKERRQ(ierr);
10618a7d68fSSatish Balay     sum  = sum/(-1.0*N);
107b4fd4287SBarry Smith     ierr = VecShift(&sum,vec); CHKERRQ(ierr);
108f7765cecSBarry Smith   }
109b4fd4287SBarry Smith 
110b4fd4287SBarry Smith   for ( j=0; j<n; j++ ) {
111b4fd4287SBarry Smith     ierr = VecDot(vec,sp->vecs[j],&sum);CHKERRQ(ierr);
112b4fd4287SBarry Smith     sum  = -sum;
113b4fd4287SBarry Smith     ierr = VecAYPX(&sum,sp->vecs[j],vec); CHKERRQ(ierr);
114f7765cecSBarry Smith   }
115b4fd4287SBarry Smith 
1163a40ed3dSBarry Smith   PetscFunctionReturn(0);
117f7765cecSBarry Smith }
118