<div dir="ltr"><div><div><div>Hello,<br>during my attempts to learn PETSc, I am trying to understand the relation between global and local vectors on a DMDA. There is a problem in my code below, which only returns zeros when I try to access the local values, although VecView shows that the values are correctly transferred from the global vector g to the local vector l.<br>Is it obvious, what I am doing wrong?<br><br>Another question, I was expecting that "VecView(l,PETSC_VIEWER_<wbr>STDOUT_WORLD);" would print l synchronized from each process, but only l from process #0 is shown. How can I see the other parts of l?<br><br></div>Thank you<br></div>Herrmann<br><br></div>The example code:<br><div><div><div><br>#include "petsc.h"<br><br>int main(int argc,char **argv){<br>  PetscInt sz;<br>  int ierr,rank;<br>  Vec g,l;<br>  DM da;<br>  <br>  ierr=PetscInitialize(&argc, &argv, NULL, NULL);CHKERRQ(ierr);<br>  MPI_Comm_rank(PETSC_COMM_<wbr>WORLD,&rank);<br>  int nx=2,ny=4;<br>  //create DA<br>  ierr=DMDACreate2d(PETSC_COMM_<wbr>WORLD,DM_BOUNDARY_GHOSTED,DM_<wbr>BOUNDARY_GHOSTED,DMDA_STENCIL_<wbr>BOX,nx,ny,PETSC_DECIDE,PETSC_<wbr>DECIDE,1,1,NULL,NULL,&da);<wbr>CHKERRQ(ierr);<br>  //create global vector and fill with numbers 101,102,...<br>  ierr=DMCreateGlobalVector(da,&<wbr>g);CHKERRQ(ierr);<br>  ierr=VecGetSize(g,&sz);<wbr>CHKERRQ(ierr);<br>  for (int k=0;k<sz;k++){<br>    VecSetValue(g,k,100+k,INSERT_<wbr>VALUES);<br>  }<br>  VecAssemblyBegin(g);<br>  VecAssemblyEnd(g);<br>  //create local vector and transfer global values into local<br>  ierr=DMCreateLocalVector(da,&<wbr>l);CHKERRQ(ierr);<br>  ierr=VecGetSize(l,&sz);<wbr>CHKERRQ(ierr);<br>  DMGlobalToLocalBegin(da,g,<wbr>INSERT_VALUES,l);<br>  DMGlobalToLocalEnd(da,g,<wbr>INSERT_VALUES,l);<br>  VecAssemblyBegin(l);<br>  VecAssemblyEnd(l);<br><br>  //view local vector, ok<br>  VecView(l,PETSC_VIEWER_STDOUT_<wbr>WORLD);<br><br>  //access local values by VecGetValues, fails (only zeros!)<br>  double *data=(double*)malloc(100*<wbr>sizeof(double));<br>  PetscInt ix[100];<br>  ierr=VecGetSize(l,&sz);<wbr>CHKERRQ(ierr);<br>  for (int k=0;k<sz;k++) ix[k]=k;<br>  ierr=VecGetValues(l,sz,ix,<wbr>data);CHKERRQ(ierr);<br><br>  PetscSynchronizedPrintf(PETSC_<wbr>COMM_WORLD,"VecGetValues on rank %d:\n",rank);<br>  for (int k=0;k<sz;k++) PetscSynchronizedPrintf(PETSC_<wbr>COMM_WORLD,"%d ",data[k]);<br>  PetscSynchronizedPrintf(PETSC_<wbr>COMM_WORLD,"\n");<br><br>  //access local values by VecGetArrays, fails (only zeros!)<br>  ierr=VecGetArray(l,&data);<wbr>CHKERRQ(ierr);<br>  PetscSynchronizedPrintf(PETSC_<wbr>COMM_WORLD,"VecGetArray on rank %d:\n",rank);<br>  for (int k=0;k<sz;k++){<br>    PetscSynchronizedPrintf(PETSC_<wbr>COMM_WORLD,"%d ",data[k]);<br>  }<br>  PetscSynchronizedPrintf(PETSC_<wbr>COMM_WORLD,"\n");<br>  PetscSynchronizedFlush(PETSC_<wbr>COMM_WORLD,NULL);<br>  VecRestoreArray(l,&data);<wbr>CHKERRQ(ierr);<br>  <br>  ierr = PetscFinalize();CHKERRQ(ierr);<br>  return ierr;<br>}<br></div></div></div></div>