xref: /petsc/src/ksp/pc/impls/mg/fmg.c (revision 0e5e90baed20fcf66590e8d3abe9cacb3e2155d0)
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