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