<html><head><meta http-equiv="Content-Type" content="text/html; charset=us-ascii"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class=""><div class=""><br class=""></div>  Alex,<div class=""><br class=""></div><div class="">   See my long email.   The thing with nested preconditioners (like yours) is they have multiple PCSetUps(), possibly outer ones and inner ones. Each of these PC independently triggers a rebuild based on its own state, hence the inner PCSetUps will be triggered when you change the inner matrices (even when you don't call MatAssemblyBegin/End() on the MatNest. </div><div class=""><br class=""></div><div class="">   In your case since the preconditioner seems to depend only on the two sub matrices the fact that PCSetUp() is not called on the MatNest is harmless, since that setup wouldn't do anything anyways. </div><div class=""><br class=""></div><div class="">   For Schur complement based PCFieldsplits however the result maybe be wrong unless you call MatAssemblyBegin/End on the nest matrix since the outer setup actually does something</div><div class=""><br class=""></div><div class="">  Barry</div><div class=""><br class=""><div><br class=""><blockquote type="cite" class=""><div class="">On Jul 21, 2020, at 8:16 PM, Alex Fleeter <<a href="mailto:luis.saturday@gmail.com" class="">luis.saturday@gmail.com</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div dir="ltr" class="">If I call MatAssembly for individual sub-matrices, <div class=""> MatAssemblyBegin(subA[ii], MAT_FINAL_ASSEMBLY);<br class=""> MatAssemblyEnd(subA[ii], MAT_FINAL_ASSEMBLY);<br class=""></div><div class=""><br class=""></div><div class="">then call KSPSetOperators, the PC setup is not called.</div><div class=""><br class=""></div><div class="">I have to call the assembly for the whole nest matrix </div><div class=""> MatAssemblyBegin(A, MAT_FINAL_ASSEMBLY);<br class=""> MatAssemblyEnd(A, MAT_FINAL_ASSEMBLY);<br class=""></div><div class="">to trigger the setup of PC. </div><div class=""><br class=""></div><div class="">I found some comments in <a href="https://www.mcs.anl.gov/petsc/petsc-current/src/mat/impls/nest/matnest.c" style="font-family: "Times New Roman"; font-size: inherit; text-align: -webkit-center;" class="">matnest.c</a>, line 474-478: "<span style="color:rgb(178,34,34)" class="">Note: split assembly will fail if the same block appears more than once (even indirectly through a nested</span></div><pre width="80" style="" class=""><a name="line475" class="">475: </a><font color="#B22222" class="">           * sub-block). This could be fixed by adding a flag to <a href="https://www.mcs.anl.gov/petsc/petsc-current/docs/manualpages/Mat/Mat.html#Mat" class="">Mat</a> so that there was a way to check if a <a href="https://www.mcs.anl.gov/petsc/petsc-current/docs/manualpages/Mat/Mat.html#Mat" class="">Mat</a> was</font>
<a name="line476" class="">476: </a><font color="#B22222" class="">           * already performing an assembly, but the result would by more complicated and appears to offer less</font>
<a name="line477" class="">477: </a><font color="#B22222" class="">           * potential for diagnostics and correctness checking. Split assembly should be fixed once there is an</font>
<a name="line478" class="">478: </a><font color="#B22222" class="">           * interface for libraries to make asynchronous progress in "user-defined non-blocking collectives"."</font></pre><pre width="80" style="" class=""><font color="#B22222" style="" class="">I guess the comment suggests calling matassembly for the big nest matrix after having setted values for individual sub-matrices, instead of calling matassembly for individual submatrices.</font></pre><pre width="80" style="" class=""><font color="#B22222" style="" class=""><br class=""></font></pre><pre width="80" style="" class=""><font color="#B22222" style="" class="">Can you confirm that?</font></pre><pre width="80" style="" class=""><font color="#B22222" class=""><br class=""></font></pre></div><br class=""><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, Jul 21, 2020 at 4:35 PM Mark Adams <<a href="mailto:mfadams@lbl.gov" class="">mfadams@lbl.gov</a>> wrote:<br class=""></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr" class="">KSPSetOperator tells the KSP that the PC should be resetup.</div><br class=""><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, Jul 21, 2020 at 3:45 PM Alex Fleeter <<a href="mailto:luis.saturday@gmail.com" target="_blank" class="">luis.saturday@gmail.com</a>> wrote:<br class=""></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr" class="">Hi:<div class=""><br class=""></div><div class="">I want to ask under what circumstance will trigger a call for pc setup. </div><div class=""><br class=""></div><div class="">I call KSPSolve to solve with the same Mat object with different entry values each time. I can see that the pc setup is only called at the beginning of the first solve. </div><div class=""><br class=""></div><div class="">I tried to read the implementation, but quickly get lost...</div></div>
</blockquote></div>
</blockquote></div>
</div></blockquote></div><br class=""></div></body></html>