Note there is also VecSetValuesLocal() that takes ghosted local indices 
(ghosted local indices are different from your meaning of "local indices"). See 
https://petsc.org/release/docs/manualpages/Vec/VecSetValuesLocal/  
https://petsc.org/release/docs/manualpages/Vec/VecSetLocalToGlobalMapping/

  Barry


> On Jan 5, 2023, at 12:41 PM, Alfredo Jaramillo <[email protected]> 
> wrote:
> 
> 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 <[email protected] 
> <mailto:[email protected]>> 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 <[email protected] 
>> <mailto:[email protected]>> 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

Reply via email to