<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Wed, Jan 15, 2014 at 2:28 PM, Barry Smith <span dir="ltr"><<a href="mailto:bsmith@mcs.anl.gov" target="_blank">bsmith@mcs.anl.gov</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><br>
  Hmm, sometimes you talk about MatMPIAIJSetPreallocation() and sometimes MatMPISBAIJSetPreallocation() which one is it?<br>
<br>
  If a process has zero rows that should not affect the nonew variable.<br>
<br>
   It is crucial the the SetPreallocation routines be called on ALL processes that share the matrix, even if they have zero rows, but it shouldn’t matter what the values are for a matrix with zero rows.<br>
<br>
   Can you send use your test case so we can track down the problem?</blockquote><div><br></div><div>I sent a mail to petsc-dev explaining the problem.</div><div><br></div><div>   Matt</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<span class="HOEnZb"><font color="#888888"><br>
    Barry<br>
</font></span><div class="HOEnZb"><div class="h5"><br>
<br>
<br>
On Jan 15, 2014, at 5:57 AM, Projet_TRIOU <<a href="mailto:triou@cea.fr">triou@cea.fr</a>> wrote:<br>
<br>
> Hi all,<br>
><br>
> I switched from PETSc 3.3 to PETSc 3.4.3 and all was fine except for<br>
> one of my test case on 3 processors where one processor was<br>
> dealing an empty local part of the global matrix.<br>
><br>
> My code hangs just during the call at MatAssemblyEnd:<br>
><br>
> ierr = MatMPIAIJSetPreallocation(MatricePetsc, PETSC_DEFAULT, d_nnz.addr(), PETSC_DEFAULT, o_nnz.addr());<br>
> ...<br>
> ierr = MatAssemblyEnd(MatricePetsc, MAT_FINAL_ASSEMBLY);<br>
><br>
> When I debugged, I notice on the empty processor, that in<br>
> src/mat/impls/aij/mpi/mpiaij.c:<br>
><br>
>  if (!((Mat_SeqAIJ*)aij->B->data)->nonew) {<br>
>    ierr = MPI_Allreduce(&mat->was_assembled,&other_disassembled,1,MPIU_BOOL,MPI_PROD,PetscObjectComm((PetscObject)mat));CHKERRQ(ierr);<br>
>    if (mat->was_assembled && !other_disassembled) {<br>
>      ierr = MatDisAssemble_MPIAIJ(mat);CHKERRQ(ierr);<br>
>    }<br>
><br>
> ((Mat_SeqAIJ*)aij->B->data)->nonew was 0 on the "empty" processor<br>
> and -2 on the 2 others...<br>
><br>
> I bypassed my problem with a different call to MatMPIAIJSetPreallocation():<br>
><br>
>      if (nb_rows==0) // Local matrix is empty<br>
>         ierr = MatMPISBAIJSetPreallocation(MatricePetsc, block_size_, 0, NULL, 0, NULL);<br>
>      else<br>
>         ierr = MatMPISBAIJSetPreallocation(MatricePetsc, block_size_, PETSC_DEFAULT, d_nnz.addr(), PETSC_DEFAULT, o_nnz.addr());<br>
><br>
> Now, it runs well. So I don't know if it is a PETSc regression or if I was abusively<br>
> calling MatMPISBAIJSetPreallocation with d_nnz/o_nnz empty arrays....<br>
><br>
> Thanks,<br>
><br>
> Pierre<br>
><br>
<br>
</div></div></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></div>