<div dir="ltr"><div dir="ltr">On Fri, Feb 4, 2022 at 11:47 PM Samuel Estes <<a href="mailto:samuelestes91@gmail.com">samuelestes91@gmail.com</a>> wrote:<br></div><div class="gmail_quote"><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 have a very basic question about matrix preallocation. I am trying to use the MatCreate(), MatSetFromOptions(), MatXXXXSetPreallocation() paradigm. I thought that I should use the MatXAIJSetPreallocation() routine since the code may be run with a SeqAIJ or MPIAIJ matrix but I do not understand all of the inputs required for the MatXAIJSetPreallocation routine. In particular, the dnnzu and onnzu variables don't quite make sense to me. Can these be NULL? I was basically just hoping for a routine that would preallocate for either a sequential or parallel matrix depending on what was given at runtime. This routine seems to be what I want but I don't understand it very well and the documentation hasn't helped me to figure it out.</div></div></blockquote><div><br></div><div>The example for this is here</div><div><br></div><div> <a href="https://petsc.org/main/docs/manualpages/Mat/MatMPIAIJSetPreallocation.html#MatMPIAIJSetPreallocation">https://petsc.org/main/docs/manualpages/Mat/MatMPIAIJSetPreallocation.html#MatMPIAIJSetPreallocation</a></div><div><br></div><div>Maybe we should copy it to the XAIJ page as well. Does this help explain the arguments?</div><div> </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"><div>A related followup question: Is it good practice to use this function or should I just use the other routines like MatSeqAIJSetPreallocation() and MatMPIAIJSetPreallocation()? </div><div><br></div><div>And finally my last question: if I were to use the MatSeqAIJSetPreallocation()/MatMPIAIJSetPreallocation() routines for preallocating memory, is it common to just call MatGetType() then call the appropriate routine depending on whether or not the matrix is parallel or not? I ask because when I have tested these routines out, it seems that MatSeqAIJSetPreallocation() works even for parallel matrices which is a bit confusing. I'm assuming that it just sets the diagonal part of the matrix?</div></div></blockquote><div><br></div><div>No, it definitely will not preallocate in parallel, so something else is happening.</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:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div>I hope that my questions were clear. Let me know if they need clarification and thanks in advance for the help!</div><div><br></div><div>Sam</div></div>
</blockquote></div><br clear="all"><div><br></div>-- <br><div dir="ltr" class="gmail_signature"><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>