<div dir="ltr">Can you send a small example? This looks like it should work.<div><br></div><div>   Matt</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Oct 29, 2014 at 8:00 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:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hello,<br>
<br>
I try to preallocate a sparse matrix like it was recommended in another posting, but get an error which kind of surprises me. Somehow I think it might be related to the order of assembly calls...<br>
<br>
My code creates the matrix:<br>
<br>
  MatSetType(_matrixC.matrix, MATSBAIJ);<br>
  MatSetSizes(_matrixC.matrix, PETSC_DECIDE, PETSC_DECIDE, n, n);<br>
  MatSetOption(_matrixC.matrix, MAT_SYMMETRY_ETERNAL, PETSC_TRUE);<br>
<br>
Than I enter a loop to get the number of elements per row.  The entire code is a bit too long, but right before the SetPreallocaiton I do:<br>
<br>
  for (int r = 0; r < n; r++) {<br>
    cout << "Preallocated row " << r << " with " << nnz[r]  << " elements." << endl;<br>
  }<br>
<br>
which results in the output:<br>
<br>
Matrix Size = 9<br>
Preallocated row 0 with 9 elements.<br>
Preallocated row 1 with 8 elements.<br>
Preallocated row 2 with 7 elements.<br>
Preallocated row 3 with 6 elements.<br>
Preallocated row 4 with 5 elements.<br>
Preallocated row 5 with 4 elements.<br>
Preallocated row 6 with 1 elements.<br>
Preallocated row 7 with 1 elements.<br>
Preallocated row 8 with 1 elements.<br>
<br>
at least in rows 0 to 5 it's a dense upper triangular matrix (incl. main diagonal).<br>
<br>
  ierr = MatSeqSBAIJSetPreallocation(_matrixC.matrix, 1, PETSC_DEFAULT, nnz);<br>
<br>
Now more or less the same loops as above with MatSetValues call for each row.<br>
<br>
Since the KSPSolver requires that the diagonal is set, even if it's merely with zeros I do:<br>
<br>
  _matrixC.assemble(MAT_FLUSH_ASSEMBLY)  // my helper function, but I'm sure you get the point ;-)<br>
  petsc::Vector zeros(_matrixC);<br>
  MatDiagonalSet(_matrixC.matrix, zeros.vector, ADD_VALUES);<br>
  ierr = MatAssemblyBegin(_matrixC.matrix, MAT_FINAL_ASSEMBLY); CHKERRV(ierr);<br>
  [ some more code ]<br>
  ierr = MatAssemblyEnd(_matrixC.matrix, MAT_FINAL_ASSEMBLY); CHKERRV(ierr);<br>
<br>
But when I run the code I get an error message:<br>
<br>
[0]PETSC ERROR: --------------------- Error Message --------------------------------------------------------------<br>
[0]PETSC ERROR: Argument out of range<br>
[0]PETSC ERROR: New nonzero at (0,0) caused a malloc<br>
Use MatSetOption(A, MAT_NEW_NONZERO_ALLOCATION_ERR, PETSC_FALSE) to turn off this check<br>
[0]PETSC ERROR: See <a href="http://www.mcs.anl.gov/petsc/documentation/faq.html" target="_blank">http://www.mcs.anl.gov/petsc/documentation/faq.html</a> for trouble shooting.<br>
[0]PETSC ERROR: Petsc Release Version 3.5.2, unknown<br>
[0]PETSC ERROR: ./petBench on a arch-linux2-c-debug named helium by lindnefn Wed Oct 29 13:48:49 2014<br>
[0]PETSC ERROR: Configure options --with-debugging=1<br>
[0]PETSC ERROR: #1 MatSetValues_SeqSBAIJ() line 977 in /data2/scratch/lindner/petsc/src/mat/impls/sbaij/seq/sbaij.c<br>
[0]PETSC ERROR: #2 MatSetValues() line 1135 in /data2/scratch/lindner/petsc/src/mat/interface/matrix.c<br>
[0]PETSC ERROR: #3 MatDiagonalSet_Default() line 203 in /data2/scratch/lindner/petsc/src/mat/utils/axpy.c<br>
[0]PETSC ERROR: #4 MatDiagonalSet() line 241 in /data2/scratch/lindner/petsc/src/mat/utils/axpy.c<br>
<br>
I'm surprised that I get this error message since I do have preallocated 9 elements and I do not understand why inserting an element at (0, 0) could be a problem / needing a malloc. Has the preallocation got lost somewhere?<br>
<br>
Thanks once again....<br>
<span class="HOEnZb"><font color="#888888"><br>
Florian<br>
</font></span></blockquote></div><br><br clear="all"><div><br></div>-- <br>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>