Hello Pierre,

My example is indeed not very relevant for scattering, but in practice I have 
vectors of same global size but distributed differently over the processes, and 
I need to transfer the whole data from one vector to the other.

In this case, I think that the solution below may be reasonably efficient.

Regards,
Alexandre.


De : Pierre Jolivet <pie...@joliv.et>
Envoyé : vendredi 13 juin 2025 11:59
À : SCOTTO Alexandre <alexandre.sco...@irt-saintexupery.com>
Cc : petsc-users@mcs.anl.gov
Objet : Re: [petsc-users] Insertion mode for Scatter

Please always keep the list in copy.


On 13 Jun 2025, at 11:55 AM, SCOTTO Alexandre 
<alexandre.sco...@irt-saintexupery.com<mailto: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<mailto:pie...@joliv.et>>
Envoyé : vendredi 13 juin 2025 11:43
À : SCOTTO Alexandre 
<alexandre.sco...@irt-saintexupery.com<mailto:alexandre.sco...@irt-saintexupery.com>>
Cc : petsc-users@mcs.anl.gov<mailto: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.

Reply via email to