[petsc-users] Bug report: using a custom ksp convergence function

Barry Smith bsmith at petsc.dev
Tue Jan 21 07:16:13 CST 2025


   Yes, that can be passed in also with KSPSetConvergenceTest()


> On Jan 21, 2025, at 4:25 AM, Daniel Stone <daniel.stone at opengosim.com> wrote:
> 
> That works wonderfully, thanks! Should be paired with
> 
>   call KSPConvergedDefaultDestroy(ctx,ierr)
> 
> I think.
> 
> Best Regards,
> 
> Daniel
> 
> 
> 
> On Mon, Jan 20, 2025 at 3:20 PM Barry Smith <bsmith at petsc.dev <mailto:bsmith at petsc.dev>> wrote:
>> 
>>    David,
>> 
>>       KSPConvergedDefault() now takes a non-NULL context that must be provided. I have attached a modified version of ex5f.F90 that demonstrates how it is constructured before being passed to KSPSetConvergenceTest(). 
>> 
>>    Barry
>> 
>> 
>> > On Jan 20, 2025, at 8:54 AM, Daniel Stone <daniel.stone at opengosim.com <mailto:daniel.stone at opengosim.com>> wrote:
>> > 
>> > Hello PETSc Community,
>> > 
>> > I think I've found a bug -
>> > 
>> > Go to $PETSC_DIR/src/ksp/ksp/tutorials/
>> > 
>> > open ex5f.F90, and add the following line in MyKSPConverged(), say around line 336:
>> > 
>> >  call KSPConvergedDefault(ksp,n,rnorm,flag,dummy,ierr)
>> > 
>> > It should make sense why someone would want to do this - within a definition of custom convergence behaviour, get the default convergence flags, and, based on certain conditions, overwrite it.
>> > 
>> > Now, building and running the exercise, making sure to include the flag to use the custom convergence:
>> > 
>> >  boston at boston-SYS-540A-TR:~/DATA_DRIVE/PETSC_DIRS/petsc_3.22/src/ksp/ksp/tutorials$ ./ex2f -my_ksp_convergence
>> > [0]PETSC ERROR: ------------------------------------------------------------------------
>> > [0]PETSC ERROR: Caught signal number 11 SEGV: Segmentation Violation, probably memory access out of range[...]
>> > 
>> > From my debugging, the issue is at line 1520 of iterativ.c:
>> > 
>> >   KSPConvergedDefaultCtx *cctx = (KSPConvergedDefaultCtx *)ctx;
>> > 
>> > Because a dummy is used for the context object, this cast fails (my debugger says "cannot access memory..." for cctx). Then the crash happens when trying to access members of cctx:
>> > 
>> >   if (cctx->convmaxits && n >= ksp->max_it) {
>> > 
>> > 
>> > I'm not sure how to fix it. Crucially, we must note that that this did work in older versions of PETSc - I can repeat this test in 3.19.1, for example, and it works fine - a debugger shows the cast succeeding and producing some
>> > defaulted version of the ctx object, the subsequent crash does not happen, etc.
>> > 
>> > Does anybody have any advice for working around this for the time being? A piece of software I work with uses a custom ksp convergence test in the manner described above, and is only functional with older versions of petsc because of this.
>> > Like in ex2f, I have no need of the ctx object, and just as in ex2f, I use 0 instead.
>> > 
>> > Things I'll try next: defining a proper ctx object (I use 0, like in ex2f), or looking for some PETSC_NULL_CTX definition somewhere.
>> > 
>> > Many Thanks,
>> > 
>> > Daniel
>> > 
>> > 
>> > 
>> 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20250121/0871b77c/attachment.html>


More information about the petsc-users mailing list