<html>
  <head>

    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  </head>
  <body>
    <p>Dear Petsc list,</p>
    <p>I have a question regarding reverse vec-scatters:</p>
    <p>I have a shared memory solver that I want to use on a distributed
      DMDA and average its results.</p>
    <p>The shared mem solver needs some of the global state.</p>
    <p>So I want to create a full copy of a global vec on each master
      rank of a machine, compute some result</p>
    <p>and average the results back into the global vec.<br>
    </p>
    <p><br>
    </p>
    <p>For example: the parallel layout for a global vector is<br>
    </p>
    <p>3 ranks in comm_world, each with Ndof = 6, so global size is 18<br>
    </p>
    <p>Then I create a mpi sub communicator with MPI_COMM_TYPE_SHARED</p>
    <p>Then I create a local vec on each rank, with sizes 9 on each
      rank_0 on the sub comm, size 0 otherwise</p>
    <p>      if ( sub_id == 0 ) then<br>
              call VecGetSize(gvec, Nlocal, ierr); call CHKERR(ierr)<br>
            else<br>
              Nlocal = 0<br>
            endif<br>
            call VecCreateSeq(PETSC_COMM_SELF, Nlocal, lvec, ierr)<br>
      <br>
    </p>
    <p>This yields for example (first 2 ranks in a shared mem subcomm,
      3rd rank on another machine):</p>
    <p>Global rank_id  |   sub_rank_id   |   local_size_gvec | 
      local_size_lvec<br>
    </p>
    <p>0                       |  0                    |  
      6                        | 18<br>
    </p>
    <p>1                       |  1                    |  
      6                        | 0</p>
    <p>2                       |  0                    |  
      6                        | 18<br>
    </p>
    <p><br>
    </p>
    <p>To copy the global vec on each shared mem master, I do:</p>
    <p>ISCreateStride(PETSC_COMM_SELF, Nlocal, 0, 1, is, ierr)</p>
    <p>VecScatterCreate(gvec, is, lvec, is, ctx, ierr)</p>
    <p>VecScatterBegin(ctx, gvec, lvec, INSERT_VALUES, SCATTER_FORWARD,
      ierr)</p>
    <p>VecScatterEnd  (ctx, gvec, lvec, INSERT_VALUES, SCATTER_FORWARD,
      ierr)</p>
    <p><br>
    </p>
    <p>That works fine.</p>
    <p>Then I want to do the reverse, i.e. add all values from the local
      vec to the global vec on comm_world to generate the average of the
      results.</p>
    <p>I tried:</p>
    <p>VecSet(gvec, zero, ierr)</p>
    <p>VecScatterBegin(ctx, gvec, lvec, ADD_VALUES, SCATTER_REVERSE,
      ierr)</p>
    <p><br>
    </p>
    <p>I was hoping to get the sum of svec in the global vec, so that
      gvec / comm_size(sub_comm_id==0) gives the mean.</p>
    <p>However, I get the following error:</p>
    <p><br>
    </p>
    <p>Nonconforming object sizes</p>
    <p>Vector wrong size 18 for scatter 6 (scatter reverse and vector to
      != ctx from size)</p>
    <p><br>
    </p>
    <p>Going with the same approach with <a
href="https://www.mcs.anl.gov/petsc/petsc-current/docs/manualpages/Vec/VecScatterCreateToAll.html#VecScatterCreateToAll">VecScatterCreateToAll</a>
      leads to the same issue.<br>
    </p>
    <p>Do you have suggestions on how I could/should achieve it?</p>
    <p><br>
    </p>
    <p>Many thanks!</p>
    <p>Fabian<br>
    </p>
  </body>
</html>