> On May 19, 2018, at 11:42 AM, Praveen C <[email protected]> wrote:
> 
> Thanks a lot.
> 
>> On 19-May-2018, at 9:16 PM, Smith, Barry F. <[email protected]> wrote:
>> 
>>   Praveen,
>> 
>>   Ahh, we didn't have support for passing PETSC_NULL_MAT from Fortran for 
>> this routine. I have added it in the branch 
>> barry/fix-null-matrix-set-jacobian/maint  which after testing will go into 
>> the maint branch. 
>> 
>>   Could you please try this branch and let us know if it resolves the 
>> problem (or a new problem pops up)?
>> 
>>    Barry
>> 
>>   Unfortunately handling null objects from Fortran requires us to manually 
>> tweak the Fortran interface functions and sometimes we forget or don't 
>> realize they need fixing until someone reports a problem.
> 
> I meanwhile passed a Mat object to TSSetRHSJacobian function. It seems that 
> with -snes_mf and PCSHELL, my RHSJacobian is never invoked. Is this the 
> correct behaviour ?

   Yes, if you want your function to be called you need to use 
-snes_mf_operator instead. 
> 
> In RHSJacobian, I am storing the current solution into my usercontext so that 
> I can use it in my shell preconditioner
> 
> subroutine RHSJacobian(ts, time, u, J, P, ctx, ierr)
> 
>    call VecCopy(u, ctx%p%v_u, ierr); CHKERRQ(ierr)
> 
> end
> 
> However, since my RHSJacobian is never invoked, I dont have access to the 
> current solution needed in my ApplyPC. How can I access the current solution 
> in my ApplyPC function ?
> 
> Another issue I am facing is this. I attach my user context to the PC
> 
>       call TSGetSNES(ts, snes, ierr); CHKERRQ(ierr)
>       call SNESGetKSP(snes, ksp, ierr); CHKERRQ(ierr)
>       call KSPGetPC(ksp, pc, ierr); CHKERRQ(ierr)
>       call PCSetType(pc, PCSHELL, ierr); CHKERRQ(ierr)
>       call PCShellSetContext(pc, ctx, ierr); CHKERRQ(ierr)
>       call PCShellSetApply(pc, ApplyPC, ierr); CHKERRQ(ierr)
> 
> Inside my ApplyPC, I access ctx using 
> 
> subroutine ApplyPC(pc, x, y, ierr)
>    use petscpc
>    use mtsdata
>    implicit none
>    PC             :: pc
>    Vec            :: x, y
>    PetscErrorCode :: ierr
>    ! Local variables
>    type(tsdata)   :: ctx
> 
>    call PCShellGetContext(pc, ctx, ierr); CHKERRQ(ierr)
> 
> end
> 
> But the ctx I get from above is not correct, since it does not have the data 
> I stored in my original ctx.

    This won't work. You need to use a pointer for the context not an entirely 
new context argument. See

src/mat/examples/tutorials/ex6f.F90

for how to use derived data types and pointers with contexts in Fortran.

  Barry

> 
> I am rather clueless at this stage.
> 
> Thanks for your help.
> Best regards
> praveen

Reply via email to