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