<div dir="ltr">Hi:<div><br></div><div>I guess I could rephrase my question like this. I am using MATNEST.</div><div><br></div><div>When I updated the matrix, I did assembly only for the sub-matrices. Then when I call the KSP solver, I can see that the pcsetup was called only in the first time the solver gets called. </div><div><br></div><div>I tried to add MatAssembly for the big nest matrix as a second test. Then, when I called my solver, I could see that the pcsetup gets called.</div><div><br></div><div>I assume that there is a state flag in the MatNest object that tells the solver if it needs to update the preconditioner. After an assembly routine gets called, this flag will be activated. Could you confirm that?</div><div><br></div><div>The problem is that I am trying to implement a shell preconditioner, which gets the sub-matrices in the setup routine like the following<br></div><div>  MatNestGetSubMat(A, 0, 0, &newctx->submat[0]);<br>  MatNestGetSubMat(A, 0, 1, &newctx->submat[1]);<br>  MatNestGetSubMat(A, 1, 0, &newctx->submat[2]);<br>  MatNestGetSubMat(A, 1, 1, &newctx->submat[3]);<br><br>  KSPSetOperators(newctx->upper, newctx->submat[0], newctx->submat[0]);<br>  KSPSetOperators(newctx->lower, newctx->submat[3], newctx->submat[3]);<br></div><div><br></div><div>In the Apply stage, I do</div><div><br></div><div>PetscErrorCode blockpc_apply(PC pc, Vec x, Vec y)<br>{<br>  std::cout<<"APPLY PC\n";<br>  blockpc * newctx;<br>  PCShellGetContext(pc,(void**)&newctx);<br><br>  Vec x_v, x_p, y_v, y_p;<br>  VecGetSubVector(x, newctx->is[0], &x_v);<br>  VecGetSubVector(x, newctx->is[1], &x_p);<br>  VecGetSubVector(y, newctx->is[0], &y_v);<br>  VecGetSubVector(y, newctx->is[1], &y_p);<br><br>  KSPSolve( newctx -> upper, x_v, y_v );<br>  KSPSolve( newctx -> lower, x_p, y_p );<br><br>  VecRestoreSubVector(x, newctx->is[0], &x_v);<br>  VecRestoreSubVector(x, newctx->is[1], &x_p);<br>  VecRestoreSubVector(y, newctx->is[0], &y_v);<br>  VecRestoreSubVector(y, newctx->is[1], &y_p);<br><br>  return 0;<br>}<br></div><div><br></div><div>I want to know if I shall call an assembly for the big nest matrix so that the pcsetup can be called everytime the solver is dealing with a new matrix.<br></div><div><br></div><div>Thanks,</div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, Jul 21, 2020 at 12:44 PM Alex Fleeter <<a href="mailto:luis.saturday@gmail.com" target="_blank">luis.saturday@gmail.com</a>> wrote:<br></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">Hi:<div><br></div><div>I want to ask under what circumstance will trigger a call for pc setup. </div><div><br></div><div>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><br></div><div>I tried to read the implementation, but quickly get lost...</div></div>
</blockquote></div>