[petsc-users] VecGetArrayF90 in PETSc/3.10 (Fortran)

Smith, Barry F. bsmith at mcs.anl.gov
Sun Jan 6 17:24:56 CST 2019



> On Jan 6, 2019, at 5:21 PM, Victor Eijkhout <eijkhout at 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 at 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 at 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.liu at utexas.edu
>> 
> 



More information about the petsc-users mailing list