<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Wed, Apr 6, 2016 at 10:12 AM, Florian Lindner <span dir="ltr"><<a href="mailto:mailinglists@xgm.de" target="_blank">mailinglists@xgm.de</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">Hello,<br>
<br>
in order to preallocate I have to know whether a non-zero will be in the local diagonal submatrix or not.<br>
<br>
<a href="http://www.mcs.anl.gov/petsc/petsc-current/docs/manualpages/Mat/MatMPIAIJSetPreallocation.html" rel="noreferrer" target="_blank">http://www.mcs.anl.gov/petsc/petsc-current/docs/manualpages/Mat/MatMPIAIJSetPreallocation.html</a><br>
<br>
says:<br>
<br>
The DIAGONAL portion of the local submatrix of a processor can be defined as the submatrix which is obtained by extraction the part corresponding to the rows r1-r2 and columns c1-c2 of the global matrix, where r1 is the first row that belongs to the processor, r2 is the last row belonging to the this processor, and c1-c2 is range of indices of the local part of a vector suitable for applying the matrix to. This is an mxn matrix. In the common case of a square matrix, the row and column ranges are the same and the DIAGONAL part is also square. The remaining portion of the local submatrix (mxN) constitute the OFF-DIAGONAL portion.<br>
<br>
Therefore I compute the begin and end rows and cols like that:<br>
<br>
  int ownerRangeBeginA = _matrixA.ownerRange().first;<br>
  int ownerRangeEndA = _matrixA.ownerRange().second;<br>
<br>
  // Uses: MatGetVecs(_matrixA.matrix, &vector, nullptr);<br>
  petsc::Vector diagTest{_matrixA, "test", petsc::Vector::RIGHT};<br>
<br>
  int localDiagColBegin = diagTest.ownerRange().first;<br>
  int localDiagColEnd = diagTest.ownerRange().second;<br>
<br>
  Debug("Local Submatrix Rows = " << ownerRangeBeginA << " / " << ownerRangeEndA <<<br>
        ", Local Submatrix Cols = " << localDiagColBegin << " / " << localDiagColEnd);<br>
<br>
<br>
It's a little bit tainted by my PETSc C++ helper function, but I think you get the code.<br>
<br>
Is there a way to do it more elegantly? Without instantiating a vector just for the purpose of gettings its owner range? And then testing a if an index is inside the local diagonal submatrix?<br></blockquote><div><br></div><div><a href="http://www.mcs.anl.gov/petsc/petsc-current/docs/manualpages/Mat/MatGetOwnershipRangesColumn.html">http://www.mcs.anl.gov/petsc/petsc-current/docs/manualpages/Mat/MatGetOwnershipRangesColumn.html</a><br></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-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
Thanks,<br>
Florian<br>
</blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature">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></div>