<div class="gmail_quote">On Sun, Jun 10, 2012 at 7:54 PM, Nakib Haider Protik <span dir="ltr"><<a href="mailto:nprot048@uottawa.ca" target="_blank">nprot048@uottawa.ca</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Okay, so here is the code that works. This gives the correct result, but I<br>
want to make sure that it is not giving the correct result accidentally.<br></blockquote><div><br></div><div>1. I don't know how to emphasize this enough: you need to learn C to write C code.</div><div><br></div><div>
2. Please run in Valgrind, it will show you several memory leaks here.</div><div><br></div><div>3. Please run with -ksp_view so you can see what gets used. If you did this, it would be obvious that multigrid was not being used.</div>
<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Thank you very much for your time.<br>
<br>
    KSPCreate(PETSC_COMM_WORLD, &ksp);<br>
    KSPCreate(PETSC_COMM_WORLD, &cksp);<br>
    KSPCreate(PETSC_COMM_WORLD, &uksp);<br>
    KSPCreate(PETSC_COMM_WORLD, &dksp);<br></blockquote><div><br></div><div>^^ You only need to create ksp here, delete the other lines</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

    KSPSetType(ksp, KSPGMRES);<br>
    KSPSetType(cksp, KSPGMRES);<br>
    KSPSetType(uksp, KSPGMRES);<br>
    KSPSetType(dksp, KSPGMRES);<br></blockquote><div><br></div><div>^^ You don't need any of these</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

<br>
    KSPGetPC(ksp, &pc);<br>
    KSPGetPC(cksp, &pc);<br>
    KSPGetPC(uksp, &pc);<br>
    KSPGetPC(dksp, &pc);<br></blockquote><div><br></div><div>^^ delete all but the first of these</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

<br>
    KSPSetFromOptions(ksp);<br>
<div class="im"><br>
    PCSetType(pc, PCMG);<br>
    PCMGSetLevels(pc, 2, PETSC_NULL);<br>
    PCMGSetType(pc, PC_MG_MULTIPLICATIVE);<br>
    PCMGSetCycleType(pc, PC_MG_CYCLE_V);<br>
    MatDuplicate(A, MAT_COPY_VALUES, &P);<br>
    PCMGSetCyclesOnLevel(pc, 0, 1);<br>
    PCMGSetCyclesOnLevel(pc, 1, 1);<br>
<br>
</div>    PCMGGetCoarseSolve(pc, &cksp);<br>
    PCMGGetSmootherDown(pc, 0,  &dksp);<br>
    PCMGGetSmootherUp(pc, 1, &uksp);<br></blockquote><div><br></div><div>^^^ delete the last three lines here, they aren't doing anything</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

<div class="im"><br>
    PCMGSetInterpolation(pc, 1, P);<br>
    PCMGSetRestriction(pc, 1, P);<br>
    PCMGSetResidual(pc, 0, PCMGDefaultResidual, P);<br>
    PCMGSetResidual(pc, 1, PCMGDefaultResidual, P);<br></div></blockquote><div><br></div><div>There is no way that you want to be using P for interpolation/restriction and as the residual on levels and as the preconditioning matrix on the line below. The matrices are not even the right size. The reason the above runs is because nothing you have done with "pc" is being used: it refers to a "dksp" which you are leaking without using.</div>
<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="im">
<br>
</div>    KSPSetOperators(ksp, A, P, SAME_NONZERO_PATTERN);<br>
<div class="im HOEnZb">    KSPSolve(ksp, breal, xreal_harm);<br>
    KSPSolve(ksp, bimag, ximag_harm);<br>
    //////////////////////////////////////////////////////////<br>
<br>
</div><div class="HOEnZb"><div class="h5">> On Sun, Jun 10, 2012 at 7:32 PM, Nakib Haider Protik<br>
> <<a href="mailto:nprot048@uottawa.ca">nprot048@uottawa.ca</a>>wrote:<br>
><br>
>> Okay. But if I understood correctly, doing the following would also be<br>
>> wrong since I will have made three extra outer KSP objects. I am not<br>
>> sure<br>
>> I understand what these functions want.<br>
>><br>
>>  KSP cksp, uksp, dksp;<br>
>>  PCMGGetCoarseSolve(pc, &cksp);/**/<br>
>>  PCMGGetSmootherDown(pc, 0, &dksp);/**/<br>
>>  PCMGGetSmootherUp(pc, 1, &uksp);/**/<br>
>><br>
><br>
> This is fine, all of these are getting references to inner objects without<br>
> overwriting the outer objects. Of course you don't need to get these<br>
> references if you aren't going to modify them.<br>
><br>
> I recommend that you experiment with algorithms using the command line and<br>
> check that it does what you expect using -ksp_view.<br>
><br>
<br>
<br>
</div></div><span class="HOEnZb"><font color="#888888">--<br>
Nakib :)<br>
</font></span></blockquote></div><br>