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