1a5eb4965SSatish Balay #ifdef PETSC_RCS_HEADER 2*83c3bef8SLois Curfman McInnes static char vcid[] = "$Id: pcnull.c,v 1.20 1999/01/31 16:08: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*/ 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: 23*83c3bef8SLois Curfman McInnes + comm - the MPI communicator associated with the object 24*83c3bef8SLois 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 26*83c3bef8SLois 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 32*83c3bef8SLois Curfman McInnes Level: advanced 33*83c3bef8SLois Curfman McInnes 34*83c3bef8SLois Curfman McInnes .keywords: PC, null space, create 35*83c3bef8SLois 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 /*@ 57b4fd4287SBarry 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 67*83c3bef8SLois Curfman McInnes .keywords: PC, null space, destroy 68*83c3bef8SLois Curfman McInnes .seealso: PCNullSpaceDestroy(), PCNullSpaceRemove() 69b4fd4287SBarry Smith @*/ 70b4fd4287SBarry Smith int PCNullSpaceDestroy(PCNullSpace sp) 71b4fd4287SBarry Smith { 723a40ed3dSBarry Smith PetscFunctionBegin; 73b4fd4287SBarry Smith PLogObjectDestroy(sp); 74b4fd4287SBarry Smith PetscHeaderDestroy(sp); 753a40ed3dSBarry Smith PetscFunctionReturn(0); 76b4fd4287SBarry Smith } 77b4fd4287SBarry Smith 785615d1e5SSatish Balay #undef __FUNC__ 795615d1e5SSatish Balay #define __FUNC__ "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 87*83c3bef8SLois 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 91*83c3bef8SLois Curfman McInnes .keywords: PC, null space, remove 92*83c3bef8SLois Curfman McInnes .seealso: PCNullSpaceCreate(), PCNullSpaceDestroy() 93f7765cecSBarry Smith @*/ 94b4fd4287SBarry Smith int PCNullSpaceRemove(PCNullSpace sp,Vec vec) 95f7765cecSBarry Smith { 96b4fd4287SBarry Smith Scalar sum; 97b4fd4287SBarry Smith int j, n = sp->n, N,ierr; 98f7765cecSBarry Smith 993a40ed3dSBarry Smith PetscFunctionBegin; 100b4fd4287SBarry Smith if (sp->has_cnst) { 101b4fd4287SBarry Smith ierr = VecSum(vec,&sum); CHKERRQ(ierr); 102b4fd4287SBarry Smith ierr = VecGetSize(vec,&N); CHKERRQ(ierr); 10318a7d68fSSatish Balay sum = sum/(-1.0*N); 104b4fd4287SBarry Smith ierr = VecShift(&sum,vec); CHKERRQ(ierr); 105f7765cecSBarry Smith } 106b4fd4287SBarry Smith 107b4fd4287SBarry Smith for ( j=0; j<n; j++ ) { 108b4fd4287SBarry Smith ierr = VecDot(vec,sp->vecs[j],&sum);CHKERRQ(ierr); 109b4fd4287SBarry Smith sum = -sum; 110b4fd4287SBarry Smith ierr = VecAYPX(&sum,sp->vecs[j],vec); CHKERRQ(ierr); 111f7765cecSBarry Smith } 112b4fd4287SBarry Smith 1133a40ed3dSBarry Smith PetscFunctionReturn(0); 114f7765cecSBarry Smith } 115