From: <[email protected]<mailto:[email protected]>> 
on behalf of Dave May <[email protected]<mailto:[email protected]>>
Date: Thursday, May 12, 2016 at 2:48 AM
To: Sean Dettrick 
<[email protected]<mailto:[email protected]>>
Cc: "[email protected]<mailto:[email protected]>" 
<[email protected]<mailto:[email protected]>>
Subject: Re: [petsc-users] accessing DMDA Vec ghost values



On 12 May 2016 at 10:42, Sean Dettrick 
<[email protected]<mailto:[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!  Somehow I missed DM{Get,Create}LocalVector().  BTW what is the 
difference between the Get and Create versions?  It is not obvious from the 
documentation.

Also, can you explain the difference between DMDAVecGetArrayDOF and 
DMDAVecGetArrayDOFRead?

Thanks again,
Sean



Thanks,
  Dave



Thanks very much!

Sean Dettrick


Reply via email to