xref: /petsc/src/mat/interface/matnull.c (revision e090d5668ba2b2ea997ebb925e3a05be0dc5d9ab)
1*e090d566SSatish Balay /*$Id: pcnull.c,v 1.30 2000/04/12 04:24:31 bsmith Exp balay $*/
2f7765cecSBarry Smith /*
3b4fd4287SBarry Smith     Routines to project vectors out of null spaces.
4f7765cecSBarry Smith */
5f7765cecSBarry Smith 
6*e090d566SSatish Balay #include "src/sles/pc/pcimpl.h"      /*I "petscpc.h" I*/
7*e090d566SSatish Balay #include "petscsys.h"
8f7765cecSBarry Smith 
95615d1e5SSatish Balay #undef __FUNC__
10b2863d3aSBarry Smith #define __FUNC__ /*<a name=""></a>*/"PCNullSpaceCreate"
11112a2221SBarry Smith /*@C
121332c70cSBarry Smith    PCNullSpaceCreate - Creates a data structure used to project vectors
13b4fd4287SBarry Smith    out of null spaces.
14f7765cecSBarry Smith 
154e472627SLois Curfman McInnes    Collective on MPI_Comm
164e472627SLois Curfman McInnes 
17f7765cecSBarry Smith    Input Parameters:
1883c3bef8SLois Curfman McInnes +  comm - the MPI communicator associated with the object
1983c3bef8SLois Curfman McInnes .  has_cnst - PETSC_TRUE if the null space contains the constant vector; otherwise PETSC_FALSE
20b4fd4287SBarry Smith .  n - number of vectors (excluding constant vector) in null space
2183c3bef8SLois Curfman McInnes -  vecs - the vectors that span the null space (excluding the constant vector);
224e472627SLois Curfman McInnes           these vectors must be orthonormal
23f7765cecSBarry Smith 
24f7765cecSBarry Smith    Output Parameter:
25b4fd4287SBarry Smith .  SP - the null space context
26f7765cecSBarry Smith 
2783c3bef8SLois Curfman McInnes    Level: advanced
2883c3bef8SLois Curfman McInnes 
2983c3bef8SLois Curfman McInnes .keywords: PC, null space, create
3041a59933SSatish Balay 
3183c3bef8SLois Curfman McInnes .seealso: PCNullSpaceDestroy(), PCNullSpaceRemove()
32f7765cecSBarry Smith @*/
33b4fd4287SBarry Smith int PCNullSpaceCreate(MPI_Comm comm,int has_cnst,int n,Vec *vecs,PCNullSpace *SP)
34f7765cecSBarry Smith {
35b4fd4287SBarry Smith   PCNullSpace sp;
36f7765cecSBarry Smith 
373a40ed3dSBarry Smith   PetscFunctionBegin;
383f1db9ecSBarry Smith   PetscHeaderCreate(sp,_p_PCNullSpace,int,PCNULLSPACE_COOKIE,0,"PCNullSpace",comm,PCNullSpaceDestroy,0);
39b4fd4287SBarry Smith   PLogObjectCreate(sp);
40f09e8eb9SSatish Balay   PLogObjectMemory(sp,sizeof(struct _p_PCNullSpace));
41f7765cecSBarry Smith 
42b4fd4287SBarry Smith   sp->has_cnst = has_cnst;
43b4fd4287SBarry Smith   sp->n        = n;
44b4fd4287SBarry Smith   sp->vecs     = vecs;
45b4fd4287SBarry Smith 
46b4fd4287SBarry Smith   *SP          = sp;
473a40ed3dSBarry Smith   PetscFunctionReturn(0);
48f7765cecSBarry Smith }
49f7765cecSBarry Smith 
505615d1e5SSatish Balay #undef __FUNC__
51b2863d3aSBarry Smith #define __FUNC__ /*<a name=""></a>*/"PCNullSpaceDestroy"
52f7765cecSBarry Smith /*@
531332c70cSBarry Smith    PCNullSpaceDestroy - Destroys a data structure used to project vectors
54b4fd4287SBarry Smith    out of null spaces.
55b4fd4287SBarry Smith 
564e472627SLois Curfman McInnes    Collective on PCNullSpace
574e472627SLois Curfman McInnes 
58b4fd4287SBarry Smith    Input Parameter:
59b9756687SLois Curfman McInnes .  sp - the null space context to be destroyed
60b9756687SLois Curfman McInnes 
61b9756687SLois Curfman McInnes    Level: advanced
62b4fd4287SBarry Smith 
6383c3bef8SLois Curfman McInnes .keywords: PC, null space, destroy
6441a59933SSatish Balay 
651332c70cSBarry Smith .seealso: PCNullSpaceCreate(), PCNullSpaceRemove()
66b4fd4287SBarry Smith @*/
67b4fd4287SBarry Smith int PCNullSpaceDestroy(PCNullSpace sp)
68b4fd4287SBarry Smith {
693a40ed3dSBarry Smith   PetscFunctionBegin;
7085614651SBarry Smith 
7185614651SBarry Smith   if (--sp->refct > 0) PetscFunctionReturn(0);
7285614651SBarry Smith 
73b4fd4287SBarry Smith   PLogObjectDestroy(sp);
74b4fd4287SBarry Smith   PetscHeaderDestroy(sp);
753a40ed3dSBarry Smith   PetscFunctionReturn(0);
76b4fd4287SBarry Smith }
77b4fd4287SBarry Smith 
785615d1e5SSatish Balay #undef __FUNC__
79b2863d3aSBarry Smith #define __FUNC__ /*<a name=""></a>*/"PCNullSpaceRemove"
80b4fd4287SBarry Smith /*@
81b4fd4287SBarry Smith    PCNullSpaceRemove - Removes all the components of a null space from a vector.
82f7765cecSBarry Smith 
83fee21e36SBarry Smith    Collective on PCNullSpace
84f7765cecSBarry Smith 
854e472627SLois Curfman McInnes    Input Parameters:
864e472627SLois Curfman McInnes +  sp - the null space context
8783c3bef8SLois Curfman McInnes -  vec - the vector from which the null space is to be removed
884e472627SLois Curfman McInnes 
89b9756687SLois Curfman McInnes    Level: advanced
90b9756687SLois Curfman McInnes 
9183c3bef8SLois Curfman McInnes .keywords: PC, null space, remove
9241a59933SSatish Balay 
9383c3bef8SLois Curfman McInnes .seealso: PCNullSpaceCreate(), PCNullSpaceDestroy()
94f7765cecSBarry Smith @*/
95b4fd4287SBarry Smith int PCNullSpaceRemove(PCNullSpace sp,Vec vec)
96f7765cecSBarry Smith {
97b4fd4287SBarry Smith   Scalar sum;
98b4fd4287SBarry Smith   int    j,n = sp->n,N,ierr;
99f7765cecSBarry Smith 
1003a40ed3dSBarry Smith   PetscFunctionBegin;
101b4fd4287SBarry Smith   if (sp->has_cnst) {
102b4fd4287SBarry Smith     ierr = VecSum(vec,&sum);CHKERRQ(ierr);
103b4fd4287SBarry Smith     ierr = VecGetSize(vec,&N);CHKERRQ(ierr);
10418a7d68fSSatish Balay     sum  = sum/(-1.0*N);
105b4fd4287SBarry Smith     ierr = VecShift(&sum,vec);CHKERRQ(ierr);
106f7765cecSBarry Smith   }
107b4fd4287SBarry Smith 
108b4fd4287SBarry Smith   for (j=0; j<n; j++) {
109b4fd4287SBarry Smith     ierr = VecDot(vec,sp->vecs[j],&sum);CHKERRQ(ierr);
110b4fd4287SBarry Smith     sum  = -sum;
11185614651SBarry Smith     ierr = VecAXPY(&sum,sp->vecs[j],vec);CHKERRQ(ierr);
112f7765cecSBarry Smith   }
113b4fd4287SBarry Smith 
1143a40ed3dSBarry Smith   PetscFunctionReturn(0);
115f7765cecSBarry Smith }
116