<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">2018-03-06 14:49 GMT-08:00 Smith, Barry F. <span dir="ltr"><<a href="mailto:bsmith@mcs.anl.gov" target="_blank">bsmith@mcs.anl.gov</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class=""><br>
<br>
> On Mar 6, 2018, at 4:37 PM, Ju Liu <<a href="mailto:liujuy@gmail.com">liujuy@gmail.com</a>> wrote:<br>
><br>
><br>
><br>
> 2018-03-06 14:13 GMT-08:00 Smith, Barry F. <<a href="mailto:bsmith@mcs.anl.gov">bsmith@mcs.anl.gov</a>>:<br>
><br>
><br>
> > On Mar 6, 2018, at 4:09 PM, John <<a href="mailto:johnlucassaturday@gmail.com">johnlucassaturday@gmail.com</a>> wrote:<br>
> ><br>
> > Hi PETSc team:<br>
> ><br>
> > I am trying to create a SIMPLE type approximation for the Schur complement. It is a nonlinear code, so I have to update the Schur matrix once the tangent jacobian is updated. I am trying to figure out the best way of doing that.<br>
> ><br>
> > In terms of generating an algebraic form of Schur S, I am trying to do the following.<br>
> ><br>
> > // S = A10 x A01, I have performed a diagonal scaling on all matrices, so the diag(A00) = I.<br>
> > MatMatMult(A10, A01, MAT_INITIAL_MATRIX, S);<br>
> > MatScale(S, -1.0); // S = -1 x S<br>
> > MatAXPY(S, 1.0, A11, S, DIFFERENT_NONZERO_PATTERN); // S = A11 + S<br>
> ><br>
> > My questions are:<br>
> > (1) When I update the Schur complement, do I need to call<br>
> > MatDestroy(&S);<br>
> > MatMatMult(A10, A01, MAT_INITIAL_MATRIX, S);<br>
> > or shall I just call<br>
> > MatMatMult(A10, A01, MAT_REUSE_MATRIX, S);<br>
><br>
>    The second form. No reason to delete the matrix and rebuild it each time (delete and rebuild will be a bit slower)<br>
><br>
> ><br>
> > Basically, I am not sure how to properly use the flag MAT_REUSE_MATRIX.<br>
> ><br>
> > (2) When I update the Schur complement, the initial call of MatAXPY already incorporated the contribution of A00 in terms of nonzero patterns. So in my second call of MatAXPY, shall I use the flag SUBSET_NONZERO_PATTERN?<br>
><br>
>    If it is a subset then you should use the subset flag, if they have same nonzero pattern you should use SAME_NONZERO_PATTERN (same nonzero is fastest)<br>
><br>
> Thanks Barry! I guess I still need some clarifications on the second point.<br>
><br>
> In the first assembly of S, I called MatAXPY to incorporate the entries of A11 into S (with differnet nonzero pattern for safety).<br>
><br>
> Now, with new blocks of A, I update S by calling<br>
> MatMatMult(A10, A01, MAT_REUSE_MATRIX, S);<br>
<br>
</span>   Ahh, you cannot do this if the MatAXPY introduces new nonzeros into the structure of S (the second MatMatMult() will likely crash or generate incorrect results since MAT_REUSE_MATRIX requires that each time the routine is called S has the exact same nonzero pattern.)<br>
<br>
   Now for most problems I would expect that A11 has a subset of the nonzeros of S, in that case you can use MatAXPY with subset each time and you can use MAT_REUSE_MATRIX. But you would need to verify for your problem that A11 has a subset of the nonzeros of S. This is the "ideal" case in terms of performance.<br>
<br>
   If A11 does not have a subset of the nonzeros of S then you (obviously) cannot use subset and you must destroy the S each time and create a new one with each MatMatMult().<br>
<span class="HOEnZb"><font color="#888888"><br></font></span></blockquote><div>I see. Thanks a lot!<br><br></div><div>John <br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="HOEnZb"><font color="#888888">
   Barry<br>
</font></span><div class="HOEnZb"><div class="h5"><br>
<br>
> At this stage, what is the nonzero pattern of S? If S's pattern is determined by the most recent call of MatMatMult, I guess I will still use the different nonzero pattern. If the pattern of S is inherited from the first assembly, the A11's nonzero pattern is a subset of S's, so subset flag should be safe.<br>
><br>
> Thanks!<br>
><br>
> John<br>
><br>
><br>
><br>
><br>
>    Barry<br>
><br>
> ><br>
> > Best regards,<br>
> ><br>
> > John<br>
><br>
><br>
><br>
><br>
> --<br>
> Ju Liu, Ph.D.<br>
> Postdoctoral Research Fellow<br>
> Stanford School of Medicine<br>
> <a href="http://ju-liu.github.io/" rel="noreferrer" target="_blank">http://ju-liu.github.io/</a><br>
<br>
</div></div></blockquote></div><br><br clear="all"><br>-- <br><div class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr"><div><div><div>Ju Liu, Ph.D.<br></div>Postdoctoral Research Fellow<br></div>Stanford School of Medicine<br></div><a href="http://ju-liu.github.io/" target="_blank">http://ju-liu.github.io/</a><br></div></div>
</div></div>