<div dir="ltr">Hi Barry, hi Dmitry,<div><br></div><div>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"):</div><div><br></div><div><div>PETSC ERROR: --------------------- Error Message --------------------------------------------------------------</div><div>PETSC ERROR: Petsc has generated inconsistent data</div><div>PETSC ERROR: MPIAIJ Matrix was assembled but is missing garray</div><div>PETSC ERROR: See <a href="http://www.mcs.anl.gov/petsc/documentation/faq.html">http://www.mcs.anl.gov/petsc/documentation/faq.html</a> for trouble shooting.</div><div>PETSC ERROR: Petsc Release Version 3.5.2, Sep, 08, 2014 </div><div>PETSC ERROR: ./example-dbg on a arch-linux2-c-debug named david-Lenovo by dknez Mon Feb 23 08:05:44 2015</div><div>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</div><div>PETSC ERROR: #1 MatCreateColmap_MPIAIJ_Private() line 361 in /home/dknez/software/petsc-3.5.2/src/mat/impls/aij/mpi/mpiaij.c</div><div>PETSC ERROR: #2 MatSetValues_MPIAIJ() line 538 in /home/dknez/software/petsc-3.5.2/src/mat/impls/aij/mpi/mpiaij.c</div><div>PETSC ERROR: #3 MatSetValues() line 1136 in /home/dknez/software/petsc-3.5.2/src/mat/interface/matrix.c</div><div>PETSC ERROR: #4 add_matrix() line 765 in /home/dknez/software/libmesh-src/src/numerics/petsc_matrix.C</div><div>--------------------------------------------------------------------------</div></div><div><br></div><div>This occurs when I try to set some entries of the matrix. Do you have any suggestions on how I can resolve this?</div><div><br></div><div>Thanks!</div><div>David</div><div><br></div><div><br></div><div><br></div><div><br></div><div>On Sun, Feb 22, 2015 at 10:22 PM, Dmitry Karpeyev <span dir="ltr"><<a href="mailto:dkarpeev@gmail.com" target="_blank">dkarpeev@gmail.com</a>></span> wrote:<br></div><div class="gmail_extra"><div class="gmail_quote"><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"><div dir="ltr"><br><br><div class="gmail_quote"><span class="">On Sun Feb 22 2015 at 9:15:22 PM Barry Smith <<a href="mailto:bsmith@mcs.anl.gov" target="_blank">bsmith@mcs.anl.gov</a>> 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"><br>
> On Feb 22, 2015, at 9:09 PM, David Knezevic <<a href="mailto:david.knezevic@akselos.com" target="_blank">david.knezevic@akselos.com</a>> wrote:<br>
><br>
> Hi Dmitry,<br>
><br>
> 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".<br>
><br>
> 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.)<br>
<br>
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.<br></blockquote></span><div>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 </div><div><span style="font-size:13.1999998092651px">something like MatReset() to do the equivalent thing. </span></div><span class=""><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">
<br>
><br>
> 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.<br></blockquote></span><div>I think it's always a good idea to have a dbg build of PETSc when you doing things like these. </div><span class=""><font color="#888888"><div><br></div><div>Dmitry. </div></font></span><div><div class="h5"><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">
<br>
Don't bother, what I suggested won't work.<br>
<br>
Barry<br>
<br>
<br>
><br>
> Thanks,<br>
> David<br>
><br>
><br>
><br>
><br>
> On Sun, Feb 22, 2015 at 6:02 PM, Dmitry Karpeyev <<a href="mailto:dkarpeev@gmail.com" target="_blank">dkarpeev@gmail.com</a>> wrote:<br>
> David,<br>
> 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.<br>
> MatSetType(mat,MATMPIAIJ)<br>
> or<br>
> PetscObjectGetType((<u></u>PetscObject)mat,&type);<br>
> MatSetType(mat,type);<br>
> followed by<br>
> MatXAIJSetPreallocation(...);<br>
> should do.<br>
> Dmitry.<br>
><br>
><br>
> On Sun Feb 22 2015 at 4:45:46 PM Barry Smith <<a href="mailto:bsmith@mcs.anl.gov" target="_blank">bsmith@mcs.anl.gov</a>> wrote:<br>
><br>
> 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()<br>
><br>
> If it still crashes you'll need to try the debugger<br>
><br>
> Barry<br>
><br>
> > On Feb 22, 2015, at 4:09 PM, David Knezevic <<a href="mailto:david.knezevic@akselos.com" target="_blank">david.knezevic@akselos.com</a>> wrote:<br>
> ><br>
> > Hi Barry,<br>
> ><br>
> > Thanks for your help, much appreciated.<br>
> ><br>
> > I added a prototype for MatDisAssemble_MPIAIJ:<br>
> > PETSC_INTERN PetscErrorCode MatDisAssemble_MPIAIJ(Mat);<br>
> ><br>
> > 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.<br>
> ><br>
> > 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).<br>
> ><br>
> > Thanks,<br>
> > David<br>
> ><br>
> ><br>
> ><br>
> > On Sun, Feb 22, 2015 at 1:13 PM, Barry Smith <<a href="mailto:bsmith@mcs.anl.gov" target="_blank">bsmith@mcs.anl.gov</a>> wrote:<br>
> ><br>
> > David,<br>
> ><br>
> > 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.<br>
> ><br>
> > Let us know if this resolves the problem.<br>
> ><br>
> > Barry<br>
> ><br>
> > We never really intended that people would call MatMPIAIJSetPreallocation() AFTER they had already used the matrix.<br>
> ><br>
> ><br>
> > > On Feb 22, 2015, at 6:50 AM, David Knezevic <<a href="mailto:david.knezevic@akselos.com" target="_blank">david.knezevic@akselos.com</a>> wrote:<br>
> > ><br>
> > > Hi all,<br>
> > ><br>
> > > 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.<br>
> > ><br>
> > > 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.:<br>
> > > nnz cannot be greater than row length: local row 528 value 12 rowlength 0<br>
> > ><br>
> > > This error is from the call to<br>
> > > MatSeqAIJSetPreallocation(b-><u></u>B,o_nz,o_nnz); in MatMPIAIJSetPreallocation_<u></u>MPIAIJ.<br>
> > ><br>
> > > 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?<br>
> > ><br>
> > > Some notes:<br>
> > > - I'm using PETSc via libMesh<br>
> > > - The code that triggers this issue is available as a PR on the libMesh github repo, in case anyone is interested: <a href="https://github.com/libMesh/libmesh/pull/460/" target="_blank">https://github.com/libMesh/<u></u>libmesh/pull/460/</a><br>
> > > - I can try to make a minimal pure-PETSc example that reproduces this error, if that would be helpful.<br>
> > ><br>
> > > Many thanks,<br>
> > > David<br>
> > ><br>
> ><br>
> ><br>
><br>
><br>
<br>
</blockquote></div></div></div></div>
</blockquote></div><br></div></div>