Hmm... this has not been my experience. &nbsp;When A is not square I&#39;m finding the that the diagonal portion is also not square. &nbsp;Instead it assigns columns to the diagonal portion by evenly distributing the columns among processors. &nbsp;For example, a 4 by 8 would look like:<br>
<br>(please excuse the embedded HTML, I need it to specify a fixed-width font)<br>&nbsp;&nbsp; <br><span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><font face="courier new,monospace">c0&nbsp; c1&nbsp; c2&nbsp; c3&nbsp; c4&nbsp; c5&nbsp; c6&nbsp; c7</font><br>
<font face="courier new,monospace">p0 r0&nbsp; X&nbsp;&nbsp; X&nbsp;&nbsp; X&nbsp;&nbsp; X<br>p0 r1&nbsp; X&nbsp;&nbsp; X&nbsp;&nbsp; X&nbsp;&nbsp; X<br>p1 r2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; X&nbsp;&nbsp; X&nbsp;&nbsp; X&nbsp;&nbsp; X<br>p1 r3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; X&nbsp;&nbsp; X&nbsp;&nbsp; X&nbsp;&nbsp; X<br></font><br><br><font face="arial,sans-serif">X marks the diagonal portions for each processor.&nbsp; I have attempted to verify this using the program below.&nbsp; If you run this code it will complain that processor 1 must allocate new memory for &quot;(0, 3)&quot; (which I am interpreting to mean the local (0, 3), otherwise known as (2, 3)).&nbsp; Further more you can stop the complaint by incrementing the off-diagonal preallocation, and decrementing the diagonal preallocation.&nbsp; Note, that specifying 0 is some special value that isn&#39;t 0. If you specify 0 you won&#39;t get any malloc errors.<br>
</font><br>Mat A;<br>int rows = 4;<br>int cols = 8;<br><br>if (mpi_rank() == 0)<br>{<br>&nbsp;&nbsp;&nbsp; MatCreateMPIAIJ(PETSC_COMM_WORLD, PETSC_DECIDE, PETSC_DECIDE, rows, cols,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2, PETSC_NULL, 1, PETSC_NULL, &amp;A);<br>
&nbsp;&nbsp;&nbsp; MatSetOption(A, MAT_NEW_NONZERO_ALLOCATION_ERR);<br><br>&nbsp;&nbsp;&nbsp; static const int R = 2;<br>&nbsp;&nbsp;&nbsp; int set_rows[R] = {0, 1};<br>&nbsp;&nbsp;&nbsp; static const int C = 2;<br>&nbsp;&nbsp;&nbsp; int set_cols[C] = {0, 1};<br>&nbsp;&nbsp;&nbsp; double vals[C*R] = {1., 1., 1., 1.};<br>
&nbsp;&nbsp;&nbsp; MatSetValues(A, R, set_rows, C, set_cols, vals, ADD_VALUES);<br>}<br>else<br>{<br>&nbsp;&nbsp;&nbsp; MatCreateMPIAIJ(PETSC_COMM_WORLD, PETSC_DECIDE, PETSC_DECIDE,rows, cols,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2, PETSC_NULL, 1, PETSC_NULL, &amp;A);<br>
&nbsp;&nbsp;&nbsp; MatSetOption(A, MAT_NEW_NONZERO_ALLOCATION_ERR);<br><br>&nbsp;&nbsp;&nbsp; static const int R = 2;<br>&nbsp;&nbsp;&nbsp; int set_rows[R] = {2,3};<br>&nbsp;&nbsp;&nbsp; static const int C = 2;<br>&nbsp;&nbsp;&nbsp; int set_cols[C] = {2,3};<br>&nbsp;&nbsp;&nbsp; double vals[C*R] = {1., 1., 1., 1.};<br>
&nbsp;&nbsp;&nbsp; MatSetValues(A, R, set_rows, C, set_cols, vals, ADD_VALUES);<br>}<br><br>MatAssemblyBegin(A, MAT_FINAL_ASSEMBLY);<br>MatAssemblyEnd(A, MAT_FINAL_ASSEMBLY);<br><br>On Wed, Jul 2, 2008 at 6:35 AM, Matthew Knepley &lt;<a href="mailto:knepley@gmail.com">knepley@gmail.com</a>&gt; wrote:<br>
&gt; By definition, the diagonal portion is square. Thus you retrieve the<br>&gt; local rows [start, end), and then the diagonal block is<br>&gt;<br>&gt; &nbsp;[start, end) x [start, end)<br>&gt;<br>&gt; which you can do with<br>
&gt;<br>&gt; <a href="http://www-unix.mcs.anl.gov/petsc/petsc-as/snapshots/petsc-current/docs/manualpages/Mat/MatGetOwnershipRange.html">http://www-unix.mcs.anl.gov/petsc/petsc-as/snapshots/petsc-current/docs/manualpages/Mat/MatGetOwnershipRange.html</a><br>
&gt;<br>&gt; &nbsp; Matt<br>&gt;<br>&gt; On Wed, Jul 2, 2008 at 2:52 AM, Andrew Colombi &lt;<a href="mailto:acolombi@gmail.com">acolombi@gmail.com</a>&gt; wrote:<br>&gt;&gt; I&#39;m letting PETSC_DECIDE how to distribute the rows and columns of my<br>
&gt;&gt; non-square matrix, and I want to retrieve the columns it&#39;s decided to<br>&gt;&gt; make the &quot;Diagonal&quot; for a particular process. &nbsp;How can I do that? &nbsp;I&#39;m<br>&gt;&gt; probably missing something obvious here, but I checked the docs.<br>
&gt;&gt;<br>&gt;&gt; In case some context helps (or inspires a work-around):<br>&gt;&gt;<br>&gt;&gt; I want this information to count the number of d_nnz and o_nnz to<br>&gt;&gt; preallocate perfectly. &nbsp;This shouldn&#39;t be hard to do, but I need to<br>
&gt;&gt; know the boundary between off-diagonal and diagonal to do it.<br>&gt;&gt;<br>&gt;&gt; Thanks,<br>&gt;&gt; -Andrew<br>&gt;&gt;<br>&gt;&gt;<br>&gt;<br>&gt;<br>&gt;<br>&gt; --<br>&gt; What most experimenters take for granted before they begin their<br>
&gt; experiments is infinitely more interesting than any results to which<br>&gt; their experiments lead.<br>&gt; -- Norbert Wiener<br>&gt;<br>&gt;<br><br>