Please always keep the list in copy. > On 13 Jun 2025, at 11:55 AM, SCOTTO Alexandre > <alexandre.sco...@irt-saintexupery.com> wrote: > > Hello Pierre, > > Thank you for you answer. > > I think I see the subtlety here, and it makes realized that I have not > properly understood yet how index sets should be manipulated, in particular > whether the provided indices are local or global. > > It seems that this code solves my issue: > > index_set_1 = PETSc.IS().createStride( > vec_1.local_size, first=vec_1.owner_range[0], step=1 > ) > index_set_2 = PETSc.IS().createStride( > vec_2.local_size, first=vec_2.owner_range[0], step=1 > ) > > scatter = PETSc.Scatter().create(vec_1, index_set_1, vec_2, index_set_2) > scatter.scatter(vec_1, vec_2, addv=True) > > Do you think that this is a decent manner of transfering the whole content of > a vector to another of same dimension? > > I have a lot of this scattering to perform so if you have a better > recommendation I would be pleased.
The “scattering” you are defining and using is basically a VecAXPY(), so using a scatter for such an operation is definitely _not_ the way to go. Thanks, Pierre > Best regards, > Alexandre. > > > De : Pierre Jolivet <pie...@joliv.et> > Envoyé : vendredi 13 juin 2025 11:43 > À : SCOTTO Alexandre <alexandre.sco...@irt-saintexupery.com> > Cc : petsc-users@mcs.anl.gov > Objet : Re: [petsc-users] Insertion mode for Scatter > > > > > On 13 Jun 2025, at 11:32 AM, SCOTTO Alexandre via petsc-users > <petsc-users@mcs.anl.gov <mailto:petsc-users@mcs.anl.gov>> wrote: > > Dear PETSc community, > > I am currently struggling with the ADD_VALUE mode of the Scatter object. Here > is a simple piece of (Python) code to illustrate the issue: > > vec_1 = PETSc.Vec().createMPI(size=10) > vec_1.shift(2.0) > > vec_2 = PETSc.Vec().createMPI(size=10) > vec_2.shift(1.0) > > index_set = PETSc.IS().createStride(10, step=1) > > scatter = PETSc.Scatter().create(vec_1, index_set, vec_2, index_set) > scatter.scatter(vec_1, vec_2, addv=True) > > Vectors vec_1 and vec_2 are respectively filled-in with 2.0 and 1.0. After > the scattering, I would expect to have in vec_2 the sum of the values > initially in vec_2 (that is 1.0) plus the values coming from vec_1 (that is > 2.0). > > But instead of having vec_2 filled in with 3.0 it is filled-in with 9.0. My > understanding is that the number of processes (here 4 processes) plays a role > since 9.0 = 1.0 (initial value) + 2.0 (values coming from vec_1) x 4 (number > of processes). > > Is there a way to have simply 3.0 as a result? > > With the index_set you are supplying, you are basically saying that each > process should scatter the complete vector (not just its local portion). > If you use an index_set which does not induce communication (e.g., of size > the local size of the Vec and with the same start as the first local row of > the Vec), then you’ll get 3.0 as a result. > > Thanks, > Pierre > > > Hoping to have been clear enough, best regards, > Alexandre.