1 #define PETSCKSP_DLL 2 3 /* 4 Full multigrid using either additive or multiplicative V or W cycle 5 */ 6 #include "src/ksp/pc/impls/mg/mgimpl.h" 7 8 EXTERN PetscErrorCode PCMGMCycle_Private(PC_MG **,PetscTruth*); 9 10 #undef __FUNCT__ 11 #define __FUNCT__ "PCMGFCycle_Private" 12 PetscErrorCode PCMGFCycle_Private(PC_MG **mg) 13 { 14 PetscErrorCode ierr; 15 PetscInt i,l = mg[0]->levels; 16 PetscScalar zero = 0.0; 17 18 PetscFunctionBegin; 19 /* restrict the RHS through all levels to coarsest. */ 20 for (i=l-1; i>0; i--){ 21 ierr = MatRestrict(mg[i]->restrct,mg[i]->b,mg[i-1]->b);CHKERRQ(ierr); 22 } 23 24 /* work our way up through the levels */ 25 ierr = VecSet(mg[0]->x,zero);CHKERRQ(ierr); 26 for (i=0; i<l-1; i++) { 27 ierr = PCMGMCycle_Private(&mg[i],PETSC_NULL);CHKERRQ(ierr); 28 ierr = MatInterpolate(mg[i+1]->interpolate,mg[i]->x,mg[i+1]->x);CHKERRQ(ierr); 29 } 30 ierr = PCMGMCycle_Private(&mg[l-1],PETSC_NULL);CHKERRQ(ierr); 31 PetscFunctionReturn(0); 32 } 33 34 #undef __FUNCT__ 35 #define __FUNCT__ "PCMGKCycle_Private" 36 PetscErrorCode PCMGKCycle_Private(PC_MG **mg) 37 { 38 PetscErrorCode ierr; 39 PetscInt i,l = mg[0]->levels; 40 PetscScalar zero = 0.0; 41 42 PetscFunctionBegin; 43 /* restrict the RHS through all levels to coarsest. */ 44 for (i=l-1; i>0; i--){ 45 ierr = MatRestrict(mg[i]->restrct,mg[i]->b,mg[i-1]->b);CHKERRQ(ierr); 46 } 47 48 /* work our way up through the levels */ 49 ierr = VecSet(mg[0]->x,zero);CHKERRQ(ierr); 50 for (i=0; i<l-1; i++) { 51 if (mg[i]->eventsolve) {ierr = PetscLogEventBegin(mg[i]->eventsolve,0,0,0,0);CHKERRQ(ierr);} 52 ierr = KSPSolve(mg[i]->smoothd,mg[i]->b,mg[i]->x);CHKERRQ(ierr); 53 if (mg[i]->eventsolve) {ierr = PetscLogEventEnd(mg[i]->eventsolve,0,0,0,0);CHKERRQ(ierr);} 54 ierr = MatInterpolate(mg[i+1]->interpolate,mg[i]->x,mg[i+1]->x);CHKERRQ(ierr); 55 } 56 if (mg[l-1]->eventsolve) {ierr = PetscLogEventBegin(mg[l-1]->eventsolve,0,0,0,0);CHKERRQ(ierr);} 57 ierr = KSPSolve(mg[l-1]->smoothd,mg[l-1]->b,mg[l-1]->x);CHKERRQ(ierr); 58 if (mg[l-1]->eventsolve) {ierr = PetscLogEventEnd(mg[l-1]->eventsolve,0,0,0,0);CHKERRQ(ierr);} 59 60 PetscFunctionReturn(0); 61 } 62 63 64