<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Jul 16, 2015 at 5:53 PM, Michele Rosso <span dir="ltr"><<a href="mailto:mrosso@uci.edu" target="_blank">mrosso@uci.edu</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><u></u>


  
  

<div>
Hi,<br>
<br>
I am performing a series of solves inside a loop. The matrix for each solve changes but not enough to justify a rebuilt of the PC at each solve.<br>
Therefore I am using  KSPSetReusePreconditioner to avoid rebuilding unless necessary. The solver is CG + MG with a custom  PC at the coarse level.<br></div></blockquote><div><br></div><div>Ah, OK this is the problem.  The code I just sent gets fooled but your custom PC, probably.</div><div><br></div><div>We should just remove this paternal code:</div><div><br></div><div><div>  PetscBool      preonly,lu,redundant,cholesky,svd<br></div><div><br></div><div>   ...</div><div><br></div><div><br></div><div>  /*</div><div>      If coarse solver is not direct method then DO NOT USE preonly</div><div>  */</div><div>  ierr = PetscObjectTypeCompare((PetscObject)mglevels[0]->smoothd,KSPPREONLY,&preonly);CHKERRQ(ierr);</div><div>  if (preonly) {</div><div>    ierr = PetscObjectTypeCompare((PetscObject)cpc,PCBJACOBI,&bjaclu);CHKERRQ(ierr);</div><div>    if (bjaclu) {</div><div>      KSP *k2;</div><div>      PetscInt ii,first;</div><div>      ierr = PCBJacobiGetSubKSP(cpc,&ii,&first,&k2);CHKERRQ(ierr);</div><div>      if (ii==1) {</div><div>        PC pc2;</div><div>        ierr = KSPGetPC(k2[0],&pc2);CHKERRQ(ierr);</div><div>        ierr = PetscObjectTypeCompare((PetscObject)pc2,PCLU,&bjaclu);CHKERRQ(ierr);</div><div>      }</div><div>      else bjaclu = PETSC_FALSE;</div><div>    }</div><div>    ierr = PetscObjectTypeCompare((PetscObject)cpc,PCLU,&lu);CHKERRQ(ierr);</div><div>    ierr = PetscObjectTypeCompare((PetscObject)cpc,PCREDUNDANT,&redundant);CHKERRQ(ierr);</div><div>    ierr = PetscObjectTypeCompare((PetscObject)cpc,PCCHOLESKY,&cholesky);CHKERRQ(ierr);</div><div>    ierr = PetscObjectTypeCompare((PetscObject)cpc,PCSVD,&svd);CHKERRQ(ierr);</div><div>    if (!lu && !redundant && !cholesky && !svd && !bjaclu) {</div><div>      ierr = KSPSetType(mglevels[0]->smoothd,KSPGMRES);CHKERRQ(ierr);</div><div>    }</div><div>  }</div></div><div><br></div><div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div>
If KSP is not updated each time, everything works as it is supposed to. <br>
When instead I allow the default PETSc  behavior, i.e. updating PC every time the matrix changes, the coarse level KSP , initially set to PREONLY, is changed into GMRES <br>
after the first solve. I am not sure where the problem lies (my PC or PETSc), so I would like to have your opinion on this.<br>
I attached the ksp_view for the 2 successive solve and the options stack.<br>
<br>
Thanks for your help,<br>
Michel<br>
<br>
<br>
<br>
</div>

</blockquote></div><br></div></div>