[petsc-users] Problem with Preallocating
Florian Lindner
mailinglists at xgm.de
Wed Oct 29 08:00:17 CDT 2014
Hello,
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...
My code creates the matrix:
MatSetType(_matrixC.matrix, MATSBAIJ);
MatSetSizes(_matrixC.matrix, PETSC_DECIDE, PETSC_DECIDE, n, n);
MatSetOption(_matrixC.matrix, MAT_SYMMETRY_ETERNAL, PETSC_TRUE);
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:
for (int r = 0; r < n; r++) {
cout << "Preallocated row " << r << " with " << nnz[r] << " elements." << endl;
}
which results in the output:
Matrix Size = 9
Preallocated row 0 with 9 elements.
Preallocated row 1 with 8 elements.
Preallocated row 2 with 7 elements.
Preallocated row 3 with 6 elements.
Preallocated row 4 with 5 elements.
Preallocated row 5 with 4 elements.
Preallocated row 6 with 1 elements.
Preallocated row 7 with 1 elements.
Preallocated row 8 with 1 elements.
at least in rows 0 to 5 it's a dense upper triangular matrix (incl. main diagonal).
ierr = MatSeqSBAIJSetPreallocation(_matrixC.matrix, 1, PETSC_DEFAULT, nnz);
Now more or less the same loops as above with MatSetValues call for each row.
Since the KSPSolver requires that the diagonal is set, even if it's merely with zeros I do:
_matrixC.assemble(MAT_FLUSH_ASSEMBLY) // my helper function, but I'm sure you get the point ;-)
petsc::Vector zeros(_matrixC);
MatDiagonalSet(_matrixC.matrix, zeros.vector, ADD_VALUES);
ierr = MatAssemblyBegin(_matrixC.matrix, MAT_FINAL_ASSEMBLY); CHKERRV(ierr);
[ some more code ]
ierr = MatAssemblyEnd(_matrixC.matrix, MAT_FINAL_ASSEMBLY); CHKERRV(ierr);
But when I run the code I get an error message:
[0]PETSC ERROR: --------------------- Error Message --------------------------------------------------------------
[0]PETSC ERROR: Argument out of range
[0]PETSC ERROR: New nonzero at (0,0) caused a malloc
Use MatSetOption(A, MAT_NEW_NONZERO_ALLOCATION_ERR, PETSC_FALSE) to turn off this check
[0]PETSC ERROR: See http://www.mcs.anl.gov/petsc/documentation/faq.html for trouble shooting.
[0]PETSC ERROR: Petsc Release Version 3.5.2, unknown
[0]PETSC ERROR: ./petBench on a arch-linux2-c-debug named helium by lindnefn Wed Oct 29 13:48:49 2014
[0]PETSC ERROR: Configure options --with-debugging=1
[0]PETSC ERROR: #1 MatSetValues_SeqSBAIJ() line 977 in /data2/scratch/lindner/petsc/src/mat/impls/sbaij/seq/sbaij.c
[0]PETSC ERROR: #2 MatSetValues() line 1135 in /data2/scratch/lindner/petsc/src/mat/interface/matrix.c
[0]PETSC ERROR: #3 MatDiagonalSet_Default() line 203 in /data2/scratch/lindner/petsc/src/mat/utils/axpy.c
[0]PETSC ERROR: #4 MatDiagonalSet() line 241 in /data2/scratch/lindner/petsc/src/mat/utils/axpy.c
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?
Thanks once again....
Florian
More information about the petsc-users
mailing list