[petsc-users] SNESSetConvergenceTest

Dharmendar Reddy dharmareddy84 at gmail.com
Tue Feb 25 20:52:32 CST 2014


Thanks
Reddy


On Tue, Feb 25, 2014 at 3:49 PM, Jed Brown <jed at jedbrown.org> wrote:
> Sorry about dropping this email; thanks for being persistent.
>
> Dharmendar Reddy <dharmareddy84 at gmail.com> writes:
>
>> Hello,
>>         I think, i found the cause of the crashes. It is due to _cb
>> defined in zsnesf.c and a particular usage pattern.
>>
>> Here is how it is:
>> The code has snes object wrapped inside a fortran data type (Solver_t)
>>
>> Say i have two solver objects:
>> type(solver_t) :: solver1
>> type(solver_t) :: solver2
>>
>> I first use solver1 to solve an equation where i do not use DM
>>
>> In the snes in Solver1 , i set function first and then jacobian.
>>
>> Now, ths static struct _cb in zsnsef has:
>> _cb  = {function = 1000, test = 0, destroy = 0, jacobian = 1001,
>> monitor = 0, mondestroy = 0, gs = 0}
>>
>>
>> Now i call the second solver with DM, where is set the function and
>> jacobain via DMSetFxn/Jac
>>
>> Then i call snessetconvergenceset
>>
>> _cb not takes the value :
>>
>> _cb  = {function = 1000, test = 1002, destroy = 0, jacobian = 1001,
>> monitor = 0, mondestroy = 0, gs = 0}
>>
>> but the snes hdr has num_fortrancallback[0] = 1
>
> Which SNES header (the first or second solve)?
> PetscObjectSetFortranCallback should have increased the size.

snes hdr of the second solver object.


>
>> leading to an error: at line  262 in src/sys/objects/inherit.c
>>   if (PetscUnlikely(cid >=
>> PETSC_SMALLEST_FORTRAN_CALLBACK+obj->num_fortrancallback[cbtype]))
>> SETERRQ(obj->comm,PETSC_ERR_ARG_CORRUPT,"Fortran callback not set on
>> this object");
>
> I would really like to open this up in a debugger, but I can't compile
> your code,
>
>      maxIt = PETSC_DEFAULT_INTEGER
> @@ -857,7 +857,7 @@ program testDMSolver
>    use EquationUtils_m
>     use precision_m
>    implicit none
> -#include 'finclude/petsc.h90'
> +#include "finclude/petsc.h90"
>    ! Vairables for DM based solver
>    type(Eqn_t) :: Eqn
>    PetscErrorCode :: ierr
>
>
> Solver.F90:734.2:
>
>   this%self => this
>   1
> Error: Different types in pointer assignment at (1); attempted assignment of CLASS(eqn_t) to TYPE(eqn_t)
> Solver.F90:786.11:
>
>   call test%init(PETSC_COMM_SELF,'test',i2,i2,ierr,solverCtx,&
>            1
> Error: Found no matching specific binding for the call to the GENERIC 'init' at (1)
> Solver.F90:856.6:
>
>   use SolverTest_m
>       1
> Fatal Error: Can't open module file 'solvertest_m.mod' for reading at (1): No such file or directory
>
>
> Would it be possible to reduce this test case enough to build
> stand-alone and contribute it as a test?

solver.F90 is a standalone test case. Which fortran compiler are you
using ? The code requires Fortran 2003 complaint compiler. I use ifort
13.1.0. It may require gfortran > 4.7.


>> There is another scenario where my code hangs, i noted it as case (2)
>> [line 968 in solver.F90] in the comments of the attached test case.
>>
>> i have attahced the logs for each of the three cases considered.
>>
>> why cannot _cb reside inside the snes object  ?
>
> How would you copy the callbacks between objects if each object could
> number them differently?


More information about the petsc-users mailing list