[petsc-users] SNES Shell Problems

Peter Brune brune at mcs.anl.gov
Mon Aug 27 19:00:11 CDT 2012


I suspect that you could get past your problem by using SNESGetPC to create
the initial psnes context from the outer solver context and then setting
its type as you've done here.

A more complete backtrace from the debugger might give me a better notion
of exactly what is going wrong.  You can get this output conveniently using
the -on_error_attach_debugger.

Thanks,

- Peter

On Mon, Aug 27, 2012 at 6:51 PM, Gaetan Kenway <kenway at utias.utoronto.ca>wrote:

> Hi Again
>
> I've pulled the most recent 3.3 branch code, compiled and tried running
> with the shell solver. When I run just the snessolve() on the shell solver
> everything works just fine. However, when I try to combine it with NGMRES I
> get issues. Here's how I setup the solvers:
>
>      ! ----------- Create Shell snes context -----------------
>
>
>      call SNESCreate(SUMB_COMM_WORLD, psnes, ierr)
>      call EChk(ierr, __FILE__, __LINE__)
>
>      ! Set the type to "shell"
>
>
>      call SNESSetType(psnes, SNESSHELL, ierr)
>      call EChk(ierr, __FILE__, __LINE__)
>
>      ! Set the user-defined function for psnes to our funtion
>
>
>      call SNESShellSetSolve(psnes, psnes_func, ierr)
>      call EChk(ierr, __FILE__, __LINE__)
>
>      ! ----------- Create main snes solver object ------------
>
>
>      call SNESCreate(SUMB_COMM_WORLD, outer_snes, ierr)
>      call EChk(ierr, __FILE__, __LINE__)
>
>      ! Set the type to the nonlinear ngmres
>
>
>      call SNESSetType(outer_snes, SNESNGMRES, ierr)
>      call EChk(ierr, __FILE__, __LINE__)
>
>      call SNESSetFunction(outer_snes, rVec, formFunction_snes, ctx2, ierr)
>      call EChk(ierr, __FILE__, __LINE__)
>
>      ! Set the above create psnes context to the 'pc' of the one just
> created
>
>      call SNESSetPC(outer_snes, psnes, ierr)
>      call EChk(ierr, __FILE__, __LINE__)
>
>      call snessetfromoptions(outer_snes, ierr)
>      call EChk(ierr, __FILE__, __LINE__)
>
>
> The actual commands I'm running are:
>   call SNESSolve(outer_snes, rhs, wVec, ierr) ! this works when
> 'outer_snes' is replaced with 'psnes'
>   call EChk(ierr,__FILE__,__LINE__) !
>
>
> I'm pretty sure the function is correct since it runs through when just
> the shell solver is called. the "formFunction_snes" also seems to work ok
> by itself. The traceback I get is below:
>
> [0]PETSC ERROR:
> ------------------------------------------------------------------------
> [0]PETSC ERROR: Caught signal number 11 SEGV: Segmentation Violation,
> probably memory access out of range
> [0]PETSC ERROR: Try option -start_in_debugger or -on_error_attach_debugger
> [0]PETSC ERROR: or see
> http://www.mcs.anl.gov/petsc/documentation/faq.html#valgrind[0]PETSCERROR: or try
> http://valgrind.org on GNU/linux and Apple Mac OS X to find memory
> corruption errors
> [0]PETSC ERROR: likely location of problem given in stack below
> [0]PETSC ERROR: ---------------------  Stack Frames
> ------------------------------------
> [0]PETSC ERROR: Note: The EXACT line numbers in the stack are not
> available,
> [0]PETSC ERROR:       INSTEAD the line number of the start of the function
> [0]PETSC ERROR:       is given.
> [0]PETSC ERROR: [0] SNESSolve_Shell line 166
> /nfs/mica/home/kenway/Downloads/petsc-3.3/src/snes/impls/shell/snesshell.c
> [0]PETSC ERROR: [0] SNESSolve line 3491
> /nfs/mica/home/kenway/Downloads/petsc-3.3/src/snes/interface/snes.c
> [0]PETSC ERROR: [0] SNESSolve_NGMRES line 189
> /nfs/mica/home/kenway/Downloads/petsc-3.3/src/snes/impls/ngmres/snesngmres.c
> [0]PETSC ERROR: [0] SNESSolve line 3491
> /nfs/mica/home/kenway/Downloads/petsc-3.3/src/snes/interface/snes.c
> [0]PETSC ERROR: [0] VecCreateMPIWithArray line 313
> /nfs/mica/home/kenway/Downloads/petsc-3.3/src/vec/vec/impls/mpi/pbvec.c
> [0]PETSC ERROR: [0] VecCreateMPIWithArray line 313
> /nfs/mica/home/kenway/Downloads/petsc-3.3/src/vec/vec/impls/mpi/pbvec.c
> [0]PETSC ERROR: [0] VecCreateMPIWithArray line 313
> /nfs/mica/home/kenway/Downloads/petsc-3.3/src/vec/vec/impls/mpi/pbvec.c
> [0]PETSC ERROR: [0] VecCreateMPIWithArray line 313
> /nfs/mica/home/kenway/Downloads/petsc-3.3/src/vec/vec/impls/mpi/pbvec.c
>
> I can tell from the output it first calls the supplied 'formFunction'
> correctly and then has made its way to the SNESSolve_Shell command as
> expected. However, my guess is it actually dies at the following line:
>
>  ierr = (*shell->solve)(snes,snes->vec_sol);CHKERRQ(ierr);
>
> I'm not quite sure what's going on.  Something fishy with the vec_sol
> pointer or the solve command pointer?
>
> Do you have any examples of using NGMRES?
>
> Thanks,
>
> Gaetan
>
> On Mon, Aug 27, 2012 at 5:06 PM, Gaetan Kenway <kenway at utias.utoronto.ca>wrote:
>
>> Thanks very much for the very quick response.
>>
>> I will pull the change from the mercurial repository and give it a try in
>> the next couple of days.
>>
>> Gaetan
>>
>>
>> On Mon, Aug 27, 2012 at 3:59 PM, Peter Brune <brune at mcs.anl.gov> wrote:
>>
>>> I've tested and pushed a fix to petsc-3.3.  If there are any problems,
>>> let me know.
>>>
>>> On Mon, Aug 27, 2012 at 12:24 PM, Gaetan Kenway <
>>> kenway at utias.utoronto.ca> wrote:
>>>
>>>> Excellent. Thanks.
>>>>
>>>> The reason for using the snes shell solver is I would like to try out
>>>> the ngmres snes. solver. The code I'm working with already has a has a
>>>> non-linear multi-grid method, coded directly in the fortran source. My plan
>>>> was to setup the the ngmres snes solver, then create a snes shell as the
>>>> preconditioner that wraps the nonlienear multigrid solver already in place.
>>>>
>>>> Does this make sense? Is this the sort of usage you had in mind?
>>>>
>>>>
>>> This is very much the usage we were intending for this.
>>>
>>> - Peter
>>>
>>>
>>>> Thanks,
>>>>
>>>> Gaetan
>>>>
>>>>
>>>> On Mon, Aug 27, 2012 at 1:10 PM, Jed Brown <jedbrown at mcs.anl.gov>wrote:
>>>>
>>>>> On Mon, Aug 27, 2012 at 12:09 PM, Gaetan Kenway <
>>>>> kenway at utias.utoronto.ca> wrote:
>>>>>
>>>>>> That's what I had deduced. I tried modifying the source code taking
>>>>>> out the 'C', but it still didn't seem to generate the required wrapper.
>>>>>> Does the functions that get passed function pointer handle's require
>>>>>> special handling?
>>>>>
>>>>>
>>>>> It needs custom handling. Peter is working on it.
>>>>>
>>>>>
>>>>
>>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20120827/3bf6a783/attachment.html>


More information about the petsc-users mailing list