Use either the results for DMDAGetGhostCorners() or DMDAGetCorners() to 
determine if the first or last node is local. This extends trivially to 2 and 
3d. See for example src/ksp/ksp/examples/tutorials/ex34.c ComputeMatrix() if 
(i==0 || j==0 || k==0 || i==mx-1 || j==my-1 || k==mz-1) { etc

  Barry

> On Mar 18, 2015, at 9:06 PM, Adrian Croucher <[email protected]> 
> wrote:
> 
> hi,
> 
> I'm setting up a simple 1-D finite difference test problem with Dirichlet 
> boundary conditions at each end, using DMDA.
> 
> I used DMDACreate1d() with the DM_BOUNDARY_GHOSTED option, and set the global 
> array dimension to be the total number of nodes (including boundary nodes) 
> minus 2- so the boundary nodes aren't included in the mesh.
> 
> When I'm evaluating the differential equation on this mesh, I use 
> DMGetLocalVector() and DMGlobalToLocalBegin/End() to scatter to my ghosted 
> vector, then DMDAVecGetArray() to get an array on the local vector.
> 
> When I want to apply the BCs at each end, I call DMDAGetGhostCorners() to 
> find the indices of the ghost points.  I can now plug the required boundary 
> values into my array.
> 
> At present, if I'm running on multiple processors, I'm just checking if 
> rank=0 or rank=size-1 to make sure the BCs only get applied at the actual 
> ends of the mesh, and not at the ends of the internal partitions as well.
> 
> This works, but is there a better way to do it? It seems potentially 
> unreliable- as it assumes rank 0 is always the left hand end and rank size-1 
> always the right-hand end. Also it won't really work in 2D or 3D.
> 
> Thanks!
> 
> - Adrian
> 
> -- 
> Dr Adrian Croucher
> Senior Research Fellow
> Department of Engineering Science
> University of Auckland, New Zealand
> email: [email protected]
> tel: +64 (0)9 923 84611
> 

Reply via email to