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