<div dir="ltr"><div class="gmail_quote"><div dir="ltr">On Fri, Nov 23, 2018 at 9:54 AM Klaus Burkart via petsc-users <<a href="mailto:petsc-users@mcs.anl.gov">petsc-users@mcs.anl.gov</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div class="m_-7110991292413019384ydp337a5c99yahoo-style-wrap" style="font-family:Helvetica Neue,Helvetica,Arial,sans-serif;font-size:10px"><span>Hello,<br><br>I am trying to compute the local row ranges allocated to the processes i.e. rstart and rend of each process, needed as a  <span>prerequisite</span> for MatMPIAIJSetPreallocation using d_nnz and o_nnz.<br><br>I tried the following:<br><br>...<br><br>    PetscInitialize(0,0,PETSC_NULL,PETSC_NULL);<br><br>    MPI_Comm_size(PETSC_COMM_WORLD,&size);<br>    MPI_Comm_rank(PETSC_COMM_WORLD,&rank);<br><br>    MatCreate(PETSC_COMM_WORLD,&A);<br>    MatSetType(A,MATMPIAIJ);<br>    PetscInt local_size = PETSC_DECIDE;<br>    PetscSplitOwnership(PETSC_COMM_WORLD, &local_size, &N);<br>    MPI_Scan(&local_size, &rend, 1, MPIU_INT, MPI_SUM, PETSC_COMM_WORLD);<br></span></div></div></blockquote><div><br></div><div>This looks right to me. Not sure what your problem is. However, you can always use PetscLayout to do</div><div>this automatically.</div><div><br></div><div>  Thanks,</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"><div><div class="m_-7110991292413019384ydp337a5c99yahoo-style-wrap" style="font-family:Helvetica Neue,Helvetica,Arial,sans-serif;font-size:10px"><span>    rstart = rend - local_size;<br>    PetscInt d_nnz[local_size], o_nnz[local_size];<br>/*<br><br>compute d_nnz and o_nnz here<br><br>    MatMPIAIJSetPreallocation(A,0,d_nnz,0,o_nnz);<br>*/<br><br>    for (rank = 0; rank < size; rank++) {<br>    PetscPrintf(PETSC_COMM_WORLD,"local_size   =  %d, on process %d\n", local_size, rank);<br>    PetscPrintf(PETSC_COMM_WORLD,"rstart =  %d, on process %d\n", rstart, rank);<br>    PetscPrintf(PETSC_COMM_WORLD,"rend =  %d, on process %d\n", rend, rank);<br>    }<br><br>    PetscFinalize();<br><br>The local size is 25 rows on each process but rstart and rend are 0 and 25 on all processes, I expected 0 and 25, 25 and 50, 50 and 75 and 75 and 101. N = 100<br><br>I can't spot the error. Any ideas, what's the problem?<br><br>Klaus</span></div></div></blockquote></div><br clear="all"><div><br></div>-- <br><div dir="ltr" class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr"><div><div dir="ltr"><div><div dir="ltr"><div>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><br></div><div><a href="http://www.cse.buffalo.edu/~knepley/" target="_blank">https://www.cse.buffalo.edu/~knepley/</a><br></div></div></div></div></div></div></div></div>