> On 24 Jun 2015, at 17:02, Asbjørn Nilsen Riseth <[email protected]> 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
signature.asc
Description: Message signed with OpenPGP using GPGMail
