<div dir="ltr"><div><div><div><div><div><div>I have a finite element discretisation of the following nonlinear equation:<br><br></div>m*(phi_xx * phi_yy - phi_xy^2) = const,<br><br></div>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.<br><br></div>I'm using PETSc's SNES  in Python via petsc4py, within the wider environment of the software Firedrake.<br><br></div>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.<br><br></div>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.<br><br></div><div>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?<br><br></div><div>Thanks,<br></div><div>Andrew<br></div></div>