[petsc-users] multigrid implementation problem
Nakib Haider Protik
nprot048 at uottawa.ca
Sun Jun 10 16:20:06 CDT 2012
Reason for two ksp objects:
Multigrid and Domain Decomposition in PETSc
Barry Smith
PETSc Developer
pg 28:
//Use same pre and post smoother
MGGetSmoother(pc,int level,KSP *ksp);
//Use different pre and post smoother
MGGetSmootherDown(pc,int level,KSP *dksp);
MGGetSmootherUp(pc,int level,KSP *uksp);
I was trying to use the second in my code. I would be greatly helped if
you could tell me where exactly my code goes wrong.
As for the "accidental" correctness of the 1d code, here's where I found
the prototype:
http://lists.mcs.anl.gov/pipermail/petsc-users/2011-May/008793.html
If my question does not abide by the regulations of this mailing list, or
if you are not obliged to answers questions of this kind, please let me
know. I am not looking for free lessons on c, but thanks for the link.
Despite the rude reply, thank you for taking the time.
> On Sun, Jun 10, 2012 at 3:49 PM, Nakib Haider Protik
> <nprot048 at uottawa.ca>wrote:
>
>> Thank you very much for the reply. Here's a change that works for the 2D
>> case:
>>
>> ////////////////////MG Solver Stuff////////////////////
>> KSPCreate(PETSC_COMM_WORLD, &ksp);
>> KSPSetType(ksp, KSPGMRES);
>>
>> KSPCreate(PETSC_COMM_WORLD, &kspu);
>> KSPSetType(kspu, KSPGMRES);
>>
>
> Why do you have two KSPs here?
>
>
>>
>> KSPGetPC(ksp, &pc);
>> KSPGetPC(kspu, &pc);
>>
>
> Why?
>
>
>>
>> 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);
>> PCMGGetSmootherDown(pc, 0, &ksp);
>> PCMGGetSmootherUp(pc, 1, &kspu);//(*)//
>>
>
> Okay, clearly you need to learn how variables work in C. Here is a free
> resource.
>
> http://c.learncodethehardway.org/book/
>
> (Any other resource will also do.) When you are comfortable with the
> language, we can revisit your code.
>
>
>> PCMGSetInterpolation(pc, 1, P);
>> PCMGSetRestriction(pc, 1, P);
>> PCMGSetResidual(pc, 0, PCMGDefaultResidual, P);
>> PCMGSetResidual(pc, 1, PCMGDefaultResidual, P);
>> KSPSetOperators(ksp, A, P, SAME_NONZERO_PATTERN);
>> KSPSetFromOptions(ksp);
>> KSPSolve(ksp, breal, xreal_harm);
>> KSPSolve(ksp, bimag, ximag_harm);
>> //////////////////////////////////////////////////////////
>>
>> Do you think this is working again because of some accident? Without the
>> step marked with a //(*)//, the code works too.
>>
>
--
Nakib
More information about the petsc-users
mailing list