On 6 June 2017 at 17:45, Franck Houssen <franck.hous...@inria.fr> wrote:
> How to VecScatter from global to local vector, and then, VecGather back ? > > This is a very simple use case: I need to split a global vector in local > (possibly overlapping) pieces, then I need to modify each local piece (x2), > and finally I need to assemble (+=) back local parts into a global vector. > Read the doc and went through examples... But still can't make this work: > can I get some help on this ? > > Your usage of VecScatter in the code is fine. The reason you don't get the expected result of (-2,-4,-2) is because your vector (globVec) contains a bunch of -1's prior to the gather operation. Just call VecZeroEntries(globVec); before the call to VecScatterBegin(scatCtx, locVec, globVec, ADD_VALUES, SCATTER_REVERSE); VecScatterEnd (scatCtx, locVec, globVec, ADD_VALUES, SCATTER_REVERSE); and you'll get the correct result. Thanks, Dave > Note: running petsc-3.7.6 on debian with gcc-6.3 > > Thanks, > > Franck > > ~> head -n 12 vecScatterGather.cpp > // How to VecScatter from global to local vector, and then, VecGather back > ? > // > // global vector: 3x1 2 overlapping local vector: > 2x1 global vector: 3x1 > // > // x2 > // |1 -> |2 > // |1 scatter |1 |2 > gather |2 > // |1 -> > -> |4 > // |1 |1 -> |2 > |2 > // |1 |2 > // > // ~> g++ -o vecScatterGather.exe vecScatterGather.cpp -lpetsc -lm; mpirun > -n 2 vecScatterGather.exe > > >