[petsc-users] multigrid implementation problem

Nakib Haider Protik nprot048 at uottawa.ca
Sun Jun 10 19:05:44 CDT 2012


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 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);/**/
    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


More information about the petsc-users mailing list