omg... for some reason I was thinking it takes local indices. Yes.. modifying that line the code works well.
thank you! Alfredo On Thu, Jan 5, 2023 at 10:38 AM Junchao Zhang <junchao.zh...@gmail.com> wrote: > VecSetValue() also needs global indices, so you need PetscInt gl_row = ( > PetscInt)(i)+rstart; > > --Junchao Zhang > > > On Thu, Jan 5, 2023 at 11:25 AM Alfredo Jaramillo < > ajaramillopa...@gmail.com> wrote: > >> dear PETSc developers, >> >> I have a code where I copy an array to a distributed petsc vector with >> the next lines: >> >> 1 for (int i = 0; i < ndof_local; i++) { >> 2 PetscInt gl_row = (PetscInt)(i)+rstart; >> 3 PetscScalar val = (PetscScalar)u[i]; >> 4 VecSetValues(x,1,&gl_row,&val,INSERT_VALUES); >> 5 } >> >> // for (int i = 0; i < ndof_local; i++) { >> // PetscInt gl_row = (PetscInt)(i); >> // PetscScalar val = (PetscScalar)u[i]; >> // VecSetValue(x,gl_row,val,INSERT_VALUES); >> // } >> >> VecAssemblyBegin(x); >> VecAssemblyEnd(x); >> >> This works as expected. If, instead of using lines 1-5, I use the lines >> where VecSetValue is used with local indices, then the vector is null on >> all the processes but rank 0, and the piece of information at rank zero is >> incorrect. >> >> What could I be doing wrong? >> >> bests regards >> Alfredo >> >