Hi Smith, I tried and it works. Thank you so much! It is weird that this bug hides so well since petsc/3.4,3.5 (5-6 years ago) in our code; now from petsc/3.9, it shows up.....
Thank you guys for all your help~ Best, Chang On Sun, Jan 6, 2019 at 5:24 PM Smith, Barry F. <bsm...@mcs.anl.gov> wrote: > > > > On Jan 6, 2019, at 5:21 PM, Victor Eijkhout <eijkh...@tacc.utexas.edu> > wrote: > > > > Hey Barry, > > > > Chang is one of my users and I’m out of my depth here: > > > > > [0]PETSC ERROR: --------------------- Error Message > > > -------------------------------------------------------------- > > > [0]PETSC ERROR: Corrupt argument: > > > > > [0]PETSC ERROR: Invalid Pointer to Object: Parameter # 1 > > > > > [0]PETSC ERROR: #1 VecGetArray() line 1578 in > > > > It looks like VecGetArrayF90 is no longer allowed in callbacks, which is > what seems to be happening here. > > > > Victor. > > > > > >> On Jan 6, 2019, at 5:05 PM, Smith, Barry F. via petsc-users < > petsc-users@mcs.anl.gov> wrote: > >> > >> > >> What is the error message, cut and paste the entire message? > >> > >> Barry > >> > >> > >>> On Jan 6, 2019, at 3:12 PM, Chang Liu via petsc-users < > petsc-users@mcs.anl.gov> wrote: > >>> > >>> Hi All, > >>> Recently, when I am upgrading our code from 3.8 to 3.10, it always > runs into error during VecGetArrayF90 call (it is Fortran90-based code). > The reason we use is to access the array for our user-defined matrix-vector > multiplication subroutine, for example: > >>> > >>> subroutine mymult(A,x,y,loco_ierr) > >>> !!!!!!!!!!!!!!! matrix-vector multiplication y=A.x > !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! > >>> use mat_vec_mult,only:matvec > >>> implicit none > >>> Mat,intent(in)::A ! required by PETSc > >>> Vec,intent(in)::x > >>> Vec,intent(out)::y > > This is wrong. y is not returned from your subroutine, it is passed > into the subroutine and hence is intent(in). > > Hopefully this resolves your problem, otherwise let us know. > > Barry > > >>> PetscErrorCode,intent(out)::loco_ierr > >>> PetscScalar,pointer::xx(:),yy(:) > >>> > >>> call VecGetArrayReadF90(x,xx,loco_ierr) > >>> call VecGetArrayF90(y,yy,loco_ierr) > >>> call matvec(xx,yy) > >>> call VecRestoreArrayReadF90(x,xx,loco_ierr) > >>> call VecRestoreArrayF90(y,yy,loco_ierr) > >>> return > >>> end subroutine mymult > >>> > >>> I checked the change log on the website and saw a statement: > >>> TAO: > >>> > >>> • Added VecLock{Push|Pop} calls around user callbacks; use of > VecGetArray in user callbacks is now prohibited. > >>> Is there any relation to my issue? All the online PETSc examples and > description for VecGetArray/VecGetArrayF90 are the same as PETSc/3.8. I > tried to add/use VecLockPop/Push, but still doesn't work. > >>> > >>> I am confused and not sure what is the problem? > >>> Could I get some help? > >>> Thanks, > >>> -- > >>> Chang Liu > >>> PhD candidate > >>> Dept. of Electrical & Computer Engineering > >>> Ph: 765-7143357 > >>> Email: chang....@utexas.edu > >> > > > > -- Chang Liu PhD candidate Dept. of Electrical & Computer Engineering Ph: 765-7143357 Email: chang....@utexas.edu