The place where the problem is quite deep in a large code, I will try to 
isolate the problematic behaviour but this may take some time.

@Matthew, is there a way in the Python API to check whether a vector is 
assembled?

Regards,
Alexandre.

De : Matthew Knepley <knep...@gmail.com>
Envoyé : mardi 15 juillet 2025 16:06
À : Jose E. Roman <jro...@dsic.upv.es>
Cc : SCOTTO Alexandre <alexandre.sco...@irt-saintexupery.com>; 
petsc-users@mcs.anl.gov
Objet : Re: [petsc-users] When to perform PETSc.Vec assembly with petsc4py

We check that the x argument is assembled in MatMultTranspose(), but not y. It 
seems possible that y could have stashed values that get communicated when the 
operation is performed. Why do we not check that y is assembled?

  Thanks,

     Matt

On Tue, Jul 15, 2025 at 9:36 AM Jose E. Roman 
<jro...@dsic.upv.es<mailto:jro...@dsic.upv.es>> wrote:
It is better if you can provide a full python script that we can run to 
reproduce the problem.

Jose


> El 15 jul 2025, a las 14:49, SCOTTO Alexandre 
> <alexandre.sco...@irt-saintexupery.com<mailto:alexandre.sco...@irt-saintexupery.com>>
>  escribió:
>
> Ok I get it, Vec.assemble() is mandatory whenever MPI communications are 
> required to get the values to appropriate processes.
>  To provide more information, I am in a situation where I perform a 
> A.multTranspose(x, y), where y is a vector that has been filled in with 
> values earlier in the process. At this stage, I no longer care of these 
> values and I expect the multTranspose() to override the values. But what I 
> get is:
> ·         if I do y.assemble() before the transpose multiplication, then y is 
> filled-in with the correct result.
> ·         if I do not perform y.assemble() before the transpose 
> multiplication, I actually get y = y + A^T(x), i.e. a result rather of the 
> form multTransposeAdd().
> ·         If I do A.multTranspose(x, y) twice, then I get the correct result 
> y = A^T(x).
>  This makes me think that I am misusing something at some points, but it is 
> not clear what. If someone has a hint to explain this behaviour that would 
> help me better understand how to properly use PETSc!
>  Regards,
> Alexandre.
>  De : Matthew Knepley <knep...@gmail.com<mailto:knep...@gmail.com>>
> Envoyé : mardi 15 juillet 2025 14:18
> À : SCOTTO Alexandre 
> <alexandre.sco...@irt-saintexupery.com<mailto:alexandre.sco...@irt-saintexupery.com>>
> Cc : Jose E. Roman <jro...@dsic.upv.es<mailto:jro...@dsic.upv.es>>; 
> petsc-users@mcs.anl.gov<mailto:petsc-users@mcs.anl.gov>
> Objet : Re: [petsc-users] When to perform PETSc.Vec assembly with petsc4py
>  On Tue, Jul 15, 2025 at 8:13 AM SCOTTO Alexandre via petsc-users 
> <petsc-users@mcs.anl.gov<mailto:petsc-users@mcs.anl.gov>> wrote:
> Hello Jose,
>
> Thanks for your answer. Then it seems that I have under the hood usages of 
> setValues() in my code since I do not explicitly make use of it but still has 
> problems when not assembling my vector. Do I need to assemble vectors after 
> Mat.mult or Scatter.scatter?
>  No. The purpose of VecAsseblyBegin/End() is to move values from processes 
> that do not own them to the processes that do. PETSc does this automatically 
> for MatMult() and VecScatter routines because we know exactly where values 
> are headed. However, when users call VecSetValues(), they may set locations 
> that are owned by other processes. We could communicate these immediately, 
> but that might be expensive for a series of VecSetValues() calls, so we wait 
> until you call VecAssembly().
>  Note that direct assignment to the array can only set local values. This is 
> equivalent to VecGetArray().
>    Thanks,
>       Matt
>  By the way, I did not know that PETSc.Vec objects supported direct 
> assignments like x[i] = ..., so I rather use assignments of the form x.array 
> = ...
>
> From what I understand from the GitHub page 
> (https://urldefense.us/v3/__https://gitlab.com/petsc/petsc/-/blob/main/src/binding/petsc4py/src/petsc4py/PETSc/Vec.pyx__;!!G_uCfscf7eWS!f3M5SmfhSqew4tgfvFDjdLnd3q3kT_KzcCitJTJC0HRl1YvbSNBr5Uuzv6OWP1pVQBgbi_WJlekerylpGcBHQ9vsbzL1suFBQHkoPIwhdw$<https://urldefense.us/v3/__https:/gitlab.com/petsc/petsc/-/blob/main/src/binding/petsc4py/src/petsc4py/PETSc/Vec.pyx__;!!G_uCfscf7eWS!f3M5SmfhSqew4tgfvFDjdLnd3q3kT_KzcCitJTJC0HRl1YvbSNBr5Uuzv6OWP1pVQBgbi_WJlekerylpGcBHQ9vsbzL1suFBQHkoPIwhdw$>
>  ) it seems, that doing so, we only access the local portion of the array 
> which should not require any assemble() am I right?
>
> Best regards,
> Alexandre.
>
>
> -----Message d'origine-----
> De : Jose E. Roman <jro...@dsic.upv.es<mailto:jro...@dsic.upv.es>>
> Envoyé : mardi 15 juillet 2025 12:21
> À : 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] When to perform PETSc.Vec assembly with petsc4py
>
> Assembly is needed after a call to x.setValues() or any of its variants.
> https://urldefense.us/v3/__https://petsc.org/main/petsc4py/reference/petsc4py.PETSc.Vec.html*petsc4py.PETSc.Vec.setValue__;Iw!!G_uCfscf7eWS!f3M5SmfhSqew4tgfvFDjdLnd3q3kT_KzcCitJTJC0HRl1YvbSNBr5Uuzv6OWP1pVQBgbi_WJlekerylpGcBHQ9vsbzL1suFBQHlKEPOyQg$<https://urldefense.us/v3/__https:/petsc.org/main/petsc4py/reference/petsc4py.PETSc.Vec.html*petsc4py.PETSc.Vec.setValue__;Iw!!G_uCfscf7eWS!f3M5SmfhSqew4tgfvFDjdLnd3q3kT_KzcCitJTJC0HRl1YvbSNBr5Uuzv6OWP1pVQBgbi_WJlekerylpGcBHQ9vsbzL1suFBQHlKEPOyQg$>
> Take into account that in python the notation x[i] = ...  with call 
> x.setValues() under the hood.
>
> Jose
>
>
> > El 15 jul 2025, a las 12:02, SCOTTO Alexandre via petsc-users 
> > <petsc-users@mcs.anl.gov<mailto:petsc-users@mcs.anl.gov>> escribió:
> >
> > Dear PETSc community,
> >  As a beginner in the MPI world and with the PETSc library, I come with a 
> > possibly very naive question.
> > I know from the documentation that assembling vectors must be done, but it 
> > is not clear to me when to perform this operation.
> > Is there a simple way to know when a vector need be assembled and when it 
> > is not?
> >  Thanks in advance.
> > Regards,
> > Alexandre.
>  -- What most experimenters take for granted before they begin their 
> experiments is infinitely more interesting than any results to which their 
> experiments lead.
> -- Norbert Wiener
>  
> https://urldefense.us/v3/__https://www.cse.buffalo.edu/*knepley/__;fg!!G_uCfscf7eWS!aZJ9246pF8FAjBBUhSi39ow-huolRMdyysnIQMJe6Lilwvn7xVXxabH5JBy-S32vOZA5Sk4Ma_pBzo5D7Xg5VlPa-UrOinlcL1nselY1pw$
>  



--
What most experimenters take for granted before they begin their experiments is 
infinitely more interesting than any results to which their experiments lead.
-- Norbert Wiener

https://urldefense.us/v3/__https://www.cse.buffalo.edu/*knepley/__;fg!!G_uCfscf7eWS!aZJ9246pF8FAjBBUhSi39ow-huolRMdyysnIQMJe6Lilwvn7xVXxabH5JBy-S32vOZA5Sk4Ma_pBzo5D7Xg5VlPa-UrOinlcL1nselY1pw$
 
<https://urldefense.us/v3/__http://www.cse.buffalo.edu/*knepley/__;fg!!G_uCfscf7eWS!aZJ9246pF8FAjBBUhSi39ow-huolRMdyysnIQMJe6Lilwvn7xVXxabH5JBy-S32vOZA5Sk4Ma_pBzo5D7Xg5VlPa-UrOinlcL1l-T7g4GA$
 >

Reply via email to