[petsc-users] difference between local and global vectors

TAY wee-beng zonexo at gmail.com
Wed Aug 19 03:20:01 CDT 2015


On 19/8/2015 1:17 PM, Dave May wrote:
>
>
> On 19 August 2015 at 03:38, TAY wee-beng <zonexo at gmail.com 
> <mailto:zonexo at gmail.com>> wrote:
>
>     Hi,
>
>     I am using DA. For e.g.
>
>     DM da_u
>
>     call
>     DMDACreate3d(MPI_COMM_WORLD,DM_BOUNDARY_NONE,DM_BOUNDARY_NONE,DM_BOUNDARY_NONE,DMDA_STENCIL_STAR,size_x,size_y,&
>
>     size_z,1,PETSC_DECIDE,PETSC_DECIDE,1,stencil_width,lx,PETSC_NULL_INTEGER,PETSC_NULL_INTEGER,da_u,ierr)
>
>     call DMCreateGlobalVector(da_u,u_global,ierr)
>
>     call DMCreateLocalVector(da_u,u_local,ierr)
>
>     To update the ghost values, I use:
>
>     call DMLocalToLocalBegin(da_u,u_local,INSERT_VALUES,u_local,ierr)
>
>     call DMLocalToLocalEnd(da_u,u_local,INSERT_VALUES,u_local,ierr)
>
>
>
> This is incorrect.
> The manpage for DMLocalToLocal clearly says "Maps from a local vector 
> (including ghost points that contain irrelevant values) to another 
> local vector where the ghost points in the second are set correctly."
> To update ghost values from a global vector (e.g. to perform the 
> scatter) you need to use DMGlobalToLocalBegin() , DMGlobalToLocalEnd().

Hi Dave,

Thanks for the clarification although I'm still confused. Supposed I 
have a 1D vector da_u, It has size 8, so it's like da_u_array(8), with 
stencil width 1

So for 2 procs,

there will be 2 da_u_array - da_u_array(1:5) and da_u_array(4:8)

After performing some operations on each procs's da_u_array, I need to 
update 1st procs's da_u_array(5) and 2nd procs's da_u_array(4) from the 
2nd and 1st procs respectively. I simply call:

call DMLocalToLocalBegin(da_u,u_local,INSERT_VALUES,u_local,ierr)

call DMLocalToLocalEnd(da_u,u_local,INSERT_VALUES,u_local,ierr)

and it seems to be enough. I check the ghost values and they have been 
updated. So if I am not using the linear solvers, I do not need the 
global vector,is that so?
>
>
>
>     It seems that I don't need to use global vector at all.
>
>     So what's the difference between local and global vector?
>
>
>
> * Local vectors contain ghost values from any neighbouring MPI 
> processes. They are always defined over PETSC_COMM_SELF.
> * Global vectors store the DOFs assigned to each sub-domain. These 
> will parallel vectors defined over the same communicator as your DM
>
> Thus, you use local vectors to compute things like the sub-domain 
> contribution to (i) a non-linear residual evaluation or (ii) a 
> sparse-matric vector product.
> You use global vectors together with linear and non-linear solvers as 
> these vectors.
>
> If your stencil width was zero (in your DMDACreate3d() function call), 
> then the would be no ghost values to communicate between neighbouring 
> MPI processes. Hence, the entries in the following two arrays 
> LA_u_local[], LA_u[] would be identical
>   VecGetArrayRead(u_local,&LA_u_local);
> and
>   VecGetArrayRead(u,&LA_u);
>
> That said, u_local would still be of type VECSEQ, where as u would be 
> of type VECMPI.
>
>
>
>     When will I need to use?:
>
>     call DMGlobalToLocalBegin(da_u,u_global,INSERT_VALUES,u_local,ierr)
>
>     call DMGlobalToLocalEnd(da_u,u_global,INSERT_VALUES,u_local,ierr)
>
>
> See points (i) and (ii) above from common use cases.
>
> Thanks,
>   Dave
>
>
>
>
>     -- 
>     Thank you
>
>     Yours sincerely,
>
>     TAY wee-beng
>
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20150819/f3099a8b/attachment.html>


More information about the petsc-users mailing list