> 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

Attachment: signature.asc
Description: Message signed with OpenPGP using GPGMail

Reply via email to