[petsc-users] MatMPIAIJSetPreallocation: "nnz cannot be greater than row length"

Dmitry Karpeyev karpeev at mcs.anl.gov
Mon Feb 23 09:08:07 CST 2015


David,

What code are you running when you encounter this error?  I'm trying to
reproduce it and
I tried examples/systems_of_equations/ex8, but it ran for me, ostensibly to
completion.

I have a small PETSc pull request that implements MatReset(), which passes
a small PETSc test,
but libMesh needs some work to be able to build against petsc/master
because of some recent
changes to PETSc.

Dmitry.

On Mon Feb 23 2015 at 7:17:06 AM David Knezevic <david.knezevic at akselos.com>
wrote:

> Hi Barry, hi Dmitry,
>
> I set the matrix to BAIJ and back to AIJ, and the code got a bit further.
> But I now run into the error pasted below (Note that I'm now using
> "--with-debugging=1"):
>
> PETSC ERROR: --------------------- Error Message
> --------------------------------------------------------------
> PETSC ERROR: Petsc has generated inconsistent data
> PETSC ERROR: MPIAIJ Matrix was assembled but is missing garray
> PETSC ERROR: See http://www.mcs.anl.gov/petsc/documentation/faq.html for
> trouble shooting.
> PETSC ERROR: Petsc Release Version 3.5.2, Sep, 08, 2014
> PETSC ERROR: ./example-dbg on a arch-linux2-c-debug named david-Lenovo by
> dknez Mon Feb 23 08:05:44 2015
> PETSC ERROR: Configure options --with-shared-libraries=1
> --with-debugging=1 --download-suitesparse=1 --download-parmetis=1
> --download-blacs=1 --download-scalapack=1 --download-mumps=1
> --download-metis --download-superlu_dist
> --prefix=/home/dknez/software/libmesh_install/dbg_real/petsc
> --download-hypre
> PETSC ERROR: #1 MatCreateColmap_MPIAIJ_Private() line 361 in
> /home/dknez/software/petsc-3.5.2/src/mat/impls/aij/mpi/mpiaij.c
> PETSC ERROR: #2 MatSetValues_MPIAIJ() line 538 in
> /home/dknez/software/petsc-3.5.2/src/mat/impls/aij/mpi/mpiaij.c
> PETSC ERROR: #3 MatSetValues() line 1136 in
> /home/dknez/software/petsc-3.5.2/src/mat/interface/matrix.c
> PETSC ERROR: #4 add_matrix() line 765 in
> /home/dknez/software/libmesh-src/src/numerics/petsc_matrix.C
> --------------------------------------------------------------------------
>
> This occurs when I try to set some entries of the matrix. Do you have any
> suggestions on how I can resolve this?
>
> Thanks!
> David
>
>
>
>
> On Sun, Feb 22, 2015 at 10:22 PM, Dmitry Karpeyev <dkarpeev at gmail.com>
> wrote:
>
>>
>>
>> On Sun Feb 22 2015 at 9:15:22 PM Barry Smith <bsmith at mcs.anl.gov> wrote:
>>
>>>
>>> > On Feb 22, 2015, at 9:09 PM, David Knezevic <
>>> david.knezevic at akselos.com> wrote:
>>> >
>>> > Hi Dmitry,
>>> >
>>> > Thanks for the suggestion. I tried MatSetType(mat,MATMPIAIJ) followed
>>> by MatXAIJSetPreallocation(...), but unfortunately this still gives me the
>>> same error as before: "nnz cannot be greater than row length: local row 168
>>> value 24 rowlength 0".
>>> >
>>> > I gather that the idea here is that MatSetType builds a new matrix
>>> object, and then I should be able to pre-allocate for that new matrix
>>> however I like, right? Was I supposed to clear the matrix object somehow
>>> before calling MatSetType? (I didn't do any sort of clear operation.)
>>>
>>>   If the type doesn't change then MatSetType() won't do anything. You
>>> can try setting the type to BAIJ and then setting the type back to AIJ.
>>> This may/should clear out the matrix.
>>>
>> Ah, yes.  If the type is the same as before it does quit early, but
>> changing the type and then back will clear out and rebuild the matrix.   We
>> need
>> something like MatReset() to do the equivalent thing.
>>
>>>
>>> >
>>> > As I said earlier, I'll make a dbg PETSc build, so hopefully that will
>>> help shed some light on what's going wrong for me.
>>>
>> I think it's always a good idea to have a dbg build of PETSc when you
>> doing things like these.
>>
>> Dmitry.
>>
>>>
>>>    Don't bother, what I suggested won't work.
>>>
>>>   Barry
>>>
>>>
>>> >
>>> > Thanks,
>>> > David
>>> >
>>> >
>>> >
>>> >
>>> > On Sun, Feb 22, 2015 at 6:02 PM, Dmitry Karpeyev <dkarpeev at gmail.com>
>>> wrote:
>>> > David,
>>> > It might be easier to just rebuild the whole matrix from scratch: you
>>> would in effect be doing all that with disassembling and resetting the
>>> preallocation.
>>> > MatSetType(mat,MATMPIAIJ)
>>> > or
>>> > PetscObjectGetType((PetscObject)mat,&type);
>>> > MatSetType(mat,type);
>>> > followed by
>>> > MatXAIJSetPreallocation(...);
>>> > should do.
>>> > Dmitry.
>>> >
>>> >
>>> > On Sun Feb 22 2015 at 4:45:46 PM Barry Smith <bsmith at mcs.anl.gov>
>>> wrote:
>>> >
>>> >  Do not call for SeqAIJ matrix. Do not call before the first time you
>>> have preallocated and put entries in the matrix and done the
>>> MatAssemblyBegin/End()
>>> >
>>> >   If it still crashes you'll need to try the debugger
>>> >
>>> >   Barry
>>> >
>>> > > On Feb 22, 2015, at 4:09 PM, David Knezevic <
>>> david.knezevic at akselos.com> wrote:
>>> > >
>>> > > Hi Barry,
>>> > >
>>> > > Thanks for your help, much appreciated.
>>> > >
>>> > > I added a prototype for MatDisAssemble_MPIAIJ:
>>> > > PETSC_INTERN PetscErrorCode MatDisAssemble_MPIAIJ(Mat);
>>> > >
>>> > > and I added a call to MatDisAssemble_MPIAIJ before
>>> MatMPIAIJSetPreallocation. However, I get a segfault on the call to
>>> MatDisAssemble_MPIAIJ. The segfault occurs in both serial and parallel.
>>> > >
>>> > > FYI, I'm using Petsc 3.5.2, and I'm not using a non-debug build
>>> (though I could rebuild PETSc in debug mode if you think that would help
>>> figure out what's happening here).
>>> > >
>>> > > Thanks,
>>> > > David
>>> > >
>>> > >
>>> > >
>>> > > On Sun, Feb 22, 2015 at 1:13 PM, Barry Smith <bsmith at mcs.anl.gov>
>>> wrote:
>>> > >
>>> > >   David,
>>> > >
>>> > >    This is an obscure little feature of MatMPIAIJ,   each time you
>>> change the sparsity pattern before you call the MatMPIAIJSetPreallocation
>>> you need to call  MatDisAssemble_MPIAIJ(Mat mat).    This is a private
>>> PETSc function so you need to provide your own prototype for it above the
>>> function you use it in.
>>> > >
>>> > >   Let us know if this resolves the problem.
>>> > >
>>> > >    Barry
>>> > >
>>> > > We never really intended that people would call
>>> MatMPIAIJSetPreallocation() AFTER they had already used the matrix.
>>> > >
>>> > >
>>> > > > On Feb 22, 2015, at 6:50 AM, David Knezevic <
>>> david.knezevic at akselos.com> wrote:
>>> > > >
>>> > > > Hi all,
>>> > > >
>>> > > > I've implemented a solver for a contact problem using SNES. The
>>> sparsity pattern of the jacobian matrix needs to change at each nonlinear
>>> iteration (because the elements which are in contact can change), so I
>>> tried to deal with this by calling MatSeqAIJSetPreallocation and
>>> MatMPIAIJSetPreallocation during each iteration in order to update the
>>> preallocation.
>>> > > >
>>> > > > This seems to work fine in serial, but with two or more MPI
>>> processes I run into the error "nnz cannot be greater than row length",
>>> e.g.:
>>> > > > nnz cannot be greater than row length: local row 528 value 12
>>> rowlength 0
>>> > > >
>>> > > > This error is from the call to
>>> > > > MatSeqAIJSetPreallocation(b->B,o_nz,o_nnz); in
>>> MatMPIAIJSetPreallocation_MPIAIJ.
>>> > > >
>>> > > > Any guidance on what the problem might be would be most
>>> appreciated. For example, I was wondering if there is a problem with
>>> calling SetPreallocation on a matrix that has already been preallocated?
>>> > > >
>>> > > > Some notes:
>>> > > > - I'm using PETSc via libMesh
>>> > > > - The code that triggers this issue is available as a PR on the
>>> libMesh github repo, in case anyone is interested:
>>> https://github.com/libMesh/libmesh/pull/460/
>>> > > > - I can try to make a minimal pure-PETSc example that reproduces
>>> this error, if that would be helpful.
>>> > > >
>>> > > > Many thanks,
>>> > > > David
>>> > > >
>>> > >
>>> > >
>>> >
>>> >
>>>
>>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20150223/8ddf4c66/attachment-0001.html>


More information about the petsc-users mailing list