Thank you, that was very helpful. Please do let me know if I understood this 
right. Generally VecSetValues()+VecGhostUpdateBegin/End() is faster than 
VecGetArray()+assign_array()+VecRestoreArray()+VecGhostUpdateBegin/End(). Also 
both these operation would be equivalent.

Thank you
Irfan

----- Original Message -----
From: "Jed Brown" <[email protected]>
To: petsc-users at mcs.anl.gov
Sent: Thursday, April 2, 2009 2:16:09 PM GMT -05:00 US/Canada Eastern
Subject: Re: setting values in parallel vectors

On Thu 2009-04-02 12:54, Khan, Irfan wrote:
> Hello
> I have a question about setting values in parallel vectors. Which of the 
> following two options is more efficient or does it matter at all.
> 
> Using VecGhostGetLocalForm:
> 
>  - Obtain the local array form of global vector using VeGhostGetLocalForm() 
> and VecGetArray()
>  - Fill in the values 
>  - Use VecGhostRestoreLocalForm() and VecRestoreArray()
>  - Use VecGhostUpdateBegin() and VecGhostUpdateEnd()
> 
> Using VecSetValues:
> 
>  - Fill in the values of the values in the global parallel vector using 
> VecSetValues()
>  - Use VecAssemblyBegin() and VecAssemblyEnd()
> 
> 
> Please note that in both the cases the values being filled are local values 
> to the rank.

These choices are not equivalent.  Assuming you use

  VecGhostUpdateBegin(x,INSERT_VALUES,SCATTER_FORWARD);
  VecGhostUpdateEnd(x,INSERT_VALUES,SCATTER_FORWARD);

the ghosted values will be updated on every process.  In contrast
VecAssemblyBegin/End only updates the owner's copy, it knows nothing
about the ghost values.  If you are only setting owned values,
VecAssembly* does almost nothing, you will still have to update the
ghost values.  Note that if you only need owned values, you can call
VecGetArray on the global form instead of working with the local form.

Setting local values directly after VecGetArray (with or without the
local form) is faster, but it's irrelevant (VecSetValues is plenty
fast).

Jed

Reply via email to