[petsc-users] SNES + linesearch hackery?
Barry Smith
bsmith at mcs.anl.gov
Thu Mar 24 12:39:39 CDT 2016
> On Mar 24, 2016, at 10:18 AM, Andrew McRae <A.T.T.McRae at bath.ac.uk> wrote:
>
> I have a finite element discretisation of the following nonlinear equation:
>
> m*(phi_xx * phi_yy - phi_xy^2) = const,
>
> solving for phi. Unfortunately, the function m depends on phi in a complicated way -- let's assume I need to call my own function to handle this.
Andrew
So you are actually solving
m(phi)*(phi_xx * phi_yy - phi_xy^2) - const = 0
with finite elements for phi?
What are you providing for a Jacobian?
>
> I'm using PETSc's SNES in Python via petsc4py, within the wider environment of the software Firedrake.
>
> Currently I'm hacking in the m update (and various output diagnostics) by writing a Python function "fakemonitor" and calling snes.setMonitor(fakemonitor). This allows me to update m each nonlinear iteration.
Hmm, I don't understand this. It sounds like you are passing (phi_xx * phi_yy - phi_xy^2) or something to SNES as the SNESFormFunction()? Why is this? Why not pass the entire function to SNES?
Barry
>
> While this is better than nothing, there's still some problems: if I use e.g. snes_linesearch_type: "l2", the fnorms for lambda = 1.0, 0.5 and 0.0 are calculated without updating m, and so the step length taken is (seemingly) far from optimal. I tried adding a damping parameter, but all this does is change the lambdas used to generate the quadratic fit; it doesn't actually make the step length smaller.
>
> Is there some cleaner way to do what I want, perhaps by intercepting the fnorm calculation to update m, rather than abusing a custom monitor routine?
>
> Thanks,
> Andrew
More information about the petsc-users
mailing list