[petsc-users] a line of code is weird

Barry Smith bsmith at mcs.anl.gov
Sat Mar 7 12:11:32 CST 2015

 Note the lines immediately above it.

 ierr = VecGetOwnershipRange(x1,&start,&end);CHKERRQ(ierr);
for (j=start; j<end; j++) {
       if (PetscAbsScalar(y[j-start]) > amax || j == i) {
        ierr = MatSetValues(B,1,&j,1,&i,y+j-start,INSERT_VALUES);CHKERRQ(ierr);

 j is looping over the global rows of the vector. The -start is to convert to the local row inside the array y[] since y only contains the local part of the vector. 

Note that y+j-start is equivalent to &y[j-start] so this is inserting into the jth global row the jth global row value in the vector which is the j-start local entry in the vector.


> On Mar 7, 2015, at 11:53 AM, Fande Kong <fdkong.jd at gmail.com> wrote:
> Hi all,
> I am trying to understand how to compute Jacobian using finite difference methods. There is a function called SNESComputeJacobianDefault, where a line of code at 120th line, MatSetValues(B,1,&j,1,&i,y+j-start,INSERT_VALUES), is difficult to understand for me. Because I think inserting  'y' is enough, but there is two extra values 'j-start'. Any explanation is welcome.
> Thanks,
> Fande,

More information about the petsc-users mailing list