[petsc-users] multigrid implementation problem

Jed Brown jedbrown at mcs.anl.gov
Sun Jun 10 19:11:27 CDT 2012


On Sun, Jun 10, 2012 at 7:05 PM, Nakib Haider Protik <nprot048 at uottawa.ca>wrote:

> Hello again
>
> Here I am trying to declare three different local KSP objects for the
> coarse solver, up smoother and down smoother respectively. The code fails
> to compile with the error:
>
> expected expression before ‘KSP’
>
> for each of the /**/ lines. Both the v3.0.0


This is unrelated, but please upgrade to petsc-3.3


> user manual and the online
> documentation suggests usage of this kind. I am totally at loss here and
> any suggestion will be greatly appreciated.
>
> ////////////////////MG Solver Stuff////////////////////
>    KSP solver;
>    PC pc;
>    Mat A, P;
>    //
>    .
>    .
>    . Here the A matrix forming function is called
>    .
>    .
>    //
>    KSPCreate(PETSC_COMM_WORLD, &solver);
>    KSPSetType(solver, KSPGMRES);
>    KSPGetPC(solver, &pc);
>    KSPSetFromOptions(solver);
>
>    PCSetType(pc, PCMG);
>    PCMGSetLevels(pc, 2, PETSC_NULL);
>    PCMGSetType(pc, PC_MG_MULTIPLICATIVE);
>    PCMGSetCycleType(pc, PC_MG_CYCLE_V);
>    MatDuplicate(A, MAT_COPY_VALUES, &P);
>    PCMGSetCyclesOnLevel(pc, 0, 1);
>    PCMGSetCyclesOnLevel(pc, 1, 1);
>     PCMGGetCoarseSolve(pc, KSP *cksp);/**/
>

I'm sorry, this is not valid C. The API documentation in the user's manual
shows you the types in the call, it is not valid code to call the routine.

I'm afraid that if you are going to write code in C, you will have to learn
the C language. It is not a difficult language.


>    PCMGGetSmootherDown(pc, 0, KSP *dksp);/**/
>    PCMGGetSmootherUp(pc, 1, KSP *uksp);/**/
>     PCMGSetInterpolation(pc, 1, P);
>    PCMGSetRestriction(pc, 1, P);
>    PCMGSetResidual(pc, 0, PCMGDefaultResidual, P);
>    PCMGSetResidual(pc, 1, PCMGDefaultResidual, P);
>
>     KSPSetOperators(solver, A, P, SAME_NONZERO_PATTERN);
>    KSPSolve(solver, breal, xreal_harm);
>    KSPSolve(solver, bimag, ximag_harm);
>    //////////////////////////////////////////////////////////
>
> Thanks
>
> > On Sun, Jun 10, 2012 at 4:54 PM, Nakib Haider Protik
> > <nprot048 at uottawa.ca>wrote:
> >
> >> Sorry, I meant to refer to this:
> >> http://lists.mcs.anl.gov/pipermail/petsc-users/2011-May/008793.html
> >
> >
> > As I've said in every message, this rampantly overwrites local variables.
> >
> >> >   DAGetMatrix(da, MATAIJ, &M);
> >> >
> >> >   KSPCreate(PETSC_COMM_WORLD, &ksp);
> >> >   KSPSetType(ksp, KSPGMRES);
> >> >   KSPGetPC(ksp, &pcmg);
> >> >   PCSetType(pcmg, PCMG);
> >> >
> >> >   PCMGSetLevels(pcmg, 2, &PETSC_COMM_WORLD);
> >> >   PCMGSetType(pcmg, PC_MG_MULTIPLICATIVE);
> >> >   PCMGSetCycleType(pcmg, PC_MG_CYCLE_W);
> >> >   PCMGSetCyclesOnLevel(pcmg, 0, 1);
> >> >   PCMGSetCyclesOnLevel(pcmg, 1, 1);
> >> >
> >> >   PCMGGetCoarseSolve(pcmg, &ksp);
> >
> > This overwrites ksp with the coarse solver.
> >
> >> >
> >> >   PCMGGetSmoother(pcmg, 0, &ksp);
> >
> > This overwrites it again with the level 0 "smoother" (same as the coarse
> > solver).
> >
> >> >   PCMGGetSmoother(pcmg, 1, &ksp);
> >
> > This overwrites it again with the level 1 smoother.
> >
> >> >   PCMGSetInterpolation(pcmg, 1, M);
> >> >   PCMGSetRestriction(pcmg, 1, M);
> >> >
> >> >   PCMGSetResidual(pcmg, 0, PCMGDefaultResidual, M);
> >> >   PCMGSetResidual(pcmg, 1, PCMGDefaultResidual, M);
> >
> > So if you get down here and use "ksp" for something (as your code did),
> > your are actually working with the level 1 smoother. I also said this in
> > my
> > first email, explaining why the problem was solved this way (the smoother
> > was as good as a direct solve). The original KSP has been lost forever
> and
> > has leaked its memory.
> >
>
>
> --
> Nakib
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20120610/e809e4f5/attachment.html>


More information about the petsc-users mailing list