On 12 May 2016 at 10:42, Sean Dettrick <[email protected]> wrote:
> Hi,
>
> When discussing DMDAVecGetArrayDOF etc in section 2.4.4, the PETSc 3.7
> manual says "The array is accessed using the usual global indexing on the
> entire grid, but the user may only refer to the local and ghost entries
> of this array as all other entries are undefined”.
>
> OK so far. But how to access the ghost entries?
>
> With a 2D DMDA, I can do this OK:
>
>
> PetscInt xs,xm,ys,ym;
>
> ierr=DMDAGetCorners(da,&xs,&ys,0,&xm,&ym,0);CHKERRQ(ierr);
>
> PetscScalar ***es;
>
> ierr=DMDAVecGetArrayDOF(da,Es,&es);CHKERRQ(ierr);
>
>
> for (int j=ys; j < ys+ym; j++) {
>
> for (int i=xs; i < xs+xm;i++) {
>
> es[j][i][0]=1.;
>
> es[j][i][1]=1.;
>
> }
>
> }
>
> ierr=DMDAVecRestoreArrayDOF(da,Es,&es);CHKERRQ(ierr);
>
> But if I replace DMDAGetCorners with DMDAGetGhostCorners, then the code
> crashes with a seg fault, presumably due to out of bounds memory access.
>
> Is that supposed to happen?
>
If you created the vector Es using
the function DM{Get,Create}GlobalVector(), then the answer is yes.
> What’s the remedy?
>
If you want to access the ghost entries, you need to create the vector
using the function DM{Get,Create}LocalVector().
Thanks,
Dave
>
> Thanks very much!
>
> Sean Dettrick
>
>