File: | ksp/pc/impls/mg/mg.c |
Warning: | line 421, column 29 Array access (from variable 'mglevels') results in a null pointer dereference |
[?] Use j/k keys for keyboard navigation
1 | ||||
2 | /* | |||
3 | Defines the multigrid preconditioner interface. | |||
4 | */ | |||
5 | #include <petsc/private/pcmgimpl.h> /*I "petscksp.h" I*/ | |||
6 | #include <petscdm.h> | |||
7 | PETSC_INTERNextern __attribute__((visibility ("hidden"))) PetscErrorCode PCPreSolveChangeRHS(PC,PetscBool*); | |||
8 | ||||
9 | PetscErrorCode PCMGMCycle_Private(PC pc,PC_MG_Levels **mglevelsin,PCRichardsonConvergedReason *reason) | |||
10 | { | |||
11 | PC_MG *mg = (PC_MG*)pc->data; | |||
12 | PC_MG_Levels *mgc,*mglevels = *mglevelsin; | |||
13 | PetscErrorCode ierr; | |||
14 | PetscInt cycles = (mglevels->level == 1) ? 1 : (PetscInt) mglevels->cycles; | |||
15 | ||||
16 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c"; petscstack ->line[petscstack->currentsize] = 16; petscstack->petscroutine [petscstack->currentsize] = PETSC_TRUE; petscstack->currentsize ++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0); ; } while (0); | |||
17 | if (mglevels->eventsmoothsolve) {ierr = PetscLogEventBegin(mglevels->eventsmoothsolve,0,0,0,0)(((PetscLogPLB && petsc_stageLog->stageInfo[petsc_stageLog ->curStage].perfInfo.active && petsc_stageLog-> stageInfo[petsc_stageLog->curStage].eventLog->eventInfo [mglevels->eventsmoothsolve].active) ? (*PetscLogPLB)((mglevels ->eventsmoothsolve),0,(PetscObject)(0),(PetscObject)(0),(PetscObject )(0),(PetscObject)(0)) : 0 ));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),17,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0);} | |||
18 | ierr = KSPSolve(mglevels->smoothd,mglevels->b,mglevels->x);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),18,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); /* pre-smooth */ | |||
19 | ierr = KSPCheckSolve(mglevels->smoothd,pc,mglevels->x);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),19,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
20 | if (mglevels->eventsmoothsolve) {ierr = PetscLogEventEnd(mglevels->eventsmoothsolve,0,0,0,0)(((PetscLogPLE && petsc_stageLog->stageInfo[petsc_stageLog ->curStage].perfInfo.active && petsc_stageLog-> stageInfo[petsc_stageLog->curStage].eventLog->eventInfo [mglevels->eventsmoothsolve].active) ? (*PetscLogPLE)((mglevels ->eventsmoothsolve),0,(PetscObject)(0),(PetscObject)(0),(PetscObject )(0),(PetscObject)(0)) : 0 ));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),20,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0);} | |||
21 | if (mglevels->level) { /* not the coarsest grid */ | |||
22 | if (mglevels->eventresidual) {ierr = PetscLogEventBegin(mglevels->eventresidual,0,0,0,0)(((PetscLogPLB && petsc_stageLog->stageInfo[petsc_stageLog ->curStage].perfInfo.active && petsc_stageLog-> stageInfo[petsc_stageLog->curStage].eventLog->eventInfo [mglevels->eventresidual].active) ? (*PetscLogPLB)((mglevels ->eventresidual),0,(PetscObject)(0),(PetscObject)(0),(PetscObject )(0),(PetscObject)(0)) : 0 ));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),22,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0);} | |||
23 | ierr = (*mglevels->residual)(mglevels->A,mglevels->b,mglevels->x,mglevels->r);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),23,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
24 | if (mglevels->eventresidual) {ierr = PetscLogEventEnd(mglevels->eventresidual,0,0,0,0)(((PetscLogPLE && petsc_stageLog->stageInfo[petsc_stageLog ->curStage].perfInfo.active && petsc_stageLog-> stageInfo[petsc_stageLog->curStage].eventLog->eventInfo [mglevels->eventresidual].active) ? (*PetscLogPLE)((mglevels ->eventresidual),0,(PetscObject)(0),(PetscObject)(0),(PetscObject )(0),(PetscObject)(0)) : 0 ));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),24,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0);} | |||
25 | ||||
26 | /* if on finest level and have convergence criteria set */ | |||
27 | if (mglevels->level == mglevels->levels-1 && mg->ttol && reason) { | |||
28 | PetscReal rnorm; | |||
29 | ierr = VecNorm(mglevels->r,NORM_2,&rnorm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),29,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
30 | if (rnorm <= mg->ttol) { | |||
31 | if (rnorm < mg->abstol) { | |||
32 | *reason = PCRICHARDSON_CONVERGED_ATOL; | |||
33 | ierr = PetscInfo2(pc,"Linear solver has converged. Residual norm %g is less than absolute tolerance %g\n",(double)rnorm,(double)mg->abstol)PetscInfo_Private(__func__,pc,"Linear solver has converged. Residual norm %g is less than absolute tolerance %g\n" ,(double)rnorm,(double)mg->abstol);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),33,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
34 | } else { | |||
35 | *reason = PCRICHARDSON_CONVERGED_RTOL; | |||
36 | ierr = PetscInfo2(pc,"Linear solver has converged. Residual norm %g is less than relative tolerance times initial residual norm %g\n",(double)rnorm,(double)mg->ttol)PetscInfo_Private(__func__,pc,"Linear solver has converged. Residual norm %g is less than relative tolerance times initial residual norm %g\n" ,(double)rnorm,(double)mg->ttol);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),36,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
37 | } | |||
38 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
39 | } | |||
40 | } | |||
41 | ||||
42 | mgc = *(mglevelsin - 1); | |||
43 | if (mglevels->eventinterprestrict) {ierr = PetscLogEventBegin(mglevels->eventinterprestrict,0,0,0,0)(((PetscLogPLB && petsc_stageLog->stageInfo[petsc_stageLog ->curStage].perfInfo.active && petsc_stageLog-> stageInfo[petsc_stageLog->curStage].eventLog->eventInfo [mglevels->eventinterprestrict].active) ? (*PetscLogPLB)(( mglevels->eventinterprestrict),0,(PetscObject)(0),(PetscObject )(0),(PetscObject)(0),(PetscObject)(0)) : 0 ));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),43,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0);} | |||
44 | ierr = MatRestrict(mglevels->restrct,mglevels->r,mgc->b);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),44,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
45 | if (mglevels->eventinterprestrict) {ierr = PetscLogEventEnd(mglevels->eventinterprestrict,0,0,0,0)(((PetscLogPLE && petsc_stageLog->stageInfo[petsc_stageLog ->curStage].perfInfo.active && petsc_stageLog-> stageInfo[petsc_stageLog->curStage].eventLog->eventInfo [mglevels->eventinterprestrict].active) ? (*PetscLogPLE)(( mglevels->eventinterprestrict),0,(PetscObject)(0),(PetscObject )(0),(PetscObject)(0),(PetscObject)(0)) : 0 ));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),45,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0);} | |||
46 | ierr = VecSet(mgc->x,0.0);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),46,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
47 | while (cycles--) { | |||
48 | ierr = PCMGMCycle_Private(pc,mglevelsin-1,reason);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),48,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
49 | } | |||
50 | if (mglevels->eventinterprestrict) {ierr = PetscLogEventBegin(mglevels->eventinterprestrict,0,0,0,0)(((PetscLogPLB && petsc_stageLog->stageInfo[petsc_stageLog ->curStage].perfInfo.active && petsc_stageLog-> stageInfo[petsc_stageLog->curStage].eventLog->eventInfo [mglevels->eventinterprestrict].active) ? (*PetscLogPLB)(( mglevels->eventinterprestrict),0,(PetscObject)(0),(PetscObject )(0),(PetscObject)(0),(PetscObject)(0)) : 0 ));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),50,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0);} | |||
51 | ierr = MatInterpolateAdd(mglevels->interpolate,mgc->x,mglevels->x,mglevels->x);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),51,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
52 | if (mglevels->eventinterprestrict) {ierr = PetscLogEventEnd(mglevels->eventinterprestrict,0,0,0,0)(((PetscLogPLE && petsc_stageLog->stageInfo[petsc_stageLog ->curStage].perfInfo.active && petsc_stageLog-> stageInfo[petsc_stageLog->curStage].eventLog->eventInfo [mglevels->eventinterprestrict].active) ? (*PetscLogPLE)(( mglevels->eventinterprestrict),0,(PetscObject)(0),(PetscObject )(0),(PetscObject)(0),(PetscObject)(0)) : 0 ));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),52,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0);} | |||
53 | if (mglevels->eventsmoothsolve) {ierr = PetscLogEventBegin(mglevels->eventsmoothsolve,0,0,0,0)(((PetscLogPLB && petsc_stageLog->stageInfo[petsc_stageLog ->curStage].perfInfo.active && petsc_stageLog-> stageInfo[petsc_stageLog->curStage].eventLog->eventInfo [mglevels->eventsmoothsolve].active) ? (*PetscLogPLB)((mglevels ->eventsmoothsolve),0,(PetscObject)(0),(PetscObject)(0),(PetscObject )(0),(PetscObject)(0)) : 0 ));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),53,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0);} | |||
54 | ierr = KSPSolve(mglevels->smoothu,mglevels->b,mglevels->x);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),54,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); /* post smooth */ | |||
55 | ierr = KSPCheckSolve(mglevels->smoothu,pc,mglevels->x);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),55,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
56 | if (mglevels->eventsmoothsolve) {ierr = PetscLogEventEnd(mglevels->eventsmoothsolve,0,0,0,0)(((PetscLogPLE && petsc_stageLog->stageInfo[petsc_stageLog ->curStage].perfInfo.active && petsc_stageLog-> stageInfo[petsc_stageLog->curStage].eventLog->eventInfo [mglevels->eventsmoothsolve].active) ? (*PetscLogPLE)((mglevels ->eventsmoothsolve),0,(PetscObject)(0),(PetscObject)(0),(PetscObject )(0),(PetscObject)(0)) : 0 ));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),56,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0);} | |||
57 | } | |||
58 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
59 | } | |||
60 | ||||
61 | static PetscErrorCode PCApplyRichardson_MG(PC pc,Vec b,Vec x,Vec w,PetscReal rtol,PetscReal abstol, PetscReal dtol,PetscInt its,PetscBool zeroguess,PetscInt *outits,PCRichardsonConvergedReason *reason) | |||
62 | { | |||
63 | PC_MG *mg = (PC_MG*)pc->data; | |||
64 | PC_MG_Levels **mglevels = mg->levels; | |||
65 | PetscErrorCode ierr; | |||
66 | PC tpc; | |||
67 | PetscBool changeu,changed; | |||
68 | PetscInt levels = mglevels[0]->levels,i; | |||
69 | ||||
70 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c"; petscstack ->line[petscstack->currentsize] = 70; petscstack->petscroutine [petscstack->currentsize] = PETSC_TRUE; petscstack->currentsize ++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0); ; } while (0); | |||
71 | /* When the DM is supplying the matrix then it will not exist until here */ | |||
72 | for (i=0; i<levels; i++) { | |||
73 | if (!mglevels[i]->A) { | |||
74 | ierr = KSPGetOperators(mglevels[i]->smoothu,&mglevels[i]->A,NULL((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),74,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
75 | ierr = PetscObjectReference((PetscObject)mglevels[i]->A);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),75,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
76 | } | |||
77 | } | |||
78 | ||||
79 | ierr = KSPGetPC(mglevels[levels-1]->smoothd,&tpc);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),79,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
80 | ierr = PCPreSolveChangeRHS(tpc,&changed);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),80,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
81 | ierr = KSPGetPC(mglevels[levels-1]->smoothu,&tpc);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),81,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
82 | ierr = PCPreSolveChangeRHS(tpc,&changeu);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),82,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
83 | if (!changed && !changeu) { | |||
84 | ierr = VecDestroy(&mglevels[levels-1]->b);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),84,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
85 | mglevels[levels-1]->b = b; | |||
86 | } else { /* if the smoother changes the rhs during PreSolve, we cannot use the input vector */ | |||
87 | if (!mglevels[levels-1]->b) { | |||
88 | Vec *vec; | |||
89 | ||||
90 | ierr = KSPCreateVecs(mglevels[levels-1]->smoothd,1,&vec,0,NULL((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),90,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
91 | mglevels[levels-1]->b = *vec; | |||
92 | ierr = PetscFree(vec)((*PetscTrFree)((void*)(vec),92,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ) || ((vec) = 0,0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),92,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
93 | } | |||
94 | ierr = VecCopy(b,mglevels[levels-1]->b);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),94,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
95 | } | |||
96 | mglevels[levels-1]->x = x; | |||
97 | ||||
98 | mg->rtol = rtol; | |||
99 | mg->abstol = abstol; | |||
100 | mg->dtol = dtol; | |||
101 | if (rtol) { | |||
102 | /* compute initial residual norm for relative convergence test */ | |||
103 | PetscReal rnorm; | |||
104 | if (zeroguess) { | |||
105 | ierr = VecNorm(b,NORM_2,&rnorm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),105,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
106 | } else { | |||
107 | ierr = (*mglevels[levels-1]->residual)(mglevels[levels-1]->A,b,x,w);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),107,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
108 | ierr = VecNorm(w,NORM_2,&rnorm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),108,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
109 | } | |||
110 | mg->ttol = PetscMax(rtol*rnorm,abstol)(((rtol*rnorm)<(abstol)) ? (abstol) : (rtol*rnorm)); | |||
111 | } else if (abstol) mg->ttol = abstol; | |||
112 | else mg->ttol = 0.0; | |||
113 | ||||
114 | /* since smoother is applied to full system, not just residual we need to make sure that smoothers don't | |||
115 | stop prematurely due to small residual */ | |||
116 | for (i=1; i<levels; i++) { | |||
117 | ierr = KSPSetTolerances(mglevels[i]->smoothu,0,PETSC_DEFAULT-2,PETSC_DEFAULT-2,PETSC_DEFAULT-2);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),117,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
118 | if (mglevels[i]->smoothu != mglevels[i]->smoothd) { | |||
119 | /* For Richardson the initial guess is nonzero since it is solving in each cycle the original system not just applying as a preconditioner */ | |||
120 | ierr = KSPSetInitialGuessNonzero(mglevels[i]->smoothd,PETSC_TRUE);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),120,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
121 | ierr = KSPSetTolerances(mglevels[i]->smoothd,0,PETSC_DEFAULT-2,PETSC_DEFAULT-2,PETSC_DEFAULT-2);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),121,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
122 | } | |||
123 | } | |||
124 | ||||
125 | *reason = (PCRichardsonConvergedReason)0; | |||
126 | for (i=0; i<its; i++) { | |||
127 | ierr = PCMGMCycle_Private(pc,mglevels+levels-1,reason);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),127,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
128 | if (*reason) break; | |||
129 | } | |||
130 | if (!*reason) *reason = PCRICHARDSON_CONVERGED_ITS; | |||
131 | *outits = i; | |||
132 | if (!changed && !changeu) mglevels[levels-1]->b = NULL((void*)0); | |||
133 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
134 | } | |||
135 | ||||
136 | PetscErrorCode PCReset_MG(PC pc) | |||
137 | { | |||
138 | PC_MG *mg = (PC_MG*)pc->data; | |||
139 | PC_MG_Levels **mglevels = mg->levels; | |||
140 | PetscErrorCode ierr; | |||
141 | PetscInt i,n; | |||
142 | ||||
143 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c"; petscstack ->line[petscstack->currentsize] = 143; petscstack->petscroutine [petscstack->currentsize] = PETSC_TRUE; petscstack->currentsize ++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0); ; } while (0); | |||
144 | if (mglevels) { | |||
145 | n = mglevels[0]->levels; | |||
146 | for (i=0; i<n-1; i++) { | |||
147 | ierr = VecDestroy(&mglevels[i+1]->r);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),147,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
148 | ierr = VecDestroy(&mglevels[i]->b);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),148,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
149 | ierr = VecDestroy(&mglevels[i]->x);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),149,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
150 | ierr = MatDestroy(&mglevels[i+1]->restrct);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),150,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
151 | ierr = MatDestroy(&mglevels[i+1]->interpolate);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),151,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
152 | ierr = MatDestroy(&mglevels[i+1]->inject);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),152,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
153 | ierr = VecDestroy(&mglevels[i+1]->rscale);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),153,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
154 | } | |||
155 | /* this is not null only if the smoother on the finest level | |||
156 | changes the rhs during PreSolve */ | |||
157 | ierr = VecDestroy(&mglevels[n-1]->b);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),157,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
158 | ||||
159 | for (i=0; i<n; i++) { | |||
160 | ierr = MatDestroy(&mglevels[i]->A);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),160,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
161 | if (mglevels[i]->smoothd != mglevels[i]->smoothu) { | |||
162 | ierr = KSPReset(mglevels[i]->smoothd);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),162,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
163 | } | |||
164 | ierr = KSPReset(mglevels[i]->smoothu);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),164,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
165 | } | |||
166 | } | |||
167 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
168 | } | |||
169 | ||||
170 | PetscErrorCode PCMGSetLevels_MG(PC pc,PetscInt levels,MPI_Comm *comms) | |||
171 | { | |||
172 | PetscErrorCode ierr; | |||
173 | PC_MG *mg = (PC_MG*)pc->data; | |||
174 | MPI_Comm comm; | |||
175 | PC_MG_Levels **mglevels = mg->levels; | |||
176 | PCMGType mgtype = mg->am; | |||
177 | PetscInt mgctype = (PetscInt) PC_MG_CYCLE_V; | |||
178 | PetscInt i; | |||
179 | PetscMPIInt size; | |||
180 | const char *prefix; | |||
181 | PC ipc; | |||
182 | PetscInt n; | |||
183 | ||||
184 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c"; petscstack ->line[petscstack->currentsize] = 184; petscstack->petscroutine [petscstack->currentsize] = PETSC_TRUE; petscstack->currentsize ++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0); ; } while (0); | |||
185 | PetscValidHeaderSpecific(pc,PC_CLASSID,1)do { if (!pc) return PetscError(((MPI_Comm)0x44000001),185,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c",85,PETSC_ERROR_INITIAL ,"Null Object: Parameter # %d",1); if (!PetscCheckPointer(pc, PETSC_OBJECT)) return PetscError(((MPI_Comm)0x44000001),185,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c",64,PETSC_ERROR_INITIAL ,"Invalid Pointer to Object: Parameter # %d",1); if (((PetscObject )(pc))->classid != PC_CLASSID) { if (((PetscObject)(pc))-> classid == -1) return PetscError(((MPI_Comm)0x44000001),185,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c",64,PETSC_ERROR_INITIAL ,"Object already free: Parameter # %d",1); else return PetscError (((MPI_Comm)0x44000001),185,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,62,PETSC_ERROR_INITIAL,"Wrong type of object: Parameter # %d" ,1); } } while (0); | |||
186 | PetscValidLogicalCollectiveInt(pc,levels,2)do { PetscErrorCode _7_ierr; PetscInt b1[2],b2[2]; b1[0] = -levels ; b1[1] = levels; _7_ierr = (PetscAllreduceBarrierCheck(PetscObjectComm ((PetscObject)pc),2,186,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ) || ((petsc_allreduce_ct += PetscMPIParallelComm((PetscObjectComm ((PetscObject)pc))),0) || MPI_Allreduce((b1),(b2),(2),(((MPI_Datatype )0x4c000405)),((MPI_Op)(0x58000001)),(PetscObjectComm((PetscObject )pc)))));do {if (__builtin_expect(!!(_7_ierr),0)) return PetscError (((MPI_Comm)0x44000001),186,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,_7_ierr,PETSC_ERROR_REPEAT," ");} while (0); if (-b2[0] != b2 [1]) return PetscError(PetscObjectComm((PetscObject)pc),186,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c",62,PETSC_ERROR_INITIAL ,"Int value must be same on all processes, argument # %d",2); } while (0); | |||
187 | if (mg->nlevels == levels) PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
188 | ierr = PetscObjectGetComm((PetscObject)pc,&comm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),188,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
189 | if (mglevels) { | |||
190 | mgctype = mglevels[0]->cycles; | |||
191 | /* changing the number of levels so free up the previous stuff */ | |||
192 | ierr = PCReset_MG(pc);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),192,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
193 | n = mglevels[0]->levels; | |||
194 | for (i=0; i<n; i++) { | |||
195 | if (mglevels[i]->smoothd != mglevels[i]->smoothu) { | |||
196 | ierr = KSPDestroy(&mglevels[i]->smoothd);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),196,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
197 | } | |||
198 | ierr = KSPDestroy(&mglevels[i]->smoothu);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),198,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
199 | ierr = PetscFree(mglevels[i])((*PetscTrFree)((void*)(mglevels[i]),199,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ) || ((mglevels[i]) = 0,0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),199,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
200 | } | |||
201 | ierr = PetscFree(mg->levels)((*PetscTrFree)((void*)(mg->levels),201,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ) || ((mg->levels) = 0,0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),201,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
202 | } | |||
203 | ||||
204 | mg->nlevels = levels; | |||
205 | ||||
206 | ierr = PetscMalloc1(levels,&mglevels)PetscMallocA(1,PETSC_FALSE,206,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,(size_t)(levels)*sizeof(**(&mglevels)),(&mglevels));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),206,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
207 | ierr = PetscLogObjectMemory((PetscObject)pc,levels*(sizeof(PC_MG*)));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),207,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
208 | ||||
209 | ierr = PCGetOptionsPrefix(pc,&prefix);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),209,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
210 | ||||
211 | mg->stageApply = 0; | |||
212 | for (i=0; i<levels; i++) { | |||
213 | ierr = PetscNewLog(pc,&mglevels[i])(PetscMallocA(1,PETSC_TRUE,213,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,(size_t)(1)*sizeof(**(((&mglevels[i])))),(((&mglevels [i])))) || PetscLogObjectMemory((PetscObject)pc,sizeof(**(& mglevels[i]))));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),213,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
214 | ||||
215 | mglevels[i]->level = i; | |||
216 | mglevels[i]->levels = levels; | |||
217 | mglevels[i]->cycles = mgctype; | |||
218 | mg->default_smoothu = 2; | |||
219 | mg->default_smoothd = 2; | |||
220 | mglevels[i]->eventsmoothsetup = 0; | |||
221 | mglevels[i]->eventsmoothsolve = 0; | |||
222 | mglevels[i]->eventresidual = 0; | |||
223 | mglevels[i]->eventinterprestrict = 0; | |||
224 | ||||
225 | if (comms) comm = comms[i]; | |||
226 | ierr = KSPCreate(comm,&mglevels[i]->smoothd);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),226,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
227 | ierr = KSPSetErrorIfNotConverged(mglevels[i]->smoothd,pc->erroriffailure);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),227,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
228 | ierr = PetscObjectIncrementTabLevel((PetscObject)mglevels[i]->smoothd,(PetscObject)pc,levels-i);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),228,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
229 | ierr = KSPSetOptionsPrefix(mglevels[i]->smoothd,prefix);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),229,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
230 | ierr = PetscObjectComposedDataSetInt((PetscObject) mglevels[i]->smoothd, PetscMGLevelId, mglevels[i]->level)(((((PetscObject) mglevels[i]->smoothd)->int_idmax < PetscObjectComposedDataMax) && PetscObjectComposedDataIncreaseInt ((PetscObject) mglevels[i]->smoothd)) || (((PetscObject) mglevels [i]->smoothd)->intcomposeddata[PetscMGLevelId] = mglevels [i]->level,((PetscObject) mglevels[i]->smoothd)->intcomposedstate [PetscMGLevelId] = ((PetscObject) mglevels[i]->smoothd)-> state, 0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),230,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
231 | if (i || levels == 1) { | |||
232 | char tprefix[128]; | |||
233 | ||||
234 | ierr = KSPSetType(mglevels[i]->smoothd,KSPCHEBYSHEV"chebyshev");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),234,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
235 | ierr = KSPSetConvergenceTest(mglevels[i]->smoothd,KSPConvergedSkip,NULL((void*)0),NULL((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),235,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
236 | ierr = KSPSetNormType(mglevels[i]->smoothd,KSP_NORM_NONE);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),236,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
237 | ierr = KSPGetPC(mglevels[i]->smoothd,&ipc);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),237,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
238 | ierr = PCSetType(ipc,PCSOR"sor");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),238,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
239 | ierr = KSPSetTolerances(mglevels[i]->smoothd,PETSC_DEFAULT-2,PETSC_DEFAULT-2,PETSC_DEFAULT-2, mg->default_smoothd);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),239,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
240 | ||||
241 | sprintf(tprefix,"mg_levels_%d_",(int)i); | |||
242 | ierr = KSPAppendOptionsPrefix(mglevels[i]->smoothd,tprefix);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),242,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
243 | } else { | |||
244 | ierr = KSPAppendOptionsPrefix(mglevels[0]->smoothd,"mg_coarse_");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),244,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
245 | ||||
246 | /* coarse solve is (redundant) LU by default; set shifttype NONZERO to avoid annoying zero-pivot in LU preconditioner */ | |||
247 | ierr = KSPSetType(mglevels[0]->smoothd,KSPPREONLY"preonly");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),247,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
248 | ierr = KSPGetPC(mglevels[0]->smoothd,&ipc);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),248,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
249 | ierr = MPI_Comm_size(comm,&size);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),249,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
250 | if (size > 1) { | |||
251 | ierr = PCSetType(ipc,PCREDUNDANT"redundant");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),251,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
252 | } else { | |||
253 | ierr = PCSetType(ipc,PCLU"lu");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),253,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
254 | } | |||
255 | ierr = PCFactorSetShiftType(ipc,MAT_SHIFT_INBLOCKS);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),255,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
256 | } | |||
257 | ierr = PetscLogObjectParent((PetscObject)pc,(PetscObject)mglevels[i]->smoothd);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),257,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
258 | ||||
259 | mglevels[i]->smoothu = mglevels[i]->smoothd; | |||
260 | mg->rtol = 0.0; | |||
261 | mg->abstol = 0.0; | |||
262 | mg->dtol = 0.0; | |||
263 | mg->ttol = 0.0; | |||
264 | mg->cyclesperpcapply = 1; | |||
265 | } | |||
266 | mg->levels = mglevels; | |||
267 | ierr = PCMGSetType(pc,mgtype);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),267,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
268 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
269 | } | |||
270 | ||||
271 | /*@C | |||
272 | PCMGSetLevels - Sets the number of levels to use with MG. | |||
273 | Must be called before any other MG routine. | |||
274 | ||||
275 | Logically Collective on PC | |||
276 | ||||
277 | Input Parameters: | |||
278 | + pc - the preconditioner context | |||
279 | . levels - the number of levels | |||
280 | - comms - optional communicators for each level; this is to allow solving the coarser problems | |||
281 | on smaller sets of processors. | |||
282 | ||||
283 | Level: intermediate | |||
284 | ||||
285 | Notes: | |||
286 | If the number of levels is one then the multigrid uses the -mg_levels prefix | |||
287 | for setting the level options rather than the -mg_coarse prefix. | |||
288 | ||||
289 | .seealso: PCMGSetType(), PCMGGetLevels() | |||
290 | @*/ | |||
291 | PetscErrorCode PCMGSetLevels(PC pc,PetscInt levels,MPI_Comm *comms) | |||
292 | { | |||
293 | PetscErrorCode ierr; | |||
294 | ||||
295 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c"; petscstack ->line[petscstack->currentsize] = 295; petscstack->petscroutine [petscstack->currentsize] = PETSC_TRUE; petscstack->currentsize ++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0); ; } while (0); | |||
296 | PetscValidHeaderSpecific(pc,PC_CLASSID,1)do { if (!pc) return PetscError(((MPI_Comm)0x44000001),296,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c",85,PETSC_ERROR_INITIAL ,"Null Object: Parameter # %d",1); if (!PetscCheckPointer(pc, PETSC_OBJECT)) return PetscError(((MPI_Comm)0x44000001),296,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c",64,PETSC_ERROR_INITIAL ,"Invalid Pointer to Object: Parameter # %d",1); if (((PetscObject )(pc))->classid != PC_CLASSID) { if (((PetscObject)(pc))-> classid == -1) return PetscError(((MPI_Comm)0x44000001),296,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c",64,PETSC_ERROR_INITIAL ,"Object already free: Parameter # %d",1); else return PetscError (((MPI_Comm)0x44000001),296,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,62,PETSC_ERROR_INITIAL,"Wrong type of object: Parameter # %d" ,1); } } while (0); | |||
297 | if (comms) PetscValidPointer(comms,3)do { if (!comms) return PetscError(((MPI_Comm)0x44000001),297 ,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,85,PETSC_ERROR_INITIAL,"Null Pointer: Parameter # %d",3); if (!PetscCheckPointer(comms,PETSC_CHAR)) return PetscError(((MPI_Comm )0x44000001),297,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,68,PETSC_ERROR_INITIAL,"Invalid Pointer: Parameter # %d",3); } while (0); | |||
298 | ierr = PetscTryMethod(pc,"PCMGSetLevels_C",(PC,PetscInt,MPI_Comm*),(pc,levels,comms))0; do { PetscErrorCode (*f)(PC,PetscInt,MPI_Comm*), __ierr; __ierr = PetscObjectQueryFunction_Private(((PetscObject)pc),("PCMGSetLevels_C" ),(PetscVoidFunction*)(&f));do {if (__builtin_expect(!!(__ierr ),0)) return PetscError(((MPI_Comm)0x44000001),298,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,__ierr,PETSC_ERROR_REPEAT," ");} while (0); if (f) {__ierr = (*f)(pc,levels,comms);do {if (__builtin_expect(!!(__ierr),0) ) return PetscError(((MPI_Comm)0x44000001),298,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,__ierr,PETSC_ERROR_REPEAT," ");} while (0);} } while(0);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),298,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
299 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
300 | } | |||
301 | ||||
302 | ||||
303 | PetscErrorCode PCDestroy_MG(PC pc) | |||
304 | { | |||
305 | PetscErrorCode ierr; | |||
306 | PC_MG *mg = (PC_MG*)pc->data; | |||
307 | PC_MG_Levels **mglevels = mg->levels; | |||
308 | PetscInt i,n; | |||
309 | ||||
310 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c"; petscstack ->line[petscstack->currentsize] = 310; petscstack->petscroutine [petscstack->currentsize] = PETSC_TRUE; petscstack->currentsize ++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0); ; } while (0); | |||
311 | ierr = PCReset_MG(pc);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),311,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
312 | if (mglevels) { | |||
313 | n = mglevels[0]->levels; | |||
314 | for (i=0; i<n; i++) { | |||
315 | if (mglevels[i]->smoothd != mglevels[i]->smoothu) { | |||
316 | ierr = KSPDestroy(&mglevels[i]->smoothd);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),316,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
317 | } | |||
318 | ierr = KSPDestroy(&mglevels[i]->smoothu);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),318,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
319 | ierr = PetscFree(mglevels[i])((*PetscTrFree)((void*)(mglevels[i]),319,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ) || ((mglevels[i]) = 0,0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),319,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
320 | } | |||
321 | ierr = PetscFree(mg->levels)((*PetscTrFree)((void*)(mg->levels),321,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ) || ((mg->levels) = 0,0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),321,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
322 | } | |||
323 | ierr = PetscFree(pc->data)((*PetscTrFree)((void*)(pc->data),323,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ) || ((pc->data) = 0,0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),323,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
324 | ierr = PetscObjectComposeFunction((PetscObject)pc,"PCGetInterpolations_C",NULL)PetscObjectComposeFunction_Private((PetscObject)pc,"PCGetInterpolations_C" ,(PetscVoidFunction)(((void*)0)));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),324,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
325 | ierr = PetscObjectComposeFunction((PetscObject)pc,"PCGetCoarseOperators_C",NULL)PetscObjectComposeFunction_Private((PetscObject)pc,"PCGetCoarseOperators_C" ,(PetscVoidFunction)(((void*)0)));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),325,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
326 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
327 | } | |||
328 | ||||
329 | ||||
330 | ||||
331 | extern PetscErrorCode PCMGACycle_Private(PC,PC_MG_Levels**); | |||
332 | extern PetscErrorCode PCMGFCycle_Private(PC,PC_MG_Levels**); | |||
333 | extern PetscErrorCode PCMGKCycle_Private(PC,PC_MG_Levels**); | |||
334 | ||||
335 | /* | |||
336 | PCApply_MG - Runs either an additive, multiplicative, Kaskadic | |||
337 | or full cycle of multigrid. | |||
338 | ||||
339 | Note: | |||
340 | A simple wrapper which calls PCMGMCycle(),PCMGACycle(), or PCMGFCycle(). | |||
341 | */ | |||
342 | static PetscErrorCode PCApply_MG(PC pc,Vec b,Vec x) | |||
343 | { | |||
344 | PC_MG *mg = (PC_MG*)pc->data; | |||
345 | PC_MG_Levels **mglevels = mg->levels; | |||
346 | PetscErrorCode ierr; | |||
347 | PC tpc; | |||
348 | PetscInt levels = mglevels[0]->levels,i; | |||
349 | PetscBool changeu,changed; | |||
350 | ||||
351 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c"; petscstack ->line[petscstack->currentsize] = 351; petscstack->petscroutine [petscstack->currentsize] = PETSC_TRUE; petscstack->currentsize ++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0); ; } while (0); | |||
352 | if (mg->stageApply) {ierr = PetscLogStagePush(mg->stageApply);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),352,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0);} | |||
353 | /* When the DM is supplying the matrix then it will not exist until here */ | |||
354 | for (i=0; i<levels; i++) { | |||
355 | if (!mglevels[i]->A) { | |||
356 | ierr = KSPGetOperators(mglevels[i]->smoothu,&mglevels[i]->A,NULL((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),356,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
357 | ierr = PetscObjectReference((PetscObject)mglevels[i]->A);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),357,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
358 | } | |||
359 | } | |||
360 | ||||
361 | ierr = KSPGetPC(mglevels[levels-1]->smoothd,&tpc);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),361,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
362 | ierr = PCPreSolveChangeRHS(tpc,&changed);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),362,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
363 | ierr = KSPGetPC(mglevels[levels-1]->smoothu,&tpc);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),363,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
364 | ierr = PCPreSolveChangeRHS(tpc,&changeu);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),364,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
365 | if (!changeu && !changed) { | |||
366 | ierr = VecDestroy(&mglevels[levels-1]->b);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),366,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
367 | mglevels[levels-1]->b = b; | |||
368 | } else { /* if the smoother changes the rhs during PreSolve, we cannot use the input vector */ | |||
369 | if (!mglevels[levels-1]->b) { | |||
370 | Vec *vec; | |||
371 | ||||
372 | ierr = KSPCreateVecs(mglevels[levels-1]->smoothd,1,&vec,0,NULL((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),372,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
373 | mglevels[levels-1]->b = *vec; | |||
374 | ierr = PetscFree(vec)((*PetscTrFree)((void*)(vec),374,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ) || ((vec) = 0,0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),374,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
375 | } | |||
376 | ierr = VecCopy(b,mglevels[levels-1]->b);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),376,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
377 | } | |||
378 | mglevels[levels-1]->x = x; | |||
379 | ||||
380 | if (mg->am == PC_MG_MULTIPLICATIVE) { | |||
381 | ierr = VecSet(x,0.0);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),381,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
382 | for (i=0; i<mg->cyclesperpcapply; i++) { | |||
383 | ierr = PCMGMCycle_Private(pc,mglevels+levels-1,NULL((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),383,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
384 | } | |||
385 | } else if (mg->am == PC_MG_ADDITIVE) { | |||
386 | ierr = PCMGACycle_Private(pc,mglevels);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),386,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
387 | } else if (mg->am == PC_MG_KASKADE) { | |||
388 | ierr = PCMGKCycle_Private(pc,mglevels);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),388,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
389 | } else { | |||
390 | ierr = PCMGFCycle_Private(pc,mglevels);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),390,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
391 | } | |||
392 | if (mg->stageApply) {ierr = PetscLogStagePop();CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),392,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0);} | |||
393 | if (!changeu && !changed) mglevels[levels-1]->b = NULL((void*)0); | |||
394 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
395 | } | |||
396 | ||||
397 | ||||
398 | PetscErrorCode PCSetFromOptions_MG(PetscOptionItems *PetscOptionsObject,PC pc) | |||
399 | { | |||
400 | PetscErrorCode ierr; | |||
401 | PetscInt levels,cycles; | |||
402 | PetscBool flg; | |||
403 | PC_MG *mg = (PC_MG*)pc->data; | |||
404 | PC_MG_Levels **mglevels; | |||
405 | PCMGType mgtype; | |||
406 | PCMGCycleType mgctype; | |||
407 | PCMGGalerkinType gtype; | |||
408 | ||||
409 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c"; petscstack ->line[petscstack->currentsize] = 409; petscstack->petscroutine [petscstack->currentsize] = PETSC_TRUE; petscstack->currentsize ++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0); ; } while (0); | |||
410 | levels = PetscMax(mg->nlevels,1)(((mg->nlevels)<(1)) ? (1) : (mg->nlevels)); | |||
411 | ierr = PetscOptionsHead(PetscOptionsObject,"Multigrid options");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),411,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
412 | ierr = PetscOptionsInt("-pc_mg_levels","Number of Levels","PCMGSetLevels",levels,&levels,&flg)PetscOptionsInt_Private(PetscOptionsObject,"-pc_mg_levels","Number of Levels" ,"PCMGSetLevels",levels,&levels,&flg);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),412,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
413 | if (!flg && !mg->levels && pc->dm) { | |||
| ||||
414 | ierr = DMGetRefineLevel(pc->dm,&levels);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),414,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
415 | levels++; | |||
416 | mg->usedmfornumberoflevels = PETSC_TRUE; | |||
417 | } | |||
418 | ierr = PCMGSetLevels(pc,levels,NULL((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),418,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
419 | mglevels = mg->levels; | |||
420 | ||||
421 | mgctype = (PCMGCycleType) mglevels[0]->cycles; | |||
| ||||
422 | ierr = PetscOptionsEnum("-pc_mg_cycle_type","V cycle or for W-cycle","PCMGSetCycleType",PCMGCycleTypes,(PetscEnum)mgctype,(PetscEnum*)&mgctype,&flg)PetscOptionsEnum_Private(PetscOptionsObject,"-pc_mg_cycle_type" ,"V cycle or for W-cycle","PCMGSetCycleType",PCMGCycleTypes,( PetscEnum)mgctype,(PetscEnum*)&mgctype,&flg);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),422,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
423 | if (flg) { | |||
424 | ierr = PCMGSetCycleType(pc,mgctype);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),424,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
425 | } | |||
426 | gtype = mg->galerkin; | |||
427 | ierr = PetscOptionsEnum("-pc_mg_galerkin","Use Galerkin process to compute coarser operators","PCMGSetGalerkin",PCMGGalerkinTypes,(PetscEnum)gtype,(PetscEnum*)>ype,&flg)PetscOptionsEnum_Private(PetscOptionsObject,"-pc_mg_galerkin" ,"Use Galerkin process to compute coarser operators","PCMGSetGalerkin" ,PCMGGalerkinTypes,(PetscEnum)gtype,(PetscEnum*)>ype,& flg);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),427,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
428 | if (flg) { | |||
429 | ierr = PCMGSetGalerkin(pc,gtype);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),429,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
430 | } | |||
431 | flg = PETSC_FALSE; | |||
432 | ierr = PetscOptionsBool("-pc_mg_distinct_smoothup","Create seperate smoothup KSP and append the prefix _up","PCMGSetDistinctSmoothUp",PETSC_FALSE,&flg,NULL)PetscOptionsBool_Private(PetscOptionsObject,"-pc_mg_distinct_smoothup" ,"Create seperate smoothup KSP and append the prefix _up","PCMGSetDistinctSmoothUp" ,PETSC_FALSE,&flg,((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),432,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
433 | if (flg) { | |||
434 | ierr = PCMGSetDistinctSmoothUp(pc);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),434,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
435 | } | |||
436 | mgtype = mg->am; | |||
437 | ierr = PetscOptionsEnum("-pc_mg_type","Multigrid type","PCMGSetType",PCMGTypes,(PetscEnum)mgtype,(PetscEnum*)&mgtype,&flg)PetscOptionsEnum_Private(PetscOptionsObject,"-pc_mg_type","Multigrid type" ,"PCMGSetType",PCMGTypes,(PetscEnum)mgtype,(PetscEnum*)&mgtype ,&flg);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),437,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
438 | if (flg) { | |||
439 | ierr = PCMGSetType(pc,mgtype);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),439,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
440 | } | |||
441 | if (mg->am == PC_MG_MULTIPLICATIVE) { | |||
442 | ierr = PetscOptionsInt("-pc_mg_multiplicative_cycles","Number of cycles for each preconditioner step","PCMGMultiplicativeSetCycles",mg->cyclesperpcapply,&cycles,&flg)PetscOptionsInt_Private(PetscOptionsObject,"-pc_mg_multiplicative_cycles" ,"Number of cycles for each preconditioner step","PCMGMultiplicativeSetCycles" ,mg->cyclesperpcapply,&cycles,&flg);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),442,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
443 | if (flg) { | |||
444 | ierr = PCMGMultiplicativeSetCycles(pc,cycles);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),444,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
445 | } | |||
446 | } | |||
447 | flg = PETSC_FALSE; | |||
448 | ierr = PetscOptionsBool("-pc_mg_log","Log times for each multigrid level","None",flg,&flg,NULL)PetscOptionsBool_Private(PetscOptionsObject,"-pc_mg_log","Log times for each multigrid level" ,"None",flg,&flg,((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),448,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
449 | if (flg) { | |||
450 | PetscInt i; | |||
451 | char eventname[128]; | |||
452 | ||||
453 | levels = mglevels[0]->levels; | |||
454 | for (i=0; i<levels; i++) { | |||
455 | sprintf(eventname,"MGSetup Level %d",(int)i); | |||
456 | ierr = PetscLogEventRegister(eventname,((PetscObject)pc)->classid,&mglevels[i]->eventsmoothsetup);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),456,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
457 | sprintf(eventname,"MGSmooth Level %d",(int)i); | |||
458 | ierr = PetscLogEventRegister(eventname,((PetscObject)pc)->classid,&mglevels[i]->eventsmoothsolve);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),458,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
459 | if (i) { | |||
460 | sprintf(eventname,"MGResid Level %d",(int)i); | |||
461 | ierr = PetscLogEventRegister(eventname,((PetscObject)pc)->classid,&mglevels[i]->eventresidual);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),461,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
462 | sprintf(eventname,"MGInterp Level %d",(int)i); | |||
463 | ierr = PetscLogEventRegister(eventname,((PetscObject)pc)->classid,&mglevels[i]->eventinterprestrict);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),463,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
464 | } | |||
465 | } | |||
466 | ||||
467 | #if defined(PETSC_USE_LOG1) | |||
468 | { | |||
469 | const char *sname = "MG Apply"; | |||
470 | PetscStageLog stageLog; | |||
471 | PetscInt st; | |||
472 | ||||
473 | ierr = PetscLogGetStageLog(&stageLog);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),473,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
474 | for (st = 0; st < stageLog->numStages; ++st) { | |||
475 | PetscBool same; | |||
476 | ||||
477 | ierr = PetscStrcmp(stageLog->stageInfo[st].name, sname, &same);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),477,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
478 | if (same) mg->stageApply = st; | |||
479 | } | |||
480 | if (!mg->stageApply) { | |||
481 | ierr = PetscLogStageRegister(sname, &mg->stageApply);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),481,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
482 | } | |||
483 | } | |||
484 | #endif | |||
485 | } | |||
486 | ierr = PetscOptionsTail()0; do {if (PetscOptionsObject->count != 1) do { do { ; if ( petscstack && petscstack->currentsize > 0) { petscstack ->currentsize--; petscstack->function[petscstack->currentsize ] = 0; petscstack->file[petscstack->currentsize] = 0; petscstack ->line[petscstack->currentsize] = 0; petscstack->petscroutine [petscstack->currentsize] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)< (0)) ? (0) : (petscstack->hotdepth-1)); } ; } while (0); return (0);} while (0);} while(0);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),486,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
487 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
488 | } | |||
489 | ||||
490 | const char *const PCMGTypes[] = {"MULTIPLICATIVE","ADDITIVE","FULL","KASKADE","PCMGType","PC_MG",0}; | |||
491 | const char *const PCMGCycleTypes[] = {"invalid","v","w","PCMGCycleType","PC_MG_CYCLE",0}; | |||
492 | const char *const PCMGGalerkinTypes[] = {"both","pmat","mat","none","external","PCMGGalerkinType","PC_MG_GALERKIN",0}; | |||
493 | ||||
494 | #include <petscdraw.h> | |||
495 | PetscErrorCode PCView_MG(PC pc,PetscViewer viewer) | |||
496 | { | |||
497 | PC_MG *mg = (PC_MG*)pc->data; | |||
498 | PC_MG_Levels **mglevels = mg->levels; | |||
499 | PetscErrorCode ierr; | |||
500 | PetscInt levels = mglevels ? mglevels[0]->levels : 0,i; | |||
501 | PetscBool iascii,isbinary,isdraw; | |||
502 | ||||
503 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c"; petscstack ->line[petscstack->currentsize] = 503; petscstack->petscroutine [petscstack->currentsize] = PETSC_TRUE; petscstack->currentsize ++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0); ; } while (0); | |||
504 | ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII"ascii",&iascii);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),504,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
505 | ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERBINARY"binary",&isbinary);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),505,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
506 | ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERDRAW"draw",&isdraw);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),506,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
507 | if (iascii) { | |||
508 | const char *cyclename = levels ? (mglevels[0]->cycles == PC_MG_CYCLE_V ? "v" : "w") : "unknown"; | |||
509 | ierr = PetscViewerASCIIPrintf(viewer," type is %s, levels=%D cycles=%s\n", PCMGTypes[mg->am],levels,cyclename);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),509,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
510 | if (mg->am == PC_MG_MULTIPLICATIVE) { | |||
511 | ierr = PetscViewerASCIIPrintf(viewer," Cycles per PCApply=%d\n",mg->cyclesperpcapply);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),511,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
512 | } | |||
513 | if (mg->galerkin == PC_MG_GALERKIN_BOTH) { | |||
514 | ierr = PetscViewerASCIIPrintf(viewer," Using Galerkin computed coarse grid matrices\n");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),514,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
515 | } else if (mg->galerkin == PC_MG_GALERKIN_PMAT) { | |||
516 | ierr = PetscViewerASCIIPrintf(viewer," Using Galerkin computed coarse grid matrices for pmat\n");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),516,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
517 | } else if (mg->galerkin == PC_MG_GALERKIN_MAT) { | |||
518 | ierr = PetscViewerASCIIPrintf(viewer," Using Galerkin computed coarse grid matrices for mat\n");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),518,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
519 | } else if (mg->galerkin == PC_MG_GALERKIN_EXTERNAL) { | |||
520 | ierr = PetscViewerASCIIPrintf(viewer," Using externally compute Galerkin coarse grid matrices\n");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),520,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
521 | } else { | |||
522 | ierr = PetscViewerASCIIPrintf(viewer," Not using Galerkin computed coarse grid matrices\n");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),522,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
523 | } | |||
524 | if (mg->view){ | |||
525 | ierr = (*mg->view)(pc,viewer);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),525,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
526 | } | |||
527 | for (i=0; i<levels; i++) { | |||
528 | if (!i) { | |||
529 | ierr = PetscViewerASCIIPrintf(viewer,"Coarse grid solver -- level -------------------------------\n",i);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),529,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
530 | } else { | |||
531 | ierr = PetscViewerASCIIPrintf(viewer,"Down solver (pre-smoother) on level %D -------------------------------\n",i);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),531,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
532 | } | |||
533 | ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),533,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
534 | ierr = KSPView(mglevels[i]->smoothd,viewer);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),534,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
535 | ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),535,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
536 | if (i && mglevels[i]->smoothd == mglevels[i]->smoothu) { | |||
537 | ierr = PetscViewerASCIIPrintf(viewer,"Up solver (post-smoother) same as down solver (pre-smoother)\n");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),537,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
538 | } else if (i) { | |||
539 | ierr = PetscViewerASCIIPrintf(viewer,"Up solver (post-smoother) on level %D -------------------------------\n",i);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),539,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
540 | ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),540,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
541 | ierr = KSPView(mglevels[i]->smoothu,viewer);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),541,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
542 | ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),542,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
543 | } | |||
544 | } | |||
545 | } else if (isbinary) { | |||
546 | for (i=levels-1; i>=0; i--) { | |||
547 | ierr = KSPView(mglevels[i]->smoothd,viewer);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),547,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
548 | if (i && mglevels[i]->smoothd != mglevels[i]->smoothu) { | |||
549 | ierr = KSPView(mglevels[i]->smoothu,viewer);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),549,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
550 | } | |||
551 | } | |||
552 | } else if (isdraw) { | |||
553 | PetscDraw draw; | |||
554 | PetscReal x,w,y,bottom,th; | |||
555 | ierr = PetscViewerDrawGetDraw(viewer,0,&draw);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),555,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
556 | ierr = PetscDrawGetCurrentPoint(draw,&x,&y);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),556,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
557 | ierr = PetscDrawStringGetSize(draw,NULL((void*)0),&th);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),557,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
558 | bottom = y - th; | |||
559 | for (i=levels-1; i>=0; i--) { | |||
560 | if (!mglevels[i]->smoothu || (mglevels[i]->smoothu == mglevels[i]->smoothd)) { | |||
561 | ierr = PetscDrawPushCurrentPoint(draw,x,bottom);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),561,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
562 | ierr = KSPView(mglevels[i]->smoothd,viewer);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),562,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
563 | ierr = PetscDrawPopCurrentPoint(draw);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),563,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
564 | } else { | |||
565 | w = 0.5*PetscMin(1.0-x,x)(((1.0-x)<(x)) ? (1.0-x) : (x)); | |||
566 | ierr = PetscDrawPushCurrentPoint(draw,x+w,bottom);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),566,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
567 | ierr = KSPView(mglevels[i]->smoothd,viewer);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),567,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
568 | ierr = PetscDrawPopCurrentPoint(draw);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),568,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
569 | ierr = PetscDrawPushCurrentPoint(draw,x-w,bottom);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),569,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
570 | ierr = KSPView(mglevels[i]->smoothu,viewer);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),570,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
571 | ierr = PetscDrawPopCurrentPoint(draw);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),571,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
572 | } | |||
573 | ierr = PetscDrawGetBoundingBox(draw,NULL((void*)0),&bottom,NULL((void*)0),NULL((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),573,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
574 | bottom -= th; | |||
575 | } | |||
576 | } | |||
577 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
578 | } | |||
579 | ||||
580 | #include <petsc/private/dmimpl.h> | |||
581 | #include <petsc/private/kspimpl.h> | |||
582 | ||||
583 | /* | |||
584 | Calls setup for the KSP on each level | |||
585 | */ | |||
586 | PetscErrorCode PCSetUp_MG(PC pc) | |||
587 | { | |||
588 | PC_MG *mg = (PC_MG*)pc->data; | |||
589 | PC_MG_Levels **mglevels = mg->levels; | |||
590 | PetscErrorCode ierr; | |||
591 | PetscInt i,n; | |||
592 | PC cpc; | |||
593 | PetscBool dump = PETSC_FALSE,opsset,use_amat,missinginterpolate = PETSC_FALSE; | |||
594 | Mat dA,dB; | |||
595 | Vec tvec; | |||
596 | DM *dms; | |||
597 | PetscViewer viewer = 0; | |||
598 | PetscBool dAeqdB = PETSC_FALSE, needRestricts = PETSC_FALSE; | |||
599 | ||||
600 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c"; petscstack ->line[petscstack->currentsize] = 600; petscstack->petscroutine [petscstack->currentsize] = PETSC_TRUE; petscstack->currentsize ++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0); ; } while (0); | |||
601 | if (!mglevels) SETERRQ(PetscObjectComm((PetscObject)pc),PETSC_ERR_ARG_WRONGSTATE,"Must set MG levels with PCMGSetLevels() before setting up")return PetscError(PetscObjectComm((PetscObject)pc),601,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c",73,PETSC_ERROR_INITIAL ,"Must set MG levels with PCMGSetLevels() before setting up"); | |||
602 | n = mglevels[0]->levels; | |||
603 | /* FIX: Move this to PCSetFromOptions_MG? */ | |||
604 | if (mg->usedmfornumberoflevels) { | |||
605 | PetscInt levels; | |||
606 | ierr = DMGetRefineLevel(pc->dm,&levels);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),606,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
607 | levels++; | |||
608 | if (levels > n) { /* the problem is now being solved on a finer grid */ | |||
609 | ierr = PCMGSetLevels(pc,levels,NULL((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),609,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
610 | n = levels; | |||
611 | ierr = PCSetFromOptions(pc);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),611,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); /* it is bad to call this here, but otherwise will never be called for the new hierarchy */ | |||
612 | mglevels = mg->levels; | |||
613 | } | |||
614 | } | |||
615 | ierr = KSPGetPC(mglevels[0]->smoothd,&cpc);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),615,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
616 | ||||
617 | ||||
618 | /* If user did not provide fine grid operators OR operator was not updated since last global KSPSetOperators() */ | |||
619 | /* so use those from global PC */ | |||
620 | /* Is this what we always want? What if user wants to keep old one? */ | |||
621 | ierr = KSPGetOperatorsSet(mglevels[n-1]->smoothd,NULL((void*)0),&opsset);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),621,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
622 | if (opsset) { | |||
623 | Mat mmat; | |||
624 | ierr = KSPGetOperators(mglevels[n-1]->smoothd,NULL((void*)0),&mmat);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),624,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
625 | if (mmat == pc->pmat) opsset = PETSC_FALSE; | |||
626 | } | |||
627 | ||||
628 | if (!opsset) { | |||
629 | ierr = PCGetUseAmat(pc,&use_amat);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),629,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
630 | if (use_amat) { | |||
631 | ierr = PetscInfo(pc,"Using outer operators to define finest grid operator \n because PCMGGetSmoother(pc,nlevels-1,&ksp);KSPSetOperators(ksp,...); was not called.\n")PetscInfo_Private(__func__,pc,"Using outer operators to define finest grid operator \n because PCMGGetSmoother(pc,nlevels-1,&ksp);KSPSetOperators(ksp,...); was not called.\n" );CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),631,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
632 | ierr = KSPSetOperators(mglevels[n-1]->smoothd,pc->mat,pc->pmat);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),632,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
633 | } else { | |||
634 | ierr = PetscInfo(pc,"Using matrix (pmat) operators to define finest grid operator \n because PCMGGetSmoother(pc,nlevels-1,&ksp);KSPSetOperators(ksp,...); was not called.\n")PetscInfo_Private(__func__,pc,"Using matrix (pmat) operators to define finest grid operator \n because PCMGGetSmoother(pc,nlevels-1,&ksp);KSPSetOperators(ksp,...); was not called.\n" );CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),634,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
635 | ierr = KSPSetOperators(mglevels[n-1]->smoothd,pc->pmat,pc->pmat);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),635,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
636 | } | |||
637 | } | |||
638 | ||||
639 | for (i=n-1; i>0; i--) { | |||
640 | if (!(mglevels[i]->interpolate || mglevels[i]->restrct)) { | |||
641 | missinginterpolate = PETSC_TRUE; | |||
642 | continue; | |||
643 | } | |||
644 | } | |||
645 | ||||
646 | ierr = KSPGetOperators(mglevels[n-1]->smoothd,&dA,&dB);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),646,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
647 | if (dA == dB) dAeqdB = PETSC_TRUE; | |||
648 | if ((mg->galerkin == PC_MG_GALERKIN_NONE) || (((mg->galerkin == PC_MG_GALERKIN_PMAT) || (mg->galerkin == PC_MG_GALERKIN_MAT)) && !dAeqdB)) { | |||
649 | needRestricts = PETSC_TRUE; /* user must compute either mat, pmat, or both so must restrict x to coarser levels */ | |||
650 | } | |||
651 | ||||
652 | ||||
653 | /* | |||
654 | Skipping if user has provided all interpolation/restriction needed (since DM might not be able to produce them (when coming from SNES/TS) | |||
655 | Skipping for galerkin==2 (externally managed hierarchy such as ML and GAMG). Cleaner logic here would be great. Wrap ML/GAMG as DMs? | |||
656 | */ | |||
657 | if (missinginterpolate && pc->dm && mg->galerkin != PC_MG_GALERKIN_EXTERNAL && !pc->setupcalled) { | |||
658 | /* construct the interpolation from the DMs */ | |||
659 | Mat p; | |||
660 | Vec rscale; | |||
661 | ierr = PetscMalloc1(n,&dms)PetscMallocA(1,PETSC_FALSE,661,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,(size_t)(n)*sizeof(**(&dms)),(&dms));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),661,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
662 | dms[n-1] = pc->dm; | |||
663 | /* Separately create them so we do not get DMKSP interference between levels */ | |||
664 | for (i=n-2; i>-1; i--) {ierr = DMCoarsen(dms[i+1],MPI_COMM_NULL((MPI_Comm)0x04000000),&dms[i]);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),664,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0);} | |||
665 | /* | |||
666 | Force the mat type of coarse level operator to be AIJ because usually we want to use LU for coarse level. | |||
667 | Notice that it can be overwritten by -mat_type because KSPSetUp() reads command line options. | |||
668 | But it is safe to use -dm_mat_type. | |||
669 | ||||
670 | The mat type should not be hardcoded like this, we need to find a better way. | |||
671 | ierr = DMSetMatType(dms[0],MATAIJ);CHKERRQ(ierr); | |||
672 | */ | |||
673 | for (i=n-2; i>-1; i--) { | |||
674 | DMKSP kdm; | |||
675 | PetscBool dmhasrestrict, dmhasinject; | |||
676 | ierr = KSPSetDM(mglevels[i]->smoothd,dms[i]);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),676,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
677 | if (!needRestricts) {ierr = KSPSetDMActive(mglevels[i]->smoothd,PETSC_FALSE);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),677,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0);} | |||
678 | if (mglevels[i]->smoothd != mglevels[i]->smoothu) { | |||
679 | ierr = KSPSetDM(mglevels[i]->smoothu,dms[i]);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),679,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
680 | if (!needRestricts) {ierr = KSPSetDMActive(mglevels[i]->smoothu,PETSC_FALSE);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),680,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0);} | |||
681 | } | |||
682 | ierr = DMGetDMKSPWrite(dms[i],&kdm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),682,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
683 | /* Ugly hack so that the next KSPSetUp() will use the RHS that we set. A better fix is to change dmActive to take | |||
684 | * a bitwise OR of computing the matrix, RHS, and initial iterate. */ | |||
685 | kdm->ops->computerhs = NULL((void*)0); | |||
686 | kdm->rhsctx = NULL((void*)0); | |||
687 | if (!mglevels[i+1]->interpolate) { | |||
688 | ierr = DMCreateInterpolation(dms[i],dms[i+1],&p,&rscale);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),688,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
689 | ierr = PCMGSetInterpolation(pc,i+1,p);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),689,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
690 | if (rscale) {ierr = PCMGSetRScale(pc,i+1,rscale);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),690,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0);} | |||
691 | ierr = VecDestroy(&rscale);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),691,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
692 | ierr = MatDestroy(&p);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),692,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
693 | } | |||
694 | ierr = DMHasCreateRestriction(dms[i],&dmhasrestrict);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),694,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
695 | if (dmhasrestrict && !mglevels[i+1]->restrct){ | |||
696 | ierr = DMCreateRestriction(dms[i],dms[i+1],&p);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),696,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
697 | ierr = PCMGSetRestriction(pc,i+1,p);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),697,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
698 | ierr = MatDestroy(&p);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),698,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
699 | } | |||
700 | ierr = DMHasCreateInjection(dms[i],&dmhasinject);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),700,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
701 | if (dmhasinject && !mglevels[i+1]->inject){ | |||
702 | ierr = DMCreateInjection(dms[i],dms[i+1],&p);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),702,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
703 | ierr = PCMGSetInjection(pc,i+1,p);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),703,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
704 | ierr = MatDestroy(&p);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),704,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
705 | } | |||
706 | } | |||
707 | ||||
708 | for (i=n-2; i>-1; i--) {ierr = DMDestroy(&dms[i]);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),708,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0);} | |||
709 | ierr = PetscFree(dms)((*PetscTrFree)((void*)(dms),709,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ) || ((dms) = 0,0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),709,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
710 | } | |||
711 | ||||
712 | if (pc->dm && !pc->setupcalled) { | |||
713 | /* finest smoother also gets DM but it is not active, independent of whether galerkin==PC_MG_GALERKIN_EXTERNAL */ | |||
714 | ierr = KSPSetDM(mglevels[n-1]->smoothd,pc->dm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),714,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
715 | ierr = KSPSetDMActive(mglevels[n-1]->smoothd,PETSC_FALSE);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),715,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
716 | if (mglevels[n-1]->smoothd != mglevels[n-1]->smoothu) { | |||
717 | ierr = KSPSetDM(mglevels[n-1]->smoothu,pc->dm);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),717,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
718 | ierr = KSPSetDMActive(mglevels[n-1]->smoothu,PETSC_FALSE);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),718,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
719 | } | |||
720 | } | |||
721 | ||||
722 | if (mg->galerkin < PC_MG_GALERKIN_NONE) { | |||
723 | Mat A,B; | |||
724 | PetscBool doA = PETSC_FALSE,doB = PETSC_FALSE; | |||
725 | MatReuse reuse = MAT_INITIAL_MATRIX; | |||
726 | ||||
727 | if ((mg->galerkin == PC_MG_GALERKIN_PMAT) || (mg->galerkin == PC_MG_GALERKIN_BOTH)) doB = PETSC_TRUE; | |||
728 | if ((mg->galerkin == PC_MG_GALERKIN_MAT) || ((mg->galerkin == PC_MG_GALERKIN_BOTH) && (dA != dB))) doA = PETSC_TRUE; | |||
729 | if (pc->setupcalled) reuse = MAT_REUSE_MATRIX; | |||
730 | for (i=n-2; i>-1; i--) { | |||
731 | if (!mglevels[i+1]->restrct && !mglevels[i+1]->interpolate) SETERRQ(PetscObjectComm((PetscObject)pc),PETSC_ERR_ARG_WRONGSTATE,"Must provide interpolation or restriction for each MG level except level 0")return PetscError(PetscObjectComm((PetscObject)pc),731,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c",73,PETSC_ERROR_INITIAL ,"Must provide interpolation or restriction for each MG level except level 0" ); | |||
732 | if (!mglevels[i+1]->interpolate) { | |||
733 | ierr = PCMGSetInterpolation(pc,i+1,mglevels[i+1]->restrct);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),733,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
734 | } | |||
735 | if (!mglevels[i+1]->restrct) { | |||
736 | ierr = PCMGSetRestriction(pc,i+1,mglevels[i+1]->interpolate);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),736,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
737 | } | |||
738 | if (reuse == MAT_REUSE_MATRIX) { | |||
739 | ierr = KSPGetOperators(mglevels[i]->smoothd,&A,&B);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),739,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
740 | } | |||
741 | if (doA) { | |||
742 | ierr = MatGalerkin(mglevels[i+1]->restrct,dA,mglevels[i+1]->interpolate,reuse,1.0,&A);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),742,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
743 | } | |||
744 | if (doB) { | |||
745 | ierr = MatGalerkin(mglevels[i+1]->restrct,dB,mglevels[i+1]->interpolate,reuse,1.0,&B);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),745,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
746 | } | |||
747 | /* the management of the PetscObjectReference() and PetscObjecDereference() below is rather delicate */ | |||
748 | if (!doA && dAeqdB) { | |||
749 | if (reuse == MAT_INITIAL_MATRIX) {ierr = PetscObjectReference((PetscObject)B);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),749,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0);} | |||
750 | A = B; | |||
751 | } else if (!doA && reuse == MAT_INITIAL_MATRIX ) { | |||
752 | ierr = KSPGetOperators(mglevels[i]->smoothd,&A,NULL((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),752,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
753 | ierr = PetscObjectReference((PetscObject)A);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),753,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
754 | } | |||
755 | if (!doB && dAeqdB) { | |||
756 | if (reuse == MAT_INITIAL_MATRIX) {ierr = PetscObjectReference((PetscObject)A);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),756,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0);} | |||
757 | B = A; | |||
758 | } else if (!doB && reuse == MAT_INITIAL_MATRIX) { | |||
759 | ierr = KSPGetOperators(mglevels[i]->smoothd,NULL((void*)0),&B);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),759,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
760 | ierr = PetscObjectReference((PetscObject)B);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),760,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
761 | } | |||
762 | if (reuse == MAT_INITIAL_MATRIX) { | |||
763 | ierr = KSPSetOperators(mglevels[i]->smoothd,A,B);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),763,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
764 | ierr = PetscObjectDereference((PetscObject)A);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),764,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
765 | ierr = PetscObjectDereference((PetscObject)B);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),765,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
766 | } | |||
767 | dA = A; | |||
768 | dB = B; | |||
769 | } | |||
770 | } | |||
771 | if (needRestricts && pc->dm && pc->dm->x) { | |||
772 | /* need to restrict Jacobian location to coarser meshes for evaluation */ | |||
773 | for (i=n-2; i>-1; i--) { | |||
774 | Mat R; | |||
775 | Vec rscale; | |||
776 | if (!mglevels[i]->smoothd->dm->x) { | |||
777 | Vec *vecs; | |||
778 | ierr = KSPCreateVecs(mglevels[i]->smoothd,1,&vecs,0,NULL((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),778,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
779 | mglevels[i]->smoothd->dm->x = vecs[0]; | |||
780 | ierr = PetscFree(vecs)((*PetscTrFree)((void*)(vecs),780,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ) || ((vecs) = 0,0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),780,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
781 | } | |||
782 | ierr = PCMGGetRestriction(pc,i+1,&R);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),782,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
783 | ierr = PCMGGetRScale(pc,i+1,&rscale);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),783,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
784 | ierr = MatRestrict(R,mglevels[i+1]->smoothd->dm->x,mglevels[i]->smoothd->dm->x);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),784,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
785 | ierr = VecPointwiseMult(mglevels[i]->smoothd->dm->x,mglevels[i]->smoothd->dm->x,rscale);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),785,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
786 | } | |||
787 | } | |||
788 | if (needRestricts && pc->dm) { | |||
789 | for (i=n-2; i>=0; i--) { | |||
790 | DM dmfine,dmcoarse; | |||
791 | Mat Restrict,Inject; | |||
792 | Vec rscale; | |||
793 | ierr = KSPGetDM(mglevels[i+1]->smoothd,&dmfine);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),793,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
794 | ierr = KSPGetDM(mglevels[i]->smoothd,&dmcoarse);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),794,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
795 | ierr = PCMGGetRestriction(pc,i+1,&Restrict);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),795,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
796 | ierr = PCMGGetRScale(pc,i+1,&rscale);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),796,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
797 | ierr = PCMGGetInjection(pc,i+1,&Inject);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),797,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
798 | ierr = DMRestrict(dmfine,Restrict,rscale,Inject,dmcoarse);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),798,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
799 | } | |||
800 | } | |||
801 | ||||
802 | if (!pc->setupcalled) { | |||
803 | for (i=0; i<n; i++) { | |||
804 | ierr = KSPSetFromOptions(mglevels[i]->smoothd);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),804,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
805 | } | |||
806 | for (i=1; i<n; i++) { | |||
807 | if (mglevels[i]->smoothu && (mglevels[i]->smoothu != mglevels[i]->smoothd)) { | |||
808 | ierr = KSPSetFromOptions(mglevels[i]->smoothu);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),808,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
809 | } | |||
810 | } | |||
811 | /* insure that if either interpolation or restriction is set the other other one is set */ | |||
812 | for (i=1; i<n; i++) { | |||
813 | ierr = PCMGGetInterpolation(pc,i,NULL((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),813,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
814 | ierr = PCMGGetRestriction(pc,i,NULL((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),814,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
815 | } | |||
816 | for (i=0; i<n-1; i++) { | |||
817 | if (!mglevels[i]->b) { | |||
818 | Vec *vec; | |||
819 | ierr = KSPCreateVecs(mglevels[i]->smoothd,1,&vec,0,NULL((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),819,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
820 | ierr = PCMGSetRhs(pc,i,*vec);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),820,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
821 | ierr = VecDestroy(vec);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),821,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
822 | ierr = PetscFree(vec)((*PetscTrFree)((void*)(vec),822,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ) || ((vec) = 0,0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),822,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
823 | } | |||
824 | if (!mglevels[i]->r && i) { | |||
825 | ierr = VecDuplicate(mglevels[i]->b,&tvec);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),825,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
826 | ierr = PCMGSetR(pc,i,tvec);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),826,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
827 | ierr = VecDestroy(&tvec);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),827,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
828 | } | |||
829 | if (!mglevels[i]->x) { | |||
830 | ierr = VecDuplicate(mglevels[i]->b,&tvec);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),830,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
831 | ierr = PCMGSetX(pc,i,tvec);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),831,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
832 | ierr = VecDestroy(&tvec);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),832,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
833 | } | |||
834 | } | |||
835 | if (n != 1 && !mglevels[n-1]->r) { | |||
836 | /* PCMGSetR() on the finest level if user did not supply it */ | |||
837 | Vec *vec; | |||
838 | ierr = KSPCreateVecs(mglevels[n-1]->smoothd,1,&vec,0,NULL((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),838,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
839 | ierr = PCMGSetR(pc,n-1,*vec);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),839,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
840 | ierr = VecDestroy(vec);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),840,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
841 | ierr = PetscFree(vec)((*PetscTrFree)((void*)(vec),841,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ) || ((vec) = 0,0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),841,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
842 | } | |||
843 | } | |||
844 | ||||
845 | if (pc->dm) { | |||
846 | /* need to tell all the coarser levels to rebuild the matrix using the DM for that level */ | |||
847 | for (i=0; i<n-1; i++) { | |||
848 | if (mglevels[i]->smoothd->setupstage != KSP_SETUP_NEW) mglevels[i]->smoothd->setupstage = KSP_SETUP_NEWMATRIX; | |||
849 | } | |||
850 | } | |||
851 | ||||
852 | for (i=1; i<n; i++) { | |||
853 | if (mglevels[i]->smoothu == mglevels[i]->smoothd || mg->am == PC_MG_FULL || mg->am == PC_MG_KASKADE || mg->cyclesperpcapply > 1){ | |||
854 | /* if doing only down then initial guess is zero */ | |||
855 | ierr = KSPSetInitialGuessNonzero(mglevels[i]->smoothd,PETSC_TRUE);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),855,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
856 | } | |||
857 | if (mglevels[i]->eventsmoothsetup) {ierr = PetscLogEventBegin(mglevels[i]->eventsmoothsetup,0,0,0,0)(((PetscLogPLB && petsc_stageLog->stageInfo[petsc_stageLog ->curStage].perfInfo.active && petsc_stageLog-> stageInfo[petsc_stageLog->curStage].eventLog->eventInfo [mglevels[i]->eventsmoothsetup].active) ? (*PetscLogPLB)(( mglevels[i]->eventsmoothsetup),0,(PetscObject)(0),(PetscObject )(0),(PetscObject)(0),(PetscObject)(0)) : 0 ));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),857,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0);} | |||
858 | ierr = KSPSetUp(mglevels[i]->smoothd);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),858,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
859 | if (mglevels[i]->smoothd->reason == KSP_DIVERGED_PC_FAILED) { | |||
860 | pc->failedreason = PC_SUBPC_ERROR; | |||
861 | } | |||
862 | if (mglevels[i]->eventsmoothsetup) {ierr = PetscLogEventEnd(mglevels[i]->eventsmoothsetup,0,0,0,0)(((PetscLogPLE && petsc_stageLog->stageInfo[petsc_stageLog ->curStage].perfInfo.active && petsc_stageLog-> stageInfo[petsc_stageLog->curStage].eventLog->eventInfo [mglevels[i]->eventsmoothsetup].active) ? (*PetscLogPLE)(( mglevels[i]->eventsmoothsetup),0,(PetscObject)(0),(PetscObject )(0),(PetscObject)(0),(PetscObject)(0)) : 0 ));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),862,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0);} | |||
863 | if (!mglevels[i]->residual) { | |||
864 | Mat mat; | |||
865 | ierr = KSPGetOperators(mglevels[i]->smoothd,&mat,NULL((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),865,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
866 | ierr = PCMGSetResidual(pc,i,PCMGResidualDefault,mat);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),866,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
867 | } | |||
868 | } | |||
869 | for (i=1; i<n; i++) { | |||
870 | if (mglevels[i]->smoothu && mglevels[i]->smoothu != mglevels[i]->smoothd) { | |||
871 | Mat downmat,downpmat; | |||
872 | ||||
873 | /* check if operators have been set for up, if not use down operators to set them */ | |||
874 | ierr = KSPGetOperatorsSet(mglevels[i]->smoothu,&opsset,NULL((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),874,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
875 | if (!opsset) { | |||
876 | ierr = KSPGetOperators(mglevels[i]->smoothd,&downmat,&downpmat);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),876,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
877 | ierr = KSPSetOperators(mglevels[i]->smoothu,downmat,downpmat);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),877,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
878 | } | |||
879 | ||||
880 | ierr = KSPSetInitialGuessNonzero(mglevels[i]->smoothu,PETSC_TRUE);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),880,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
881 | if (mglevels[i]->eventsmoothsetup) {ierr = PetscLogEventBegin(mglevels[i]->eventsmoothsetup,0,0,0,0)(((PetscLogPLB && petsc_stageLog->stageInfo[petsc_stageLog ->curStage].perfInfo.active && petsc_stageLog-> stageInfo[petsc_stageLog->curStage].eventLog->eventInfo [mglevels[i]->eventsmoothsetup].active) ? (*PetscLogPLB)(( mglevels[i]->eventsmoothsetup),0,(PetscObject)(0),(PetscObject )(0),(PetscObject)(0),(PetscObject)(0)) : 0 ));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),881,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0);} | |||
882 | ierr = KSPSetUp(mglevels[i]->smoothu);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),882,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
883 | if (mglevels[i]->smoothu->reason == KSP_DIVERGED_PC_FAILED) { | |||
884 | pc->failedreason = PC_SUBPC_ERROR; | |||
885 | } | |||
886 | if (mglevels[i]->eventsmoothsetup) {ierr = PetscLogEventEnd(mglevels[i]->eventsmoothsetup,0,0,0,0)(((PetscLogPLE && petsc_stageLog->stageInfo[petsc_stageLog ->curStage].perfInfo.active && petsc_stageLog-> stageInfo[petsc_stageLog->curStage].eventLog->eventInfo [mglevels[i]->eventsmoothsetup].active) ? (*PetscLogPLE)(( mglevels[i]->eventsmoothsetup),0,(PetscObject)(0),(PetscObject )(0),(PetscObject)(0),(PetscObject)(0)) : 0 ));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),886,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0);} | |||
887 | } | |||
888 | } | |||
889 | ||||
890 | if (mglevels[0]->eventsmoothsetup) {ierr = PetscLogEventBegin(mglevels[0]->eventsmoothsetup,0,0,0,0)(((PetscLogPLB && petsc_stageLog->stageInfo[petsc_stageLog ->curStage].perfInfo.active && petsc_stageLog-> stageInfo[petsc_stageLog->curStage].eventLog->eventInfo [mglevels[0]->eventsmoothsetup].active) ? (*PetscLogPLB)(( mglevels[0]->eventsmoothsetup),0,(PetscObject)(0),(PetscObject )(0),(PetscObject)(0),(PetscObject)(0)) : 0 ));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),890,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0);} | |||
891 | ierr = KSPSetUp(mglevels[0]->smoothd);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),891,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
892 | if (mglevels[0]->smoothd->reason == KSP_DIVERGED_PC_FAILED) { | |||
893 | pc->failedreason = PC_SUBPC_ERROR; | |||
894 | } | |||
895 | if (mglevels[0]->eventsmoothsetup) {ierr = PetscLogEventEnd(mglevels[0]->eventsmoothsetup,0,0,0,0)(((PetscLogPLE && petsc_stageLog->stageInfo[petsc_stageLog ->curStage].perfInfo.active && petsc_stageLog-> stageInfo[petsc_stageLog->curStage].eventLog->eventInfo [mglevels[0]->eventsmoothsetup].active) ? (*PetscLogPLE)(( mglevels[0]->eventsmoothsetup),0,(PetscObject)(0),(PetscObject )(0),(PetscObject)(0),(PetscObject)(0)) : 0 ));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),895,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0);} | |||
896 | ||||
897 | /* | |||
898 | Dump the interpolation/restriction matrices plus the | |||
899 | Jacobian/stiffness on each level. This allows MATLAB users to | |||
900 | easily check if the Galerkin condition A_c = R A_f R^T is satisfied. | |||
901 | ||||
902 | Only support one or the other at the same time. | |||
903 | */ | |||
904 | #if defined(PETSC_USE_SOCKET_VIEWER1) | |||
905 | ierr = PetscOptionsGetBool(((PetscObject)pc)->options,((PetscObject)pc)->prefix,"-pc_mg_dump_matlab",&dump,NULL((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),905,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
906 | if (dump) viewer = PETSC_VIEWER_SOCKET_(PetscObjectComm((PetscObject)pc)); | |||
907 | dump = PETSC_FALSE; | |||
908 | #endif | |||
909 | ierr = PetscOptionsGetBool(((PetscObject)pc)->options,((PetscObject)pc)->prefix,"-pc_mg_dump_binary",&dump,NULL((void*)0));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),909,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
910 | if (dump) viewer = PETSC_VIEWER_BINARY_(PetscObjectComm((PetscObject)pc)); | |||
911 | ||||
912 | if (viewer) { | |||
913 | for (i=1; i<n; i++) { | |||
914 | ierr = MatView(mglevels[i]->restrct,viewer);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),914,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
915 | } | |||
916 | for (i=0; i<n; i++) { | |||
917 | ierr = KSPGetPC(mglevels[i]->smoothd,&pc);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),917,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
918 | ierr = MatView(pc->mat,viewer);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),918,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
919 | } | |||
920 | } | |||
921 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
922 | } | |||
923 | ||||
924 | /* -------------------------------------------------------------------------------------*/ | |||
925 | ||||
926 | PetscErrorCode PCMGGetLevels_MG(PC pc, PetscInt *levels) | |||
927 | { | |||
928 | PC_MG *mg = (PC_MG *) pc->data; | |||
929 | ||||
930 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c"; petscstack ->line[petscstack->currentsize] = 930; petscstack->petscroutine [petscstack->currentsize] = PETSC_TRUE; petscstack->currentsize ++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0); ; } while (0); | |||
931 | *levels = mg->nlevels; | |||
932 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
933 | } | |||
934 | ||||
935 | /*@ | |||
936 | PCMGGetLevels - Gets the number of levels to use with MG. | |||
937 | ||||
938 | Not Collective | |||
939 | ||||
940 | Input Parameter: | |||
941 | . pc - the preconditioner context | |||
942 | ||||
943 | Output parameter: | |||
944 | . levels - the number of levels | |||
945 | ||||
946 | Level: advanced | |||
947 | ||||
948 | .seealso: PCMGSetLevels() | |||
949 | @*/ | |||
950 | PetscErrorCode PCMGGetLevels(PC pc,PetscInt *levels) | |||
951 | { | |||
952 | PetscErrorCode ierr; | |||
953 | ||||
954 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c"; petscstack ->line[petscstack->currentsize] = 954; petscstack->petscroutine [petscstack->currentsize] = PETSC_TRUE; petscstack->currentsize ++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0); ; } while (0); | |||
955 | PetscValidHeaderSpecific(pc,PC_CLASSID,1)do { if (!pc) return PetscError(((MPI_Comm)0x44000001),955,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c",85,PETSC_ERROR_INITIAL ,"Null Object: Parameter # %d",1); if (!PetscCheckPointer(pc, PETSC_OBJECT)) return PetscError(((MPI_Comm)0x44000001),955,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c",64,PETSC_ERROR_INITIAL ,"Invalid Pointer to Object: Parameter # %d",1); if (((PetscObject )(pc))->classid != PC_CLASSID) { if (((PetscObject)(pc))-> classid == -1) return PetscError(((MPI_Comm)0x44000001),955,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c",64,PETSC_ERROR_INITIAL ,"Object already free: Parameter # %d",1); else return PetscError (((MPI_Comm)0x44000001),955,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,62,PETSC_ERROR_INITIAL,"Wrong type of object: Parameter # %d" ,1); } } while (0); | |||
956 | PetscValidIntPointer(levels,2)do { if (!levels) return PetscError(((MPI_Comm)0x44000001),956 ,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,68,PETSC_ERROR_INITIAL,"Null Pointer: Parameter # %d",2); if (!PetscCheckPointer(levels,PETSC_INT)) return PetscError(((MPI_Comm )0x44000001),956,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,68,PETSC_ERROR_INITIAL,"Invalid Pointer to Int: Parameter # %d" ,2); } while (0); | |||
957 | *levels = 0; | |||
958 | ierr = PetscTryMethod(pc,"PCMGGetLevels_C",(PC,PetscInt*),(pc,levels))0; do { PetscErrorCode (*f)(PC,PetscInt*), __ierr; __ierr = PetscObjectQueryFunction_Private (((PetscObject)pc),("PCMGGetLevels_C"),(PetscVoidFunction*)(& f));do {if (__builtin_expect(!!(__ierr),0)) return PetscError (((MPI_Comm)0x44000001),958,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,__ierr,PETSC_ERROR_REPEAT," ");} while (0); if (f) {__ierr = (*f)(pc,levels);do {if (__builtin_expect(!!(__ierr),0)) return PetscError(((MPI_Comm)0x44000001),958,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,__ierr,PETSC_ERROR_REPEAT," ");} while (0);} } while(0);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),958,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
959 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
960 | } | |||
961 | ||||
962 | /*@ | |||
963 | PCMGSetType - Determines the form of multigrid to use: | |||
964 | multiplicative, additive, full, or the Kaskade algorithm. | |||
965 | ||||
966 | Logically Collective on PC | |||
967 | ||||
968 | Input Parameters: | |||
969 | + pc - the preconditioner context | |||
970 | - form - multigrid form, one of PC_MG_MULTIPLICATIVE, PC_MG_ADDITIVE, | |||
971 | PC_MG_FULL, PC_MG_KASKADE | |||
972 | ||||
973 | Options Database Key: | |||
974 | . -pc_mg_type <form> - Sets <form>, one of multiplicative, | |||
975 | additive, full, kaskade | |||
976 | ||||
977 | Level: advanced | |||
978 | ||||
979 | .seealso: PCMGSetLevels() | |||
980 | @*/ | |||
981 | PetscErrorCode PCMGSetType(PC pc,PCMGType form) | |||
982 | { | |||
983 | PC_MG *mg = (PC_MG*)pc->data; | |||
984 | ||||
985 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c"; petscstack ->line[petscstack->currentsize] = 985; petscstack->petscroutine [petscstack->currentsize] = PETSC_TRUE; petscstack->currentsize ++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0); ; } while (0); | |||
986 | PetscValidHeaderSpecific(pc,PC_CLASSID,1)do { if (!pc) return PetscError(((MPI_Comm)0x44000001),986,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c",85,PETSC_ERROR_INITIAL ,"Null Object: Parameter # %d",1); if (!PetscCheckPointer(pc, PETSC_OBJECT)) return PetscError(((MPI_Comm)0x44000001),986,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c",64,PETSC_ERROR_INITIAL ,"Invalid Pointer to Object: Parameter # %d",1); if (((PetscObject )(pc))->classid != PC_CLASSID) { if (((PetscObject)(pc))-> classid == -1) return PetscError(((MPI_Comm)0x44000001),986,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c",64,PETSC_ERROR_INITIAL ,"Object already free: Parameter # %d",1); else return PetscError (((MPI_Comm)0x44000001),986,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,62,PETSC_ERROR_INITIAL,"Wrong type of object: Parameter # %d" ,1); } } while (0); | |||
987 | PetscValidLogicalCollectiveEnum(pc,form,2)do { PetscErrorCode _7_ierr; PetscMPIInt b1[2],b2[2]; b1[0] = -(PetscMPIInt)form; b1[1] = (PetscMPIInt)form; _7_ierr = (PetscAllreduceBarrierCheck (PetscObjectComm((PetscObject)pc),2,987,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ) || ((petsc_allreduce_ct += PetscMPIParallelComm((PetscObjectComm ((PetscObject)pc))),0) || MPI_Allreduce((b1),(b2),(2),(((MPI_Datatype )0x4c000405)),((MPI_Op)(0x58000001)),(PetscObjectComm((PetscObject )pc)))));do {if (__builtin_expect(!!(_7_ierr),0)) return PetscError (((MPI_Comm)0x44000001),987,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,_7_ierr,PETSC_ERROR_REPEAT," ");} while (0); if (-b2[0] != b2 [1]) return PetscError(PetscObjectComm((PetscObject)pc),987,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c",62,PETSC_ERROR_INITIAL ,"Enum value must be same on all processes, argument # %d",2) ; } while (0); | |||
988 | mg->am = form; | |||
989 | if (form == PC_MG_MULTIPLICATIVE) pc->ops->applyrichardson = PCApplyRichardson_MG; | |||
990 | else pc->ops->applyrichardson = NULL((void*)0); | |||
991 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
992 | } | |||
993 | ||||
994 | /*@ | |||
995 | PCMGGetType - Determines the form of multigrid to use: | |||
996 | multiplicative, additive, full, or the Kaskade algorithm. | |||
997 | ||||
998 | Logically Collective on PC | |||
999 | ||||
1000 | Input Parameter: | |||
1001 | . pc - the preconditioner context | |||
1002 | ||||
1003 | Output Parameter: | |||
1004 | . type - one of PC_MG_MULTIPLICATIVE, PC_MG_ADDITIVE,PC_MG_FULL, PC_MG_KASKADE | |||
1005 | ||||
1006 | ||||
1007 | Level: advanced | |||
1008 | ||||
1009 | .seealso: PCMGSetLevels() | |||
1010 | @*/ | |||
1011 | PetscErrorCode PCMGGetType(PC pc,PCMGType *type) | |||
1012 | { | |||
1013 | PC_MG *mg = (PC_MG*)pc->data; | |||
1014 | ||||
1015 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c"; petscstack ->line[petscstack->currentsize] = 1015; petscstack-> petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); | |||
1016 | PetscValidHeaderSpecific(pc,PC_CLASSID,1)do { if (!pc) return PetscError(((MPI_Comm)0x44000001),1016,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c",85,PETSC_ERROR_INITIAL ,"Null Object: Parameter # %d",1); if (!PetscCheckPointer(pc, PETSC_OBJECT)) return PetscError(((MPI_Comm)0x44000001),1016, __func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,64,PETSC_ERROR_INITIAL,"Invalid Pointer to Object: Parameter # %d" ,1); if (((PetscObject)(pc))->classid != PC_CLASSID) { if ( ((PetscObject)(pc))->classid == -1) return PetscError(((MPI_Comm )0x44000001),1016,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,64,PETSC_ERROR_INITIAL,"Object already free: Parameter # %d" ,1); else return PetscError(((MPI_Comm)0x44000001),1016,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c",62,PETSC_ERROR_INITIAL ,"Wrong type of object: Parameter # %d",1); } } while (0); | |||
1017 | *type = mg->am; | |||
1018 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
1019 | } | |||
1020 | ||||
1021 | /*@ | |||
1022 | PCMGSetCycleType - Sets the type cycles to use. Use PCMGSetCycleTypeOnLevel() for more | |||
1023 | complicated cycling. | |||
1024 | ||||
1025 | Logically Collective on PC | |||
1026 | ||||
1027 | Input Parameters: | |||
1028 | + pc - the multigrid context | |||
1029 | - n - either PC_MG_CYCLE_V or PC_MG_CYCLE_W | |||
1030 | ||||
1031 | Options Database Key: | |||
1032 | . -pc_mg_cycle_type <v,w> - provide the cycle desired | |||
1033 | ||||
1034 | Level: advanced | |||
1035 | ||||
1036 | .seealso: PCMGSetCycleTypeOnLevel() | |||
1037 | @*/ | |||
1038 | PetscErrorCode PCMGSetCycleType(PC pc,PCMGCycleType n) | |||
1039 | { | |||
1040 | PC_MG *mg = (PC_MG*)pc->data; | |||
1041 | PC_MG_Levels **mglevels = mg->levels; | |||
1042 | PetscInt i,levels; | |||
1043 | ||||
1044 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c"; petscstack ->line[petscstack->currentsize] = 1044; petscstack-> petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); | |||
1045 | PetscValidHeaderSpecific(pc,PC_CLASSID,1)do { if (!pc) return PetscError(((MPI_Comm)0x44000001),1045,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c",85,PETSC_ERROR_INITIAL ,"Null Object: Parameter # %d",1); if (!PetscCheckPointer(pc, PETSC_OBJECT)) return PetscError(((MPI_Comm)0x44000001),1045, __func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,64,PETSC_ERROR_INITIAL,"Invalid Pointer to Object: Parameter # %d" ,1); if (((PetscObject)(pc))->classid != PC_CLASSID) { if ( ((PetscObject)(pc))->classid == -1) return PetscError(((MPI_Comm )0x44000001),1045,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,64,PETSC_ERROR_INITIAL,"Object already free: Parameter # %d" ,1); else return PetscError(((MPI_Comm)0x44000001),1045,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c",62,PETSC_ERROR_INITIAL ,"Wrong type of object: Parameter # %d",1); } } while (0); | |||
1046 | PetscValidLogicalCollectiveEnum(pc,n,2)do { PetscErrorCode _7_ierr; PetscMPIInt b1[2],b2[2]; b1[0] = -(PetscMPIInt)n; b1[1] = (PetscMPIInt)n; _7_ierr = (PetscAllreduceBarrierCheck (PetscObjectComm((PetscObject)pc),2,1046,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ) || ((petsc_allreduce_ct += PetscMPIParallelComm((PetscObjectComm ((PetscObject)pc))),0) || MPI_Allreduce((b1),(b2),(2),(((MPI_Datatype )0x4c000405)),((MPI_Op)(0x58000001)),(PetscObjectComm((PetscObject )pc)))));do {if (__builtin_expect(!!(_7_ierr),0)) return PetscError (((MPI_Comm)0x44000001),1046,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,_7_ierr,PETSC_ERROR_REPEAT," ");} while (0); if (-b2[0] != b2 [1]) return PetscError(PetscObjectComm((PetscObject)pc),1046, __func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,62,PETSC_ERROR_INITIAL,"Enum value must be same on all processes, argument # %d" ,2); } while (0); | |||
1047 | if (!mglevels) SETERRQ(PetscObjectComm((PetscObject)pc),PETSC_ERR_ORDER,"Must set MG levels with PCMGSetLevels() before calling")return PetscError(PetscObjectComm((PetscObject)pc),1047,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c",58,PETSC_ERROR_INITIAL ,"Must set MG levels with PCMGSetLevels() before calling"); | |||
1048 | levels = mglevels[0]->levels; | |||
1049 | for (i=0; i<levels; i++) mglevels[i]->cycles = n; | |||
1050 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
1051 | } | |||
1052 | ||||
1053 | /*@ | |||
1054 | PCMGMultiplicativeSetCycles - Sets the number of cycles to use for each preconditioner step | |||
1055 | of multigrid when PCMGType of PC_MG_MULTIPLICATIVE is used | |||
1056 | ||||
1057 | Logically Collective on PC | |||
1058 | ||||
1059 | Input Parameters: | |||
1060 | + pc - the multigrid context | |||
1061 | - n - number of cycles (default is 1) | |||
1062 | ||||
1063 | Options Database Key: | |||
1064 | . -pc_mg_multiplicative_cycles n | |||
1065 | ||||
1066 | Level: advanced | |||
1067 | ||||
1068 | Notes: | |||
1069 | This is not associated with setting a v or w cycle, that is set with PCMGSetCycleType() | |||
1070 | ||||
1071 | .seealso: PCMGSetCycleTypeOnLevel(), PCMGSetCycleType() | |||
1072 | @*/ | |||
1073 | PetscErrorCode PCMGMultiplicativeSetCycles(PC pc,PetscInt n) | |||
1074 | { | |||
1075 | PC_MG *mg = (PC_MG*)pc->data; | |||
1076 | ||||
1077 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c"; petscstack ->line[petscstack->currentsize] = 1077; petscstack-> petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); | |||
1078 | PetscValidHeaderSpecific(pc,PC_CLASSID,1)do { if (!pc) return PetscError(((MPI_Comm)0x44000001),1078,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c",85,PETSC_ERROR_INITIAL ,"Null Object: Parameter # %d",1); if (!PetscCheckPointer(pc, PETSC_OBJECT)) return PetscError(((MPI_Comm)0x44000001),1078, __func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,64,PETSC_ERROR_INITIAL,"Invalid Pointer to Object: Parameter # %d" ,1); if (((PetscObject)(pc))->classid != PC_CLASSID) { if ( ((PetscObject)(pc))->classid == -1) return PetscError(((MPI_Comm )0x44000001),1078,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,64,PETSC_ERROR_INITIAL,"Object already free: Parameter # %d" ,1); else return PetscError(((MPI_Comm)0x44000001),1078,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c",62,PETSC_ERROR_INITIAL ,"Wrong type of object: Parameter # %d",1); } } while (0); | |||
1079 | PetscValidLogicalCollectiveInt(pc,n,2)do { PetscErrorCode _7_ierr; PetscInt b1[2],b2[2]; b1[0] = -n ; b1[1] = n; _7_ierr = (PetscAllreduceBarrierCheck(PetscObjectComm ((PetscObject)pc),2,1079,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ) || ((petsc_allreduce_ct += PetscMPIParallelComm((PetscObjectComm ((PetscObject)pc))),0) || MPI_Allreduce((b1),(b2),(2),(((MPI_Datatype )0x4c000405)),((MPI_Op)(0x58000001)),(PetscObjectComm((PetscObject )pc)))));do {if (__builtin_expect(!!(_7_ierr),0)) return PetscError (((MPI_Comm)0x44000001),1079,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,_7_ierr,PETSC_ERROR_REPEAT," ");} while (0); if (-b2[0] != b2 [1]) return PetscError(PetscObjectComm((PetscObject)pc),1079, __func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,62,PETSC_ERROR_INITIAL,"Int value must be same on all processes, argument # %d" ,2); } while (0); | |||
1080 | mg->cyclesperpcapply = n; | |||
1081 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
1082 | } | |||
1083 | ||||
1084 | PetscErrorCode PCMGSetGalerkin_MG(PC pc,PCMGGalerkinType use) | |||
1085 | { | |||
1086 | PC_MG *mg = (PC_MG*)pc->data; | |||
1087 | ||||
1088 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c"; petscstack ->line[petscstack->currentsize] = 1088; petscstack-> petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); | |||
1089 | mg->galerkin = use; | |||
1090 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
1091 | } | |||
1092 | ||||
1093 | /*@ | |||
1094 | PCMGSetGalerkin - Causes the coarser grid matrices to be computed from the | |||
1095 | finest grid via the Galerkin process: A_i-1 = r_i * A_i * p_i | |||
1096 | ||||
1097 | Logically Collective on PC | |||
1098 | ||||
1099 | Input Parameters: | |||
1100 | + pc - the multigrid context | |||
1101 | - use - one of PC_MG_GALERKIN_BOTH,PC_MG_GALERKIN_PMAT,PC_MG_GALERKIN_MAT, or PC_MG_GALERKIN_NONE | |||
1102 | ||||
1103 | Options Database Key: | |||
1104 | . -pc_mg_galerkin <both,pmat,mat,none> | |||
1105 | ||||
1106 | Level: intermediate | |||
1107 | ||||
1108 | Notes: | |||
1109 | Some codes that use PCMG such as PCGAMG use Galerkin internally while constructing the hierarchy and thus do not | |||
1110 | use the PCMG construction of the coarser grids. | |||
1111 | ||||
1112 | .seealso: PCMGGetGalerkin(), PCMGGalerkinType | |||
1113 | ||||
1114 | @*/ | |||
1115 | PetscErrorCode PCMGSetGalerkin(PC pc,PCMGGalerkinType use) | |||
1116 | { | |||
1117 | PetscErrorCode ierr; | |||
1118 | ||||
1119 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c"; petscstack ->line[petscstack->currentsize] = 1119; petscstack-> petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); | |||
1120 | PetscValidHeaderSpecific(pc,PC_CLASSID,1)do { if (!pc) return PetscError(((MPI_Comm)0x44000001),1120,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c",85,PETSC_ERROR_INITIAL ,"Null Object: Parameter # %d",1); if (!PetscCheckPointer(pc, PETSC_OBJECT)) return PetscError(((MPI_Comm)0x44000001),1120, __func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,64,PETSC_ERROR_INITIAL,"Invalid Pointer to Object: Parameter # %d" ,1); if (((PetscObject)(pc))->classid != PC_CLASSID) { if ( ((PetscObject)(pc))->classid == -1) return PetscError(((MPI_Comm )0x44000001),1120,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,64,PETSC_ERROR_INITIAL,"Object already free: Parameter # %d" ,1); else return PetscError(((MPI_Comm)0x44000001),1120,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c",62,PETSC_ERROR_INITIAL ,"Wrong type of object: Parameter # %d",1); } } while (0); | |||
1121 | ierr = PetscTryMethod(pc,"PCMGSetGalerkin_C",(PC,PCMGGalerkinType),(pc,use))0; do { PetscErrorCode (*f)(PC,PCMGGalerkinType), __ierr; __ierr = PetscObjectQueryFunction_Private(((PetscObject)pc),("PCMGSetGalerkin_C" ),(PetscVoidFunction*)(&f));do {if (__builtin_expect(!!(__ierr ),0)) return PetscError(((MPI_Comm)0x44000001),1121,__func__, "/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c",__ierr,PETSC_ERROR_REPEAT ," ");} while (0); if (f) {__ierr = (*f)(pc,use);do {if (__builtin_expect (!!(__ierr),0)) return PetscError(((MPI_Comm)0x44000001),1121 ,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,__ierr,PETSC_ERROR_REPEAT," ");} while (0);} } while(0);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1121,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1122 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
1123 | } | |||
1124 | ||||
1125 | /*@ | |||
1126 | PCMGGetGalerkin - Checks if Galerkin multigrid is being used, i.e. | |||
1127 | A_i-1 = r_i * A_i * p_i | |||
1128 | ||||
1129 | Not Collective | |||
1130 | ||||
1131 | Input Parameter: | |||
1132 | . pc - the multigrid context | |||
1133 | ||||
1134 | Output Parameter: | |||
1135 | . galerkin - one of PC_MG_GALERKIN_BOTH,PC_MG_GALERKIN_PMAT,PC_MG_GALERKIN_MAT, PC_MG_GALERKIN_NONE, or PC_MG_GALERKIN_EXTERNAL | |||
1136 | ||||
1137 | Level: intermediate | |||
1138 | ||||
1139 | .seealso: PCMGSetGalerkin(), PCMGGalerkinType | |||
1140 | ||||
1141 | @*/ | |||
1142 | PetscErrorCode PCMGGetGalerkin(PC pc,PCMGGalerkinType *galerkin) | |||
1143 | { | |||
1144 | PC_MG *mg = (PC_MG*)pc->data; | |||
1145 | ||||
1146 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c"; petscstack ->line[petscstack->currentsize] = 1146; petscstack-> petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); | |||
1147 | PetscValidHeaderSpecific(pc,PC_CLASSID,1)do { if (!pc) return PetscError(((MPI_Comm)0x44000001),1147,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c",85,PETSC_ERROR_INITIAL ,"Null Object: Parameter # %d",1); if (!PetscCheckPointer(pc, PETSC_OBJECT)) return PetscError(((MPI_Comm)0x44000001),1147, __func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,64,PETSC_ERROR_INITIAL,"Invalid Pointer to Object: Parameter # %d" ,1); if (((PetscObject)(pc))->classid != PC_CLASSID) { if ( ((PetscObject)(pc))->classid == -1) return PetscError(((MPI_Comm )0x44000001),1147,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,64,PETSC_ERROR_INITIAL,"Object already free: Parameter # %d" ,1); else return PetscError(((MPI_Comm)0x44000001),1147,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c",62,PETSC_ERROR_INITIAL ,"Wrong type of object: Parameter # %d",1); } } while (0); | |||
1148 | *galerkin = mg->galerkin; | |||
1149 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
1150 | } | |||
1151 | ||||
1152 | /*@ | |||
1153 | PCMGSetNumberSmooth - Sets the number of pre and post-smoothing steps to use | |||
1154 | on all levels. Use PCMGDistinctSmoothUp() to create separate up and down smoothers if you want different numbers of | |||
1155 | pre- and post-smoothing steps. | |||
1156 | ||||
1157 | Logically Collective on PC | |||
1158 | ||||
1159 | Input Parameters: | |||
1160 | + mg - the multigrid context | |||
1161 | - n - the number of smoothing steps | |||
1162 | ||||
1163 | Options Database Key: | |||
1164 | . -mg_levels_ksp_max_it <n> - Sets number of pre and post-smoothing steps | |||
1165 | ||||
1166 | Level: advanced | |||
1167 | ||||
1168 | Notes: | |||
1169 | this does not set a value on the coarsest grid, since we assume that | |||
1170 | there is no separate smooth up on the coarsest grid. | |||
1171 | ||||
1172 | .seealso: PCMGSetDistinctSmoothUp() | |||
1173 | @*/ | |||
1174 | PetscErrorCode PCMGSetNumberSmooth(PC pc,PetscInt n) | |||
1175 | { | |||
1176 | PC_MG *mg = (PC_MG*)pc->data; | |||
1177 | PC_MG_Levels **mglevels = mg->levels; | |||
1178 | PetscErrorCode ierr; | |||
1179 | PetscInt i,levels; | |||
1180 | ||||
1181 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c"; petscstack ->line[petscstack->currentsize] = 1181; petscstack-> petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); | |||
1182 | PetscValidHeaderSpecific(pc,PC_CLASSID,1)do { if (!pc) return PetscError(((MPI_Comm)0x44000001),1182,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c",85,PETSC_ERROR_INITIAL ,"Null Object: Parameter # %d",1); if (!PetscCheckPointer(pc, PETSC_OBJECT)) return PetscError(((MPI_Comm)0x44000001),1182, __func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,64,PETSC_ERROR_INITIAL,"Invalid Pointer to Object: Parameter # %d" ,1); if (((PetscObject)(pc))->classid != PC_CLASSID) { if ( ((PetscObject)(pc))->classid == -1) return PetscError(((MPI_Comm )0x44000001),1182,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,64,PETSC_ERROR_INITIAL,"Object already free: Parameter # %d" ,1); else return PetscError(((MPI_Comm)0x44000001),1182,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c",62,PETSC_ERROR_INITIAL ,"Wrong type of object: Parameter # %d",1); } } while (0); | |||
1183 | PetscValidLogicalCollectiveInt(pc,n,2)do { PetscErrorCode _7_ierr; PetscInt b1[2],b2[2]; b1[0] = -n ; b1[1] = n; _7_ierr = (PetscAllreduceBarrierCheck(PetscObjectComm ((PetscObject)pc),2,1183,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ) || ((petsc_allreduce_ct += PetscMPIParallelComm((PetscObjectComm ((PetscObject)pc))),0) || MPI_Allreduce((b1),(b2),(2),(((MPI_Datatype )0x4c000405)),((MPI_Op)(0x58000001)),(PetscObjectComm((PetscObject )pc)))));do {if (__builtin_expect(!!(_7_ierr),0)) return PetscError (((MPI_Comm)0x44000001),1183,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,_7_ierr,PETSC_ERROR_REPEAT," ");} while (0); if (-b2[0] != b2 [1]) return PetscError(PetscObjectComm((PetscObject)pc),1183, __func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,62,PETSC_ERROR_INITIAL,"Int value must be same on all processes, argument # %d" ,2); } while (0); | |||
1184 | if (!mglevels) SETERRQ(PetscObjectComm((PetscObject)pc),PETSC_ERR_ORDER,"Must set MG levels with PCMGSetLevels() before calling")return PetscError(PetscObjectComm((PetscObject)pc),1184,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c",58,PETSC_ERROR_INITIAL ,"Must set MG levels with PCMGSetLevels() before calling"); | |||
1185 | levels = mglevels[0]->levels; | |||
1186 | ||||
1187 | for (i=1; i<levels; i++) { | |||
1188 | ierr = KSPSetTolerances(mglevels[i]->smoothu,PETSC_DEFAULT-2,PETSC_DEFAULT-2,PETSC_DEFAULT-2,n);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1188,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1189 | ierr = KSPSetTolerances(mglevels[i]->smoothd,PETSC_DEFAULT-2,PETSC_DEFAULT-2,PETSC_DEFAULT-2,n);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1189,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1190 | mg->default_smoothu = n; | |||
1191 | mg->default_smoothd = n; | |||
1192 | } | |||
1193 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
1194 | } | |||
1195 | ||||
1196 | /*@ | |||
1197 | PCMGSetDistinctSmoothUp - sets the up (post) smoother to be a seperate KSP from the down (pre) smoother on all levels | |||
1198 | and adds the suffix _up to the options name | |||
1199 | ||||
1200 | Logically Collective on PC | |||
1201 | ||||
1202 | Input Parameters: | |||
1203 | . pc - the preconditioner context | |||
1204 | ||||
1205 | Options Database Key: | |||
1206 | . -pc_mg_distinct_smoothup | |||
1207 | ||||
1208 | Level: advanced | |||
1209 | ||||
1210 | Notes: | |||
1211 | this does not set a value on the coarsest grid, since we assume that | |||
1212 | there is no separate smooth up on the coarsest grid. | |||
1213 | ||||
1214 | .seealso: PCMGSetNumberSmooth() | |||
1215 | @*/ | |||
1216 | PetscErrorCode PCMGSetDistinctSmoothUp(PC pc) | |||
1217 | { | |||
1218 | PC_MG *mg = (PC_MG*)pc->data; | |||
1219 | PC_MG_Levels **mglevels = mg->levels; | |||
1220 | PetscErrorCode ierr; | |||
1221 | PetscInt i,levels; | |||
1222 | KSP subksp; | |||
1223 | ||||
1224 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c"; petscstack ->line[petscstack->currentsize] = 1224; petscstack-> petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); | |||
1225 | PetscValidHeaderSpecific(pc,PC_CLASSID,1)do { if (!pc) return PetscError(((MPI_Comm)0x44000001),1225,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c",85,PETSC_ERROR_INITIAL ,"Null Object: Parameter # %d",1); if (!PetscCheckPointer(pc, PETSC_OBJECT)) return PetscError(((MPI_Comm)0x44000001),1225, __func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,64,PETSC_ERROR_INITIAL,"Invalid Pointer to Object: Parameter # %d" ,1); if (((PetscObject)(pc))->classid != PC_CLASSID) { if ( ((PetscObject)(pc))->classid == -1) return PetscError(((MPI_Comm )0x44000001),1225,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,64,PETSC_ERROR_INITIAL,"Object already free: Parameter # %d" ,1); else return PetscError(((MPI_Comm)0x44000001),1225,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c",62,PETSC_ERROR_INITIAL ,"Wrong type of object: Parameter # %d",1); } } while (0); | |||
1226 | if (!mglevels) SETERRQ(PetscObjectComm((PetscObject)pc),PETSC_ERR_ORDER,"Must set MG levels with PCMGSetLevels() before calling")return PetscError(PetscObjectComm((PetscObject)pc),1226,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c",58,PETSC_ERROR_INITIAL ,"Must set MG levels with PCMGSetLevels() before calling"); | |||
1227 | levels = mglevels[0]->levels; | |||
1228 | ||||
1229 | for (i=1; i<levels; i++) { | |||
1230 | const char *prefix = NULL((void*)0); | |||
1231 | /* make sure smoother up and down are different */ | |||
1232 | ierr = PCMGGetSmootherUp(pc,i,&subksp);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1232,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1233 | ierr = KSPGetOptionsPrefix(mglevels[i]->smoothd,&prefix);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1233,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1234 | ierr = KSPSetOptionsPrefix(subksp,prefix);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1234,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1235 | ierr = KSPAppendOptionsPrefix(subksp,"up_");CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1235,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1236 | } | |||
1237 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
1238 | } | |||
1239 | ||||
1240 | /* No new matrices are created, and the coarse operator matrices are the references to the original ones */ | |||
1241 | PetscErrorCode PCGetInterpolations_MG(PC pc,PetscInt *num_levels,Mat *interpolations[]) | |||
1242 | { | |||
1243 | PC_MG *mg = (PC_MG*)pc->data; | |||
1244 | PC_MG_Levels **mglevels = mg->levels; | |||
1245 | Mat *mat; | |||
1246 | PetscInt l; | |||
1247 | PetscErrorCode ierr; | |||
1248 | ||||
1249 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c"; petscstack ->line[petscstack->currentsize] = 1249; petscstack-> petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); | |||
1250 | if (!mglevels) SETERRQ(PetscObjectComm((PetscObject)pc),PETSC_ERR_ARG_WRONGSTATE,"Must set MG levels before calling")return PetscError(PetscObjectComm((PetscObject)pc),1250,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c",73,PETSC_ERROR_INITIAL ,"Must set MG levels before calling"); | |||
1251 | ierr = PetscMalloc1(mg->nlevels,&mat)PetscMallocA(1,PETSC_FALSE,1251,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,(size_t)(mg->nlevels)*sizeof(**(&mat)),(&mat));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1251,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1252 | for (l=1; l< mg->nlevels; l++) { | |||
1253 | mat[l-1] = mglevels[l]->interpolate; | |||
1254 | ierr = PetscObjectReference((PetscObject)mat[l-1]);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1254,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1255 | } | |||
1256 | *num_levels = mg->nlevels; | |||
1257 | *interpolations = mat; | |||
1258 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
1259 | } | |||
1260 | ||||
1261 | /* No new matrices are created, and the coarse operator matrices are the references to the original ones */ | |||
1262 | PetscErrorCode PCGetCoarseOperators_MG(PC pc,PetscInt *num_levels,Mat *coarseOperators[]) | |||
1263 | { | |||
1264 | PC_MG *mg = (PC_MG*)pc->data; | |||
1265 | PC_MG_Levels **mglevels = mg->levels; | |||
1266 | PetscInt l; | |||
1267 | Mat *mat; | |||
1268 | PetscErrorCode ierr; | |||
1269 | ||||
1270 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c"; petscstack ->line[petscstack->currentsize] = 1270; petscstack-> petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); | |||
1271 | if (!mglevels) SETERRQ(PetscObjectComm((PetscObject)pc),PETSC_ERR_ARG_WRONGSTATE,"Must set MG levels before calling")return PetscError(PetscObjectComm((PetscObject)pc),1271,__func__ ,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c",73,PETSC_ERROR_INITIAL ,"Must set MG levels before calling"); | |||
1272 | ierr = PetscMalloc1(mg->nlevels,&mat)PetscMallocA(1,PETSC_FALSE,1272,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,(size_t)(mg->nlevels)*sizeof(**(&mat)),(&mat));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1272,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1273 | for (l=0; l<mg->nlevels-1; l++) { | |||
1274 | ierr = KSPGetOperators(mglevels[l]->smoothd,NULL((void*)0),&(mat[l]));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1274,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1275 | ierr = PetscObjectReference((PetscObject)mat[l]);CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1275,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1276 | } | |||
1277 | *num_levels = mg->nlevels; | |||
1278 | *coarseOperators = mat; | |||
1279 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
1280 | } | |||
1281 | ||||
1282 | /* ----------------------------------------------------------------------------------------*/ | |||
1283 | ||||
1284 | /*MC | |||
1285 | PCMG - Use multigrid preconditioning. This preconditioner requires you provide additional | |||
1286 | information about the coarser grid matrices and restriction/interpolation operators. | |||
1287 | ||||
1288 | Options Database Keys: | |||
1289 | + -pc_mg_levels <nlevels> - number of levels including finest | |||
1290 | . -pc_mg_cycle_type <v,w> - provide the cycle desired | |||
1291 | . -pc_mg_type <additive,multiplicative,full,kaskade> - multiplicative is the default | |||
1292 | . -pc_mg_log - log information about time spent on each level of the solver | |||
1293 | . -pc_mg_distinct_smoothup - configure up (after interpolation) and down (before restriction) smoothers separately (with different options prefixes) | |||
1294 | . -pc_mg_galerkin <both,pmat,mat,none> - use Galerkin process to compute coarser operators, i.e. Acoarse = R A R' | |||
1295 | . -pc_mg_multiplicative_cycles - number of cycles to use as the preconditioner (defaults to 1) | |||
1296 | . -pc_mg_dump_matlab - dumps the matrices for each level and the restriction/interpolation matrices | |||
1297 | to the Socket viewer for reading from MATLAB. | |||
1298 | - -pc_mg_dump_binary - dumps the matrices for each level and the restriction/interpolation matrices | |||
1299 | to the binary output file called binaryoutput | |||
1300 | ||||
1301 | Notes: | |||
1302 | If one uses a Krylov method such GMRES or CG as the smoother then one must use KSPFGMRES, KSPGCR, or KSPRICHARDSON as the outer Krylov method | |||
1303 | ||||
1304 | When run with a single level the smoother options are used on that level NOT the coarse grid solver options | |||
1305 | ||||
1306 | When run with KSPRICHARDSON the convergence test changes slightly if monitor is turned on. The iteration count may change slightly. This | |||
1307 | is because without monitoring the residual norm is computed WITHIN each multigrid cycle on the finest level after the pre-smoothing | |||
1308 | (because the residual has just been computed for the multigrid algorithm and is hence available for free) while with monitoring the | |||
1309 | residual is computed at the end of each cycle. | |||
1310 | ||||
1311 | Level: intermediate | |||
1312 | ||||
1313 | .seealso: PCCreate(), PCSetType(), PCType (for list of available types), PC, PCMGType, PCEXOTIC, PCGAMG, PCML, PCHYPRE | |||
1314 | PCMGSetLevels(), PCMGGetLevels(), PCMGSetType(), PCMGSetCycleType(), | |||
1315 | PCMGSetDistinctSmoothUp(), PCMGGetCoarseSolve(), PCMGSetResidual(), PCMGSetInterpolation(), | |||
1316 | PCMGSetRestriction(), PCMGGetSmoother(), PCMGGetSmootherUp(), PCMGGetSmootherDown(), | |||
1317 | PCMGSetCycleTypeOnLevel(), PCMGSetRhs(), PCMGSetX(), PCMGSetR() | |||
1318 | M*/ | |||
1319 | ||||
1320 | PETSC_EXTERNextern __attribute__((visibility ("default"))) PetscErrorCode PCCreate_MG(PC pc) | |||
1321 | { | |||
1322 | PC_MG *mg; | |||
1323 | PetscErrorCode ierr; | |||
1324 | ||||
1325 | PetscFunctionBegindo { do { ; if (petscstack && (petscstack->currentsize < 64)) { petscstack->function[petscstack->currentsize ] = __func__; petscstack->file[petscstack->currentsize] = "/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c"; petscstack ->line[petscstack->currentsize] = 1325; petscstack-> petscroutine[petscstack->currentsize] = PETSC_TRUE; petscstack ->currentsize++; } if (petscstack) { petscstack->hotdepth += (PETSC_FALSE || petscstack->hotdepth); } ; } while (0) ; ; } while (0); | |||
1326 | ierr = PetscNewLog(pc,&mg)(PetscMallocA(1,PETSC_TRUE,1326,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,(size_t)(1)*sizeof(**(((&mg)))),(((&mg)))) || PetscLogObjectMemory ((PetscObject)pc,sizeof(**(&mg))));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1326,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1327 | pc->data = (void*)mg; | |||
1328 | mg->nlevels = -1; | |||
1329 | mg->am = PC_MG_MULTIPLICATIVE; | |||
1330 | mg->galerkin = PC_MG_GALERKIN_NONE; | |||
1331 | ||||
1332 | pc->useAmat = PETSC_TRUE; | |||
1333 | ||||
1334 | pc->ops->apply = PCApply_MG; | |||
1335 | pc->ops->setup = PCSetUp_MG; | |||
1336 | pc->ops->reset = PCReset_MG; | |||
1337 | pc->ops->destroy = PCDestroy_MG; | |||
1338 | pc->ops->setfromoptions = PCSetFromOptions_MG; | |||
1339 | pc->ops->view = PCView_MG; | |||
1340 | ||||
1341 | ierr = PetscObjectComposeFunction((PetscObject)pc,"PCMGSetGalerkin_C",PCMGSetGalerkin_MG)PetscObjectComposeFunction_Private((PetscObject)pc,"PCMGSetGalerkin_C" ,(PetscVoidFunction)(PCMGSetGalerkin_MG));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1341,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1342 | ierr = PetscObjectComposeFunction((PetscObject)pc,"PCMGGetLevels_C",PCMGGetLevels_MG)PetscObjectComposeFunction_Private((PetscObject)pc,"PCMGGetLevels_C" ,(PetscVoidFunction)(PCMGGetLevels_MG));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1342,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1343 | ierr = PetscObjectComposeFunction((PetscObject)pc,"PCMGSetLevels_C",PCMGSetLevels_MG)PetscObjectComposeFunction_Private((PetscObject)pc,"PCMGSetLevels_C" ,(PetscVoidFunction)(PCMGSetLevels_MG));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1343,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1344 | ierr = PetscObjectComposeFunction((PetscObject)pc,"PCGetInterpolations_C",PCGetInterpolations_MG)PetscObjectComposeFunction_Private((PetscObject)pc,"PCGetInterpolations_C" ,(PetscVoidFunction)(PCGetInterpolations_MG));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1344,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1345 | ierr = PetscObjectComposeFunction((PetscObject)pc,"PCGetCoarseOperators_C",PCGetCoarseOperators_MG)PetscObjectComposeFunction_Private((PetscObject)pc,"PCGetCoarseOperators_C" ,(PetscVoidFunction)(PCGetCoarseOperators_MG));CHKERRQ(ierr)do {if (__builtin_expect(!!(ierr),0)) return PetscError(((MPI_Comm )0x44000001),1345,__func__,"/sandbox/petsc/petsc.next/src/ksp/pc/impls/mg/mg.c" ,ierr,PETSC_ERROR_REPEAT," ");} while (0); | |||
1346 | PetscFunctionReturn(0)do { do { ; if (petscstack && petscstack->currentsize > 0) { petscstack->currentsize--; petscstack->function [petscstack->currentsize] = 0; petscstack->file[petscstack ->currentsize] = 0; petscstack->line[petscstack->currentsize ] = 0; petscstack->petscroutine[petscstack->currentsize ] = PETSC_FALSE; } if (petscstack) { petscstack->hotdepth = (((petscstack->hotdepth-1)<(0)) ? (0) : (petscstack-> hotdepth-1)); } ; } while (0); return(0);} while (0); | |||
1347 | } |