Gideon Simpson <[email protected]> writes:

> I’ve got a simple problem where I use a DM to handle a representation of a 
> vector complex numbers, storing the real and imaginary components at each 
> lattice point. I also have ghost points at either end, i.e.:
>
> DMDACreate1d (PETSC_COMM_WORLD, DM_BOUNDARY_GHOSTED, N, 2 , 1 , NULL, &dm ) ;
>
> I have a few related questions:
>
> 1.  Is there a quick way to zero out the ghost points, other than to do 
>
> DMGetLocalVector(dm,&local);  
> DMGlobalToLocalBegin(dm,global,INSERT_VALUES,local);
> DMGlobalToLocalEnd(dm,global,INSERT_VALUES,local);
> DMDAVecGetArray(dm, local, &array);
> DMDAGetLocalInfo(dm, &info);
>   if(info.xs == 0){
>     array[-1].u =0.0;
>     array[-1].v =0.0;
>   }
>   if(info.xs + info.xm == info.mx){
>     array[info.mx].u =0.0;
>     array[info.mx].v =0.0;
>   }
> /* call restores after */

You can do it this way to make the loop independent of the number of
ghost points, though you likely have to do something different if you
have a different number of ghosts.  I.e., the simplification only works
for toy problems; for anything real you need to write the loops.

  for (i=info.gxs; i<0; i++) array[i] = 0;
  for (i=info.mx; i<info.gxs+info.gxm; i++) array[i] = 0;

You can also just VecZeroEntries(local) before the global-to-local.

> My point is, I don’t really need to interfere with any of the entries, just 
> the values in those two ghost points.
>
> 2.  If I take a dot product of two such vectors (associated with the dm, as 
> arrays of complex numbers in terms of real and imaginary parts), does the dot 
> product operate on the ghost points too, or just the “real” values?  

Local vectors are strictly local, and inner products of local vectors
rarely makes sense.  You probably want a global vector
(DMCreateGlobalVector), in which case the dot product is ... global.

> 3.  If I apply a VecCopy, VecAXPY, or any similar operation  to such vectors, 
> do they also operate on the ghost points?

"ghost points" aren't special in any way.  Local vectors are serial
vectors that contain ghost points.  Global vectors are parallel vectors
that don't have ghost points.

Attachment: signature.asc
Description: PGP signature

Reply via email to