[petsc-users] Set PC PythonContext within NPC
Lawrence Mitchell
lawrence.mitchell at imperial.ac.uk
Thu Jun 25 16:16:57 CDT 2015
> On 24 Jun 2015, at 17:02, Asbjørn Nilsen Riseth <riseth at maths.ox.ac.uk> wrote:
>
> Hi all,
>
> I'm currently trying to set up a nonlinear solver that uses NGMRES with NEWTONLS as a right preconditioner. The NEWTONLS has a custom linear preconditioner. Everything is accessed through petsc4py.
>
> *Is there a way I can configure a NPC NEWTONLS KSP CompositePC without first calling solve on my outer snes?*
>
> My NEWTONLS has the following KSP setup:
> FGMRES
> | PCCOMPOSITE
> || PYTHON
> || ILU
>
> The way I understand things, the NPC is not created/set up until SNESSolve_NGMRES() is called. Therefore, I cannot call snes.getNPC().ksp.pc.getCompositePC(0).setPythonContext(ctx) before I have called snes.solve().
>
> What I currently do is a try/except on snes.solve to create/set up the pccomposite. Then I can set my pythoncontext and it runs fine. This is quite ugly though, so I was hoping anyone would have a better approach.
I think you can do the following:
Define a class in some module:
# (in module foo)
class MyPC(object):
def setUp(self, pc):
# do any setup here.
pass
def apply(self, pc, x, y):
# apply preconditioner
pass
And pass:
-npc_sub_1_pc_type python -npc_sub_1_pc_python_context foo.MyPC
You can pull the app context out in the class's setUp method by doing:
ctx = pc.getDM().getAppCtx()
Assuming that you're running with a branch that contains origin/knepley/fix-pc-composite-dm.
Cheers,
Lawrence
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 455 bytes
Desc: Message signed with OpenPGP using GPGMail
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20150625/59d42805/attachment.pgp>
More information about the petsc-users
mailing list