<div dir="ltr">Awesome! thanks to all.<div><br></div><div>Cheers</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, Aug 13, 2020 at 2:19 PM Barry Smith <<a href="mailto:bsmith@petsc.dev">bsmith@petsc.dev</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex"><div style="word-wrap:break-word;line-break:after-white-space"><p style="text-align:center"><font color="red"><strong>External Email</strong><br></font></p><div><br></div>  Anthony,<div><br></div><div>    Keeping the nonzero locations (with zero in them) will be a bit faster in the call to MatZeroRows() because otherwise it has to shift all the entries in the sparse matrix arrays data structures to "remove" the unneeded locations. </div><div> </div><div>    But the real question is how it affects times in later function calls</div><div><br></div><div>1)  If you do the MatSetValues()/MatAssemblyBegin/End() repeatedly it will be much faster if you keep the nonzero locations (with zero in them). </div><div><br></div><div>2)  Time for MatMult() will be a bit faster if you remove the locations, but the depending on the preconditioner the preconditioner may be more or less effective and a bit slower or faster. </div><div><br></div><div>  So, rule of thumb is if you only do MatZeroRows() once you might generally remove the locations but if it is done in a loop with the same matrix (over time-steps for example, or even in SNES) you want to keep the nonzero locations.</div><div><br></div><div>  Barry</div><div><br></div><div>Note: in both cases the memory usage is the same because PETSc does not "return" the excessive memory.</div><div><br><div><br><blockquote type="cite"><div>On Aug 13, 2020, at 8:07 AM, Matthew Knepley <<a href="mailto:knepley@gmail.com" target="_blank">knepley@gmail.com</a>> wrote:</div><br><div><div dir="ltr"><div dir="ltr">On Thu, Aug 13, 2020 at 3:17 AM Anthony Paul Haas <<a href="mailto:aph@email.arizona.edu" target="_blank">aph@email.arizona.edu</a>> wrote:<br></div><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><font face="arial, sans-serif">Hello,</font><div><font face="arial, sans-serif"><br></font></div><div><font face="arial, sans-serif">I am using MatZeroRows for imposing a known forcing into my equations in conjunction with rhs and by setting the diagonal of the matrix to 1.</font></div><div><font face="arial, sans-serif"><br></font></div><div><font face="arial, sans-serif">I am using Fortran. I have used:</font></div><div><font face="arial, sans-serif"><br></font></div><div><div style="margin:0px;font-stretch:normal;line-height:normal;color:rgb(203,36,24)"><span style="font-variant-ligatures:no-common-ligatures"><font face="arial, sans-serif">! only local processors set their own zeros                                                                                                                                                     </font></span></div><div style="margin:0px;font-stretch:normal;line-height:normal"><font face="arial, sans-serif"><span style="font-variant-ligatures:no-common-ligatures;color:rgb(194,0,255)">call</span><span style="font-variant-ligatures:no-common-ligatures"> </span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(74,0,255)">MatSetOption</span><span style="font-variant-ligatures:no-common-ligatures">(self%fieldLHSMat_ps, MAT_NO_OFF_PROC_ZERO_ROWS, PETSC_TRUE, ierr)</span></font></div><div style="margin:0px;font-stretch:normal;line-height:normal"><font face="arial, sans-serif"><span style="font-variant-ligatures:no-common-ligatures"><br></span></font></div><div style="margin:0px;font-stretch:normal;line-height:normal"><font face="arial, sans-serif"><span style="font-variant-ligatures:no-common-ligatures;color:rgb(194,0,255)">call</span><span style="font-variant-ligatures:no-common-ligatures"> </span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(74,0,255)">MatSetOption</span><span style="font-variant-ligatures:no-common-ligatures">(self%fieldLHSMat_ps, MAT_KEEP_NONZERO_PATTERN, PETSC_TRUE, ierr)</span></font></div><div style="margin:0px;font-stretch:normal;line-height:normal;min-height:13px"><font face="arial, sans-serif"><br><span style="font-variant-ligatures:no-common-ligatures"></span></font></div><div style="margin:0px;font-stretch:normal;line-height:normal"><font face="arial, sans-serif"><span style="font-variant-ligatures:no-common-ligatures;color:rgb(194,0,255)">call</span><span style="font-variant-ligatures:no-common-ligatures"> </span><span style="font-variant-ligatures:no-common-ligatures;color:rgb(74,0,255)">MatZeroRows</span><span style="font-variant-ligatures:no-common-ligatures">(self%fieldLHSMat_ps, numrows, glob_row_idx, diag, PETSC_NULL_OBJECT, PETSC_NULL_OBJECT, ierr)</span></font></div><div style="margin:0px;font-stretch:normal;line-height:normal"><span style="font-variant-ligatures:no-common-ligatures"><font face="arial, sans-serif"><br></font></span></div><div style="margin:0px;font-stretch:normal;line-height:normal"><span style="font-variant-ligatures:no-common-ligatures"><font face="arial, sans-serif"><br></font></span></div><div style="margin:0px;font-stretch:normal;line-height:normal"><span style="font-variant-ligatures:no-common-ligatures"><font face="arial, sans-serif">Is numrows above the local (on each proc.) number of rows to remove, or is it the global number of rows to remove?</font></span></div></div></div></div></div></div></div></div></div></blockquote><div><br></div><div>Local.</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div><div style="margin:0px;font-stretch:normal;line-height:normal"><font face="arial, sans-serif"><span style="font-variant-ligatures:no-common-ligatures">Also on some processors, I have no rows to remove, hence the array </span>glob_row_idx is not allocated. How can I tell Petsc? Should I pass PETSC_NULL_OBJECT instead of glob_row_idx in this case?   </font></div></div></div></div></div></div></div></div></div></blockquote><div><br></div><div>If you pass numrows = 0, it should not matter what is in the next slot, as long as it type checks.</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div><div style="margin:0px;font-stretch:normal;line-height:normal"><font face="arial, sans-serif">Finally, does using the option MAT_KEEP_NONZERO_PATTERN have an influence on the time the MatZeroRows call will take?</font></div></div></div></div></div></div></div></div></div></blockquote><div><br></div><div>I don't think it makes much of a difference, but I have not measured it.</div><div><br></div><div>  Thanks,</div><div><br></div><div>     Matt</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div><div style="margin:0px;font-stretch:normal;line-height:normal"><font face="arial, sans-serif">Thanks,</font></div><div style="margin:0px;font-stretch:normal;line-height:normal"><font face="arial, sans-serif"><br></font></div><div style="margin:0px;font-stretch:normal;line-height:normal"><font face="arial, sans-serif">Best regards,</font></div><div style="margin:0px;font-stretch:normal;line-height:normal"><font face="arial, sans-serif"><br></font></div><div style="margin:0px;font-stretch:normal;line-height:normal"><font face="arial, sans-serif">Anthony</font></div><div style="margin:0px;font-stretch:normal;line-height:normal"><font face="arial, sans-serif"><br></font></div><div style="margin:0px;font-stretch:normal;line-height:normal"><font face="arial, sans-serif"><br></font></div></div><div><span style="font-variant-ligatures:no-common-ligatures"><br></span></div></div></div></div></div></div></div></div>
</blockquote></div><br clear="all"><div><br></div>-- <br><div dir="ltr"><div dir="ltr"><div><div dir="ltr"><div><div dir="ltr"><div>What most experimenters take for granted before they begin their experiments is infinitely more interesting than any results to which their experiments lead.<br>-- Norbert Wiener</div><div><br></div><div><a href="http://www.cse.buffalo.edu/~knepley/" target="_blank">https://www.cse.buffalo.edu/~knepley/</a><br></div></div></div></div></div></div></div></div>
</div></blockquote></div><br></div></div></blockquote></div>