In PETSc the "local vector" or "local representation" refers to vectors WITH ghost points. The global vector or global representation refers to vectors WITHOUT ghost points. Hence to access locations like [i+1] which extend over to the next process you need to use the local ghosted representation.
Barry One could argue that it is not the clearest names to use. Just remember local == ghosted and global == not ghosted. On Aug 21, 2013, at 8:25 PM, Zhang <[email protected]> wrote: > Dear All, > Now I am confused with the way to access a global vector defined from DMDA. > > Here is the codes. When I switch on _DEBUG1_ the results get wrong. While if > it's off, > > the results fine. I just wonder why I gave to use the local form of ul,vl,wl > to access the > values such as ul[k][j][i+1], and etc. > > Thank you first for any suggestion. > > Zhenyu > > ierr = DMCreateGlobalVector(ctxu->grid, &ctxu->x );CHKERRQ(ierr); > ierr = VecDuplicate(ctxu->x,&ctxu->b);CHKERRQ(ierr); > ierr = DMCreateGlobalVector(ctxv->grid, &ctxv->x );CHKERRQ(ierr); > ierr = VecDuplicate(ctxv->x,&ctxv->b);CHKERRQ(ierr); > ierr = DMCreateGlobalVector(ctxw->grid, &ctxw->x );CHKERRQ(ierr); > ierr = VecDuplicate(ctxw->x,&ctxw->b);CHKERRQ(ierr); > ... > VecCopy(ctxu->x,ctxu->b); > VecCopy(ctxv->x,ctxv->b); > VecCopy(ctxw->x ,ctxw->b); > > DMDAVecGetArray( ctxu->grid, ctxu->b, &ustar ); > DMDAVecGetArray( ctxv->grid, ctxv->b, &vstar ); > DMDAVecGetArray( ctxw->grid, ctxw->b, &wstar ); > > #if defined(_DEBUG1_) > DMDAVecGetArray( ctxu->grid, ctxu->x, &u ); > DMDAVecGetArray( ctxv->grid, ctxv->x, &v ); > DMDAVecGetArray( ctxw->grid, ctxw->x, &w ); > #else > DMGetLocalVector(ctxu->grid,&ctxu->local); > DMGetLocalVector(ctxv->grid,&ctxv->local); > DMGetLocalVector(ctxw->grid,&ctxw->local); > DMGlobalToLocalBegin(ctxu->grid,ctxu->x,INSERT_VALUES,ctxu->local); > DMGlobalToLocalEnd(ctxu->grid,ctxu->x,INSERT_VALUES,ctxu->local); > DMGlobalToLocalBegin(ctxv->grid,ctxv->x,INSERT_VALUES,ctxv->local); > DMGlobalToLocalEnd(ctxv->grid,ctxv->x,INSERT_VALUES,ctxv->local); > & nbsp; DMGlobalToLocalBegin(ctxw->grid,ctxw->x,INSERT_VALUES,ctxw->local); > DMGlobalToLocalEnd(ctxw->grid,ctxw->x,INSERT_VALUES,ctxw->local); > DMDAVecGetArray( ctxu->grid, ctxu->local, &ul ); > DMDAVecGetArray( ctxv->grid, ctxv->local, &vl ); > DMDAVecGetArray( ctxw->grid, ctxw->local, &wl ); > #endif > > //---------------------------------------------------------------- > // U > DMDAGetCorners( ctxu->grid, &is, &js, &ks, &in, &jn, &kn ); > ie = is + in - 1; > je = js + jn - 1; > ke = ks + kn - 1; > > is=max(is,1); > js=max(js,1); > ks=max(ks,1); > ie=min(ie,ctxu->l-2); > je=min(je,ctxu->m-2); > ke=min(ke,ctxu->n-2); > > > for (k=ks; k<=ke; k++) { > for (j=js; j<=je; j++) { > for (i=is; i<=ie; i+ +) { > > #if defined(_DEBUG1_) > ustar[k][j][i] += > - > dtdx*(0.25*((u[k][j][i]+u[k][j][i+1])*(u[k][j][i]+u[k][j][i+1])) > - > 0.25*((u[k][j][i]+u[k][j][i-1])*(u[k][j][i]+u[k][j][i-1]))) > - dtdy*(0.25*(u [k][j][i]+u [k][j+1][i])*(v > [k][j][i]+v [k][j][i+1]) > - 0.25*(u [k][j][i]+u [k][j-1][i])*(v > [k][j-1][i]+v [k][j-1][i+1])) > - dtdz*(0.25*(u [k][j][i]+u [k+1][j][i])*(w > [k][j][i]+w [k][j][i+1]) > - 0.25*(u [k][j][i]+u [k-1][j][i])*(w > [k-1][j][i]+w [k-1][j][i+1])) > + dtdxx*(u [k][j][i-1]-2*u [k][j][i]+u [k][j] > [i+1]) > + dtdyy*(u [k][j-1][i]-2*u [k][j][i]+u > [k][j+1][i]) > + dtdzz*(u [k-1][j][i]-2*u [k][j][i]+u > [k+1][j][i]); > #else > ustar[k][j][i] += > - > dtdx*(0.25*((ul[k][j][i]+ul[k][j][i+1])*(ul[k][j][i]+ul[k][j][i+1])) > &nbs p; - > 0.25*((ul[k][j][i]+ul[k][j][i-1])*(ul[k][j][i]+ul[k][j][i-1]))) > - > dtdy*(0.25*(ul[k][j][i]+ul[k][j+1][i])*(vl[k][j][i]+vl[k][j][i+1]) > - > 0.25*(ul[k][j][i]+ul[k][j-1][i])*(vl[k][j-1][i]+vl[k][j-1][i+1])) > - > dtdz*(0.25*(ul[k][j][i]+ul[k+1][j][i])*(wl[k][j][i]+wl[k][j][i+1]) > &nb sp; - > 0.25*(ul[k][j][i]+ul[k-1][j][i])*(wl[k-1][j][i]+wl[k-1][j][i+1])) > + > dtdxx*(ul[k][j][i-1]-2*ul[k][j][i]+ul[k][j][i+1]) > + > dtdyy*(ul[k][j-1][i]-2*ul[k][j][i]+ul[k][j+1][i]) > + > dtdzz*(ul[k-1][j][i]-2*ul[k][j][i]+ul[k+1][j][i]); > #endif > } > } > } > > ..... > > #if defined(_DEBUG1_) > DMDAVecRestoreArray( ctxu->grid, ctxu->x, &u ); > DMDAVecRestoreArray( ctxv->grid, ctxv->x, &v ); > DMDAVecRestoreArray( ctxw->grid, ctxw->x, &w ); > #else > DMDAVecRestoreArray( ctxu->grid, ctxu->local, &ul ); > DMDAVecRestoreArray( ctxv->grid, ctxv->local, &vl ); > DMDAVecRestoreArray( ctxw->grid, ctxw->local, &wl ); > DMRestoreLocalVector(ctxu->grid,&ctxu->local); > DMRestoreLocalVector(ctxv->grid,&ctxv->local); > DMRestoreLocalVector(ctxw->grid,&ctxw->local); > #endif > > DMDAVecRestoreArray( ctxu->grid, ctxu->b, &ustar ); > DMDAVecRestoreArray( ctxv->grid, ctxv->b, &vstar ); > DMDAVecRestoreArray( ctxw->grid, ctxw->b, &wstar ); > >
