1*4b9ad928SBarry Smith /*$Id: smg.c,v 1.24 2001/08/07 03:03:36 balay Exp $*/ 2*4b9ad928SBarry Smith /* 3*4b9ad928SBarry Smith Additive Multigrid V Cycle routine 4*4b9ad928SBarry Smith */ 5*4b9ad928SBarry Smith #include "src/ksp/pc/impls/mg/mgimpl.h" 6*4b9ad928SBarry Smith 7*4b9ad928SBarry Smith /* 8*4b9ad928SBarry Smith MGACycle_Private - Given an MG structure created with MGCreate() runs 9*4b9ad928SBarry Smith one cycle down through the levels and back up. Applys 10*4b9ad928SBarry Smith the smoothers in an additive manner. 11*4b9ad928SBarry Smith 12*4b9ad928SBarry Smith Iput Parameters: 13*4b9ad928SBarry Smith . mg - structure created with MGCreate(). 14*4b9ad928SBarry Smith 15*4b9ad928SBarry Smith */ 16*4b9ad928SBarry Smith #undef __FUNCT__ 17*4b9ad928SBarry Smith #define __FUNCT__ "MGACycle_Private" 18*4b9ad928SBarry Smith int MGACycle_Private(MG *mg) 19*4b9ad928SBarry Smith { 20*4b9ad928SBarry Smith int i,l = mg[0]->levels,ierr; 21*4b9ad928SBarry Smith PetscScalar zero = 0.0; 22*4b9ad928SBarry Smith 23*4b9ad928SBarry Smith PetscFunctionBegin; 24*4b9ad928SBarry Smith /* compute RHS on each level */ 25*4b9ad928SBarry Smith for (i=l-1; i>0; i--) { 26*4b9ad928SBarry Smith ierr = MatRestrict(mg[i]->restrct,mg[i]->b,mg[i-1]->b);CHKERRQ(ierr); 27*4b9ad928SBarry Smith } 28*4b9ad928SBarry Smith /* solve seperately on each level */ 29*4b9ad928SBarry Smith for (i=0; i<l; i++) { 30*4b9ad928SBarry Smith ierr = VecSet(&zero,mg[i]->x);CHKERRQ(ierr); 31*4b9ad928SBarry Smith if (mg[i]->eventsolve) {ierr = PetscLogEventBegin(mg[i]->eventsolve,0,0,0,0);CHKERRQ(ierr);} 32*4b9ad928SBarry Smith ierr = KSPSetRhs(mg[i]->smoothd,mg[i]->b);CHKERRQ(ierr); 33*4b9ad928SBarry Smith ierr = KSPSetSolution(mg[i]->smoothd,mg[i]->x);CHKERRQ(ierr); 34*4b9ad928SBarry Smith ierr = KSPSolve(mg[i]->smoothd);CHKERRQ(ierr); 35*4b9ad928SBarry Smith if (mg[i]->eventsolve) {ierr = PetscLogEventEnd(mg[i]->eventsolve,0,0,0,0);CHKERRQ(ierr);} 36*4b9ad928SBarry Smith } 37*4b9ad928SBarry Smith for (i=1; i<l; i++) { 38*4b9ad928SBarry Smith ierr = MatInterpolateAdd(mg[i]->interpolate,mg[i-1]->x,mg[i]->x,mg[i]->x);CHKERRQ(ierr); 39*4b9ad928SBarry Smith } 40*4b9ad928SBarry Smith PetscFunctionReturn(0); 41*4b9ad928SBarry Smith } 42