<div class="gmail_quote">On Mon, Nov 8, 2010 at 13:07, Daniel Langr <span dir="ltr">&lt;<a href="mailto:daniel.langr@gmail.com">daniel.langr@gmail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<div id=":4ac">Ok, that&#39;s a good idea and I will try it. I can estimate total number of nonzeros (limited by the amount of memory), but I can hardly estimate number of nonzeros per particular rows (d_nnz, o_nnz). So I need to use d_nz and o_nz, right? And for symmetric matrix, what do d_nz and o_nz mean? Is it number of nonzeros for whole matrix row, or just upper triangular part? (I don&#39;t see this in manual page.)<br>
</div></blockquote><div><br></div><div>It is only for the upper triangular part.  If you have no way to guess the number per row, then just set {d,o}_nz, but note that this is pessimistic because the last rows of the matrix necessarily have fewer nonzeros in the upper triangular part.</div>
<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;"><div id=":4ac">
(That was my point, through MatMPISBAIJSetPreallocation I need to estimate number of nonzeros per row. Not just number of nonzeros of whole local part. If I construct CSR arrays directly, I don&#39;t need this row-estimates.)</div>
</blockquote></div><br><div>Here&#39;s a little secret: if you assemble the matrix row-by-row, in-order, then you need only estimate the average number of nonzeros per row.  The implementation is not stupid, so early rows can blow over their initial estimates as long as later rows make up for it by being under the estimate.  For example, with a 5-point Laplacian, you can MatSeqSBAIJSetPreallocation(A,1,3,PETSC_NULL) and you will see something like</div>
<div><br></div><div><div>Matrix Object:</div><div>  type: seqsbaij</div><div>  rows=400, cols=400</div><div>  total: nonzeros=1160, allocated nonzeros=1200</div><div>  total number of mallocs used during MatSetValues calls =0</div>
<div>      block size is 1</div></div><div><br></div><div>So no mallocs even though the early rows have more than 3 nonzeros in the upper triangular part.  If you assemble out-of-order, or in a scattered fashion (such as for a finite element method) then this will be costly.  Does this help?</div>
<div><br></div><div>Jed</div>