SNESVI solver does not converge

Hi, I am having trouble with the SNESVI solver.

I am using it in the context of a phase-field problem that is bound to [0, 1]. For most steps it seems to work properly, but for certain steps it fails to converge. This appears to fail regardless of which line search algorithm is used, or whether this step is split into many smaller steps.

Perhaps the issue is more fundamental with the SNES algorithm for my application, but I wonder whether there is something simple conceptually wrong with my dolfinx (0.8.0) code, such as was the case here with not applying the solution properly.
I’ve been unable to recreate the problem in an MWE created on a simple domain, so I recreated an MWE in which I hardcoded specific values for a particular mesh.

If it is not possible to find the error just by looking at the code, then the following files are required to run it:
mesh xdmf: https://surfdrive.surf.nl/files/index.php/s/Vb8Z9oo8oxWzP9g
mesh h5: SURFdrive
hardcoded data: SURFdrive

MWE code:

import numpy as np
from mpi4py import MPI
import ufl
from ufl import TrialFunction, derivative
from petsc4py import PETSc
from dolfinx import io, fem
from dolfinx.fem import form
from dolfinx.fem.petsc import (
    apply_lifting,
    assemble_matrix,
    assemble_vector,
    create_matrix,
    set_bc,
)
from dolfinx.la import create_petsc_vector

"""
Constrained solver setup:
"""

class NonlinearPDE_SNESProblem:
    def __init__(self, F, u, bcs):

        V = u.function_space
        du = TrialFunction(V)
        self.L = form(F)
        self.a = form(derivative(F, u, du))
        self.bcs = bcs
        self._F, self._J = None, None
        self.u = u

    def F(self, snes, x, F):
        """Assemble residual vector."""
        x.ghostUpdate(addv=PETSc.InsertMode.INSERT, mode=PETSc.ScatterMode.FORWARD)
        x.copy(self.u.x.petsc_vec)
        self.u.x.petsc_vec.ghostUpdate(addv=PETSc.InsertMode.INSERT, mode=PETSc.ScatterMode.FORWARD)

        with F.localForm() as f_local:
            f_local.set(0.0)
        assemble_vector(F, self.L)
        apply_lifting(F, [self.a], bcs=[self.bcs], x0=[x], scale=-1.0)
        F.ghostUpdate(addv=PETSc.InsertMode.ADD, mode=PETSc.ScatterMode.REVERSE)
        set_bc(F, self.bcs, x, -1.0)

    def J(self, snes, x, J, P):
        """Assemble Jacobian matrix."""
        J.zeroEntries()
        assemble_matrix(J, self.a, bcs=self.bcs)
        J.assemble()

"""
Problem setup
"""

mesh_reader = io.XDMFFile(MPI.COMM_WORLD, "notched_beam_0.01_0.08_diag.xdmf", "r")
domain = mesh_reader.read_mesh(name="notched_beam")
domain.topology.create_connectivity(domain.topology.dim - 1, domain.topology.dim)

FS_PF = fem.functionspace(domain, ("CG", 1))
phi = fem.Function(FS_PF, name="phi")

v_pf = ufl.TestFunction(FS_PF)
driving_force = fem.Function(FS_PF, name="U")

"""
Phase field formulation
Note that there is no timestep or previous phi in this formulation 
"""
dx = ufl.Measure("dx", domain=domain, metadata={"quadrature_degree": 1})

term_double_well = phi * (1 - phi)*(1 - 2*phi)  # derivative of the double well
term_phase_boundary = 1e-2 ** 2 * ufl.inner(ufl.grad(phi), ufl.grad(v_pf))   # laplacian
F_pf = (term_double_well - driving_force) * v_pf * dx + term_phase_boundary * dx

"""
Phase field solver setup
"""
bcs = []
problem = NonlinearPDE_SNESProblem(F_pf, phi, bcs)

b = create_petsc_vector(FS_PF.dofmap.index_map, FS_PF.dofmap.index_map_bs)
J = create_matrix(problem.a)

# Create Newton solver and solve
solver_snes = PETSc.SNES().create()
solver_snes.setType("vinewtonrsls")
solver_snes.setFunction(problem.F, b)
solver_snes.setJacobian(problem.J, J)
solver_snes.setTolerances(rtol=1.0e-8, max_it=20)
solver_snes.getKSP().setType("preonly")
solver_snes.getKSP().setTolerances(rtol=1.0e-8)
solver_snes.getKSP().getPC().setType("lu")

# Debugging phase-field linesearch
opts = PETSc.Options()
# opts['snes_linesearch_type'] = 'basic'
opts['snes_linesearch_type'] = 'bt'
opts['snes_monitor'] = None
opts['snes_linesearch_monitor'] = None
solver_snes.setFromOptions()  # make above settings effective

# Set bounds of the vi solver
zero = fem.Function(FS_PF)
zero.x.array[:] = 0.0
one = fem.Function(FS_PF)
one.x.array[:] = 1.0
solver_snes.setVariableBounds(zero.x.petsc_vec, one.x.petsc_vec)

""""
Phase field update
"""
phi.x.array[:] = 0

# Hardcode the driving force values, [timesteps by elements]
all_driving_arrays = np.genfromtxt('driving_force_hardcoded', delimiter=', ')

for i in range(len(all_driving_arrays)):
    print(f"------ Solving phase-field step: {i} ------")
    phi.x.array[:] = 0
    driving_force.x.array[:] = all_driving_arrays[i]    # hardcode overwrite driving force

    solver_snes.solve(None, phi.x.petsc_vec)    # solve phase-field
    assert solver_snes.getConvergedReason() > 0, "Phase-field failed to converge"

Full log:

------ Solving phase-field step: 0 ------
  0 SNES Function norm 0.000000000000e+00
------ Solving phase-field step: 1 ------
  0 SNES Function norm 9.727321543947e-04
      Line search: Using full step: fnorm 9.727321543947e-04 gnorm 3.247865856243e-04
  1 SNES Function norm 3.247865856243e-04
      Line search: Using full step: fnorm 3.247865856243e-04 gnorm 5.645461177940e-05
  2 SNES Function norm 5.645461177940e-05
      Line search: Using full step: fnorm 5.645461177940e-05 gnorm 7.893037163988e-06
  3 SNES Function norm 7.893037163988e-06
      Line search: Using full step: fnorm 7.893037163988e-06 gnorm 3.696803895333e-08
  4 SNES Function norm 3.696803895333e-08
      Line search: Using full step: fnorm 3.696803895333e-08 gnorm 3.607753168643e-12
  5 SNES Function norm 3.607753168643e-12
------ Solving phase-field step: 2 ------
  0 SNES Function norm 1.576890508779e-03
      Line search: Using full step: fnorm 1.576890508779e-03 gnorm 4.500385607001e-04
  1 SNES Function norm 4.500385607001e-04
      Line search: Using full step: fnorm 4.500385607001e-04 gnorm 1.734895731327e-04
  2 SNES Function norm 1.734895731327e-04
      Line search: Using full step: fnorm 1.734895731327e-04 gnorm 1.536279437002e-04
  3 SNES Function norm 1.536279437002e-04
      Line search: Using full step: fnorm 1.536279437002e-04 gnorm 5.696140444842e-05
  4 SNES Function norm 5.696140444842e-05
      Line search: Using full step: fnorm 5.696140444842e-05 gnorm 4.307271380132e-05
  5 SNES Function norm 4.307271380132e-05
      Line search: gnorm after quadratic fit 1.529000660192e-04
      Line search: Cubic step no good, shrinking lambda, current gnorm 1.531814650237e-04 lambda=1.0000000000000002e-02
      Line search: Cubic step no good, shrinking lambda, current gnorm 1.531893267224e-04 lambda=1.0000000000000002e-03
      Line search: Cubic step no good, shrinking lambda, current gnorm 1.531901241397e-04 lambda=1.0000000000000003e-04
      Line search: Cubic step no good, shrinking lambda, current gnorm 1.531902039940e-04 lambda=1.0000000000000004e-05
      Line search: Cubic step no good, shrinking lambda, current gnorm 1.531902119805e-04 lambda=1.0000000000000004e-06
      Line search: Cubic step no good, shrinking lambda, current gnorm 1.531902127792e-04 lambda=1.0000000000000005e-07
      Line search: Cubic step no good, shrinking lambda, current gnorm 1.531902128590e-04 lambda=1.0000000000000005e-08
      Line search: Cubic step no good, shrinking lambda, current gnorm 1.531902128670e-04 lambda=1.0000000000000005e-09
      Line search: Cubic step no good, shrinking lambda, current gnorm 1.531902128678e-04 lambda=1.0000000000000006e-10
      Line search: Cubic step no good, shrinking lambda, current gnorm 1.531902128679e-04 lambda=1.0000000000000006e-11
      Line search: Cubic step no good, shrinking lambda, current gnorm 1.531902128679e-04 lambda=1.0000000000000006e-12
      Line search: Cubic step no good, shrinking lambda, current gnorm 1.531902128679e-04 lambda=1.0000000000000007e-13
      Line search: unable to find good step length! After 12 tries 
      Line search: fnorm=4.3072713801322070e-05, gnorm=1.5319021286791474e-04, ynorm=5.5615287373973983e+00, minlambda=9.9999999999999998e-13, lambda=1.0000000000000007e-13, initial slope=-4.9376423825295156e-10

I have not managed to solve this example, but believe that my setup is correct, and the problem is simply very challenging. For other test cases, using the ‘basic’ (Newton Raphson) linesearch with a high number of maximum iterations (100) improved stability a bit.

Have you had a look at: Fix SNES NonlinearPDE class when using line search by jhale · Pull Request #3507 · FEniCS/dolfinx · GitHub
It might be relevant.

1 Like

Thank you @dokken, that’s an interesting topic and made me hopeful it would help my problem too. I modified my code based on this comment to the following:

for i in range(len(all_driving_arrays)):
    ...
    # solver_snes.solve(None, phi.x.petsc_vec)    # old

    phi_copy = phi.x.petsc_vec.copy()
    phi_copy.ghostUpdate(addv=PETSc.InsertMode.INSERT, mode=PETSc.ScatterMode.FORWARD)
    solver_snes.solve(None, phi_copy)
    ...

Let me know if this is not what is implied by the fix from your link. Doing this, the SNES function does not fail in the first linesearch step where it is shrinking lambda. It performs more iterations, but ultimately still fails to find the solution, as seen below.

------ Solving phase-field step: 2 ------
  0 SNES Function norm 1.576890508779e-03
      Line search: Using full step: fnorm 1.576890508779e-03 gnorm 4.500385607001e-04
  1 SNES Function norm 4.500385607001e-04
      Line search: Using full step: fnorm 4.500385607001e-04 gnorm 1.734895731327e-04
  2 SNES Function norm 1.734895731327e-04
      Line search: Using full step: fnorm 1.734895731327e-04 gnorm 1.536279437002e-04
  3 SNES Function norm 1.536279437002e-04
      Line search: Using full step: fnorm 1.536279437002e-04 gnorm 5.696140444842e-05
  4 SNES Function norm 5.696140444842e-05
      Line search: Using full step: fnorm 5.696140444842e-05 gnorm 4.307271380132e-05
  5 SNES Function norm 4.307271380132e-05
      Line search: gnorm after quadratic fit 3.885971597436e-05
      Line search: Quadratically determined step, lambda=1.0000000000000001e-01
  6 SNES Function norm 3.885971597436e-05
      Line search: gnorm after quadratic fit 1.256624727608e-04
      Line search: Cubic step no good, shrinking lambda, current gnorm 4.021362596686e-05 lambda=1.0000000000000002e-02
      Line search: Cubic step no good, shrinking lambda, current gnorm 3.898800050444e-05 lambda=3.7388806402821181e-03
      Line search: Cubic step, current gnorm 3.884832107816e-05 lambda=1.5479171235421954e-03
  7 SNES Function norm 3.884832107816e-05
      Line search: gnorm after quadratic fit 1.652885594234e-04
      Line search: Cubic step no good, shrinking lambda, current gnorm 4.466177370706e-05 lambda=1.2664596899852993e-02
      Line search: Cubic step, current gnorm 3.870859425528e-05 lambda=3.0028195357742504e-03
  8 SNES Function norm 3.870859425528e-05
      Line search: gnorm after quadratic fit 4.447707952232e-05
      Line search: Cubic step no good, shrinking lambda, current gnorm 3.889880449709e-05 lambda=3.5318604833347270e-02
      Line search: Cubic step, current gnorm 3.843344620214e-05 lambda=1.5557321300455389e-02
  9 SNES Function norm 3.843344620214e-05
      Line search: gnorm after quadratic fit 1.856658050715e-04
      Line search: Cubic step no good, shrinking lambda, current gnorm 5.881916608532e-05 lambda=1.3743743531800879e-02
      Line search: Cubic step no good, shrinking lambda, current gnorm 3.861215022840e-05 lambda=1.7745249046632059e-03
      Line search: Cubic step no good, shrinking lambda, current gnorm 3.844753642683e-05 lambda=7.5447948937894130e-04
      Line search: Cubic step, current gnorm 3.842880587577e-05 lambda=3.2257737653837172e-04
 10 SNES Function norm 3.842880587577e-05
      Line search: gnorm after quadratic fit 7.124009708351e-04
      Line search: Cubic step no good, shrinking lambda, current gnorm 6.211517356021e-05 lambda=1.0000000000000002e-02
      Line search: Cubic step no good, shrinking lambda, current gnorm 4.081388598866e-05 lambda=2.1864820647834586e-03
      Line search: Cubic step no good, shrinking lambda, current gnorm 3.867634073763e-05 lambda=6.7055719398769690e-04
      Line search: Cubic step no good, shrinking lambda, current gnorm 3.846171369421e-05 lambda=2.6001695016133358e-04
      Line search: Cubic step no good, shrinking lambda, current gnorm 3.843222875083e-05 lambda=1.0855743155775638e-04
      Line search: Cubic step, current gnorm 3.842842899864e-05 lambda=4.6855315717939955e-05
 11 SNES Function norm 3.842842899864e-05
      Line search: gnorm after quadratic fit 3.782867420653e-04
      Line search: Cubic step no good, shrinking lambda, current gnorm 1.753448848275e-04 lambda=2.5498498518563135e-02
      Line search: Cubic step no good, shrinking lambda, current gnorm 5.024572000043e-05 lambda=2.5498498518563137e-03
      Line search: Cubic step no good, shrinking lambda, current gnorm 3.871546908516e-05 lambda=4.5497575847564035e-04
      Line search: Cubic step no good, shrinking lambda, current gnorm 3.846787012924e-05 lambda=1.8100820906010329e-04
      Line search: Cubic step no good, shrinking lambda, current gnorm 3.843328516461e-05 lambda=7.4395238027712187e-05
      Line search: Cubic step no good, shrinking lambda, current gnorm 3.842861503434e-05 lambda=3.1946924779133244e-05
      Line search: Cubic step, current gnorm 3.842816174938e-05 lambda=1.3900046154900035e-05
 12 SNES Function norm 3.842816174938e-05
      Line search: gnorm after quadratic fit 1.167884778503e-03
      Line search: Cubic step no good, shrinking lambda, current gnorm 1.042292162423e-03 lambda=7.1199536502177807e-02
      Line search: Cubic step no good, shrinking lambda, current gnorm 8.394103796683e-04 lambda=7.1199536502177807e-03
      Line search: Cubic step no good, shrinking lambda, current gnorm 1.036703525451e-04 lambda=7.1199536502177809e-04
      Line search: Cubic step no good, shrinking lambda, current gnorm 4.000059097763e-05 lambda=7.8088935424280639e-05
      Line search: Cubic step no good, shrinking lambda, current gnorm 3.863361625650e-05 lambda=2.6591591307735391e-05
      Line search: Cubic step no good, shrinking lambda, current gnorm 3.845932856365e-05 lambda=1.0201691774978775e-05
      Line search: Cubic step no good, shrinking lambda, current gnorm 3.843348875953e-05 lambda=4.2261630048778534e-06
      Line search: Cubic step no good, shrinking lambda, current gnorm 3.842909185572e-05 lambda=1.7981659786445087e-06
      Line search: Cubic step no good, shrinking lambda, current gnorm 3.842831777645e-05 lambda=7.7449034395660415e-07
      Line search: Cubic step no good, shrinking lambda, current gnorm 3.842818371964e-05 lambda=3.3529367003636551e-07
      Line search: Cubic step no good, shrinking lambda, current gnorm 3.842816272348e-05 lambda=1.4548158070858498e-07
      Line search: Cubic step, current gnorm 3.842816055982e-05 lambda=6.3184590018146531e-08
 13 SNES Function norm 3.842816055982e-05
      Line search: gnorm after quadratic fit 7.491735251408e-04
      Line search: Cubic step no good, shrinking lambda, current gnorm 7.390303415481e-04 lambda=2.0140184766985056e-01
      Line search: Cubic step no good, shrinking lambda, current gnorm 6.747266865401e-04 lambda=8.1414650495907584e-02
      Line search: Cubic step no good, shrinking lambda, current gnorm 6.619180792030e-04 lambda=3.0467645774099179e-02
      Line search: Cubic step no good, shrinking lambda, current gnorm 5.966592967631e-04 lambda=9.3981974014514368e-03
      Line search: Cubic step no good, shrinking lambda, current gnorm 4.364486289477e-04 lambda=2.0381922093927257e-03
      Line search: Cubic step no good, shrinking lambda, current gnorm 1.976614510008e-04 lambda=2.7285681824273862e-04
      Line search: Cubic step no good, shrinking lambda, current gnorm 1.027865187383e-04 lambda=2.9322952434138459e-05
      Line search: Cubic step no good, shrinking lambda, current gnorm 3.875568437960e-05 lambda=2.9322952434138460e-06
      Line search: Cubic step no good, shrinking lambda, current gnorm 3.848834703180e-05 lambda=1.2071557723144175e-06
      Line search: Cubic step no good, shrinking lambda, current gnorm 3.843751888687e-05 lambda=4.8062888419216410e-07
      Line search: Cubic step no good, shrinking lambda, current gnorm 3.842982704946e-05 lambda=2.0380555158233055e-07
      Line search: Cubic step no good, shrinking lambda, current gnorm 3.842846438613e-05 lambda=8.7425095496337740e-08
      Line search: Cubic step no good, shrinking lambda, current gnorm 3.842821640180e-05 lambda=3.7780026973902508e-08
      Line search: Cubic step no good, shrinking lambda, current gnorm 3.842817068329e-05 lambda=1.6371282685329661e-08
      Line search: Cubic step no good, shrinking lambda, current gnorm 3.842816231058e-05 lambda=7.1031696202464477e-09
      Line search: Cubic step no good, shrinking lambda, current gnorm 3.842816082266e-05 lambda=3.0835719808204784e-09
      Line search: Cubic step no good, shrinking lambda, current gnorm 3.842816058027e-05 lambda=1.3389299179522624e-09
      Line search: Cubic step, current gnorm 3.842816055104e-05 lambda=5.8144099541950351e-10
 14 SNES Function norm 3.842816055104e-05
      Line search: gnorm after quadratic fit 1.250222308787e-03
      Line search: Cubic step no good, shrinking lambda, current gnorm 1.220783521340e-03 lambda=2.0317535172258488e-01
      Line search: Cubic step no good, shrinking lambda, current gnorm 1.208756251197e-03 lambda=8.3376986436503098e-02
      Line search: Cubic step no good, shrinking lambda, current gnorm 1.183716093225e-03 lambda=3.1430326072906002e-02
      Line search: Cubic step no good, shrinking lambda, current gnorm 1.168506323565e-03 lambda=9.9406659783994964e-03
      Line search: Cubic step no good, shrinking lambda, current gnorm 1.052481011441e-03 lambda=2.0613443070930109e-03
      Line search: Cubic step no good, shrinking lambda, current gnorm 8.802687271488e-04 lambda=2.0613443070930109e-04
      Line search: Cubic step no good, shrinking lambda, current gnorm 1.244635385798e-04 lambda=2.0613443070930111e-05
      Line search: Cubic step no good, shrinking lambda, current gnorm 4.006036835751e-05 lambda=2.0613443070930114e-06
      Line search: Cubic step no good, shrinking lambda, current gnorm 3.864296106951e-05 lambda=7.0254916074805066e-07
      Line search: Cubic step no good, shrinking lambda, current gnorm 3.846076120181e-05 lambda=2.6848217695253528e-07
      Line search: Cubic step no good, shrinking lambda, current gnorm 3.843381394545e-05 lambda=1.1106298838579143e-07
      Line search: Cubic step no good, shrinking lambda, current gnorm 3.842918624804e-05 lambda=4.7200112506217219e-08
      Line search: Cubic step no good, shrinking lambda, current gnorm 3.842835046169e-05 lambda=2.0310046571141706e-08
      Line search: Cubic step no good, shrinking lambda, current gnorm 3.842819592438e-05 lambda=8.7847707638396658e-09
      Line search: Cubic step no good, shrinking lambda, current gnorm 3.842816711896e-05 lambda=3.8083443956472729e-09
      Line search: Cubic step no good, shrinking lambda, current gnorm 3.842816175210e-05 lambda=1.6525990313489356e-09
      Line search: Cubic step no good, shrinking lambda, current gnorm 3.842816076181e-05 lambda=7.1743702935072449e-10
      Line search: Cubic step no good, shrinking lambda, current gnorm 3.842816058400e-05 lambda=3.1151598790472183e-10
      Line search: Cubic step no good, shrinking lambda, current gnorm 3.842816055431e-05 lambda=1.3527319676198689e-10
      Line search: Cubic step, current gnorm 3.842816055038e-05 lambda=5.8743294806628971e-11
 15 SNES Function norm 3.842816055038e-05
      Line search: gnorm after quadratic fit 8.433486820310e-04
      Line search: Cubic step no good, shrinking lambda, current gnorm 7.777369701190e-04 lambda=2.0938734818969490e-01
      Line search: Cubic step no good, shrinking lambda, current gnorm 7.574347381413e-04 lambda=9.0216946281952759e-02
      Line search: Cubic step no good, shrinking lambda, current gnorm 7.391571726196e-04 lambda=3.8069121240918116e-02
      Line search: Cubic step no good, shrinking lambda, current gnorm 6.887686634841e-04 lambda=1.5549071654073640e-02
      Line search: Cubic step no good, shrinking lambda, current gnorm 6.621476338712e-04 lambda=5.9661649771622256e-03
      Line search: Cubic step no good, shrinking lambda, current gnorm 6.242306885689e-04 lambda=1.9719676901428650e-03
      Line search: Cubic step no good, shrinking lambda, current gnorm 5.141314811656e-04 lambda=4.7446556122049741e-04
      Line search: Cubic step no good, shrinking lambda, current gnorm 2.698659348748e-04 lambda=6.7078373908598240e-05
      Line search: Cubic step no good, shrinking lambda, current gnorm 1.362762307775e-04 lambda=6.7078373908598247e-06
      Line search: Cubic step no good, shrinking lambda, current gnorm 3.902337725263e-05 lambda=6.7078373908598251e-07
      Line search: Cubic step no good, shrinking lambda, current gnorm 3.856251259983e-05 lambda=2.6863712578205769e-07
      Line search: Cubic step no good, shrinking lambda, current gnorm 3.844702869736e-05 lambda=1.0207202371982369e-07
      Line search: Cubic step no good, shrinking lambda, current gnorm 3.843146350515e-05 lambda=4.2924607007202327e-08
      Line search: Cubic step no good, shrinking lambda, current gnorm 3.842875913172e-05 lambda=1.8317343619445171e-08
      Line search: Cubic step no good, shrinking lambda, current gnorm 3.842827152397e-05 lambda=7.9000573768686962e-09
      Line search: Cubic step no good, shrinking lambda, current gnorm 3.842818125915e-05 lambda=3.4201281085073670e-09
      Line search: Cubic step no good, shrinking lambda, current gnorm 3.842816441189e-05 lambda=1.4832788568769878e-09
      Line search: Cubic step no good, shrinking lambda, current gnorm 3.842816126365e-05 lambda=6.4376304681222138e-10
      Line search: Cubic step no good, shrinking lambda, current gnorm 3.842816067874e-05 lambda=2.7949309466259966e-10
      Line search: Cubic step no good, shrinking lambda, current gnorm 3.842816057194e-05 lambda=1.2136050297613723e-10
      Line search: Cubic step no good, shrinking lambda, current gnorm 3.842816055330e-05 lambda=5.2699961584398488e-11
      Line search: Cubic step no good, shrinking lambda, current gnorm 3.842816055043e-05 lambda=2.2885204129298345e-11
      Line search: Cubic step, current gnorm 3.842816055017e-05 lambda=9.9381215539508874e-12
 16 SNES Function norm 3.842816055017e-05
      Line search: gnorm after quadratic fit 9.417729582212e-04
      Line search: Cubic step no good, shrinking lambda, current gnorm 9.327372538259e-04 lambda=2.1128177663821060e-01
      Line search: Cubic step no good, shrinking lambda, current gnorm 9.103272498704e-04 lambda=9.2147414159369209e-02
      Line search: Cubic step no good, shrinking lambda, current gnorm 8.801563201016e-04 lambda=3.9954876613593898e-02
      Line search: Cubic step no good, shrinking lambda, current gnorm 8.680898877741e-04 lambda=1.7326662542833934e-02
      Line search: Cubic step no good, shrinking lambda, current gnorm 8.282121234920e-04 lambda=7.4981743877982326e-03
      Line search: Cubic step no good, shrinking lambda, current gnorm 7.749864511858e-04 lambda=3.2329087427482293e-03
      Line search: Cubic step no good, shrinking lambda, current gnorm 7.511982376434e-04 lambda=1.3838255987209352e-03
      Line search: Cubic step no good, shrinking lambda, current gnorm 7.389928861275e-04 lambda=5.8224961646162693e-04
      Line search: Cubic step no good, shrinking lambda, current gnorm 6.785807141368e-04 lambda=2.3550937647395803e-04
      Line search: Cubic step no good, shrinking lambda, current gnorm 6.618887664181e-04 lambda=8.9016022288729350e-05
      Line search: Cubic step no good, shrinking lambda, current gnorm 6.095850778934e-04 lambda=2.8158164281248304e-05
      Line search: Cubic step no good, shrinking lambda, current gnorm 4.576540058800e-04 lambda=6.3034014764665732e-06
      Line search: Cubic step no good, shrinking lambda, current gnorm 2.174868636082e-04 lambda=8.7073763151535497e-07
      Line search: Cubic step no good, shrinking lambda, current gnorm 1.217426042880e-04 lambda=9.1900511279966858e-08
      Line search: Cubic step no good, shrinking lambda, current gnorm 3.881140700211e-05 lambda=9.1900511279966868e-09
      Line search: Cubic step no good, shrinking lambda, current gnorm 3.851307756448e-05 lambda=3.8099730787171751e-09
      Line search: Cubic step no good, shrinking lambda, current gnorm 3.844075285373e-05 lambda=1.4831797684328665e-09
      Line search: Cubic step no good, shrinking lambda, current gnorm 3.843039545182e-05 lambda=6.2737304287586501e-10
      Line search: Cubic step no good, shrinking lambda, current gnorm 3.842856860396e-05 lambda=2.6853272194853986e-10
      Line search: Cubic step no good, shrinking lambda, current gnorm 3.842823651986e-05 lambda=1.1595263441129459e-10
      Line search: Cubic step no good, shrinking lambda, current gnorm 3.842817479359e-05 lambda=5.0225000068223459e-11
      Line search: Cubic step no good, shrinking lambda, current gnorm 3.842816322915e-05 lambda=2.1786861546644922e-11
      Line search: Cubic step no good, shrinking lambda, current gnorm 3.842816105463e-05 lambda=9.4566270195625454e-12
      Line search: Cubic step no good, shrinking lambda, current gnorm 3.842816064517e-05 lambda=4.1057748342355101e-12
      Line search: Cubic step no good, shrinking lambda, current gnorm 3.842816056804e-05 lambda=1.7828083088648780e-12
      Line search: Cubic step no good, shrinking lambda, current gnorm 3.842816055352e-05 lambda=7.7416976990893052e-13
      Line search: unable to find good step length! After 26 tries 
      Line search: fnorm=3.8428160550171348e-05, gnorm=3.8428160553524609e-05, ynorm=2.5393148093385227e+07, minlambda=9.9999999999999998e-13, lambda=7.7416976990893052e-13, initial slope=-8.1619805395919797e-03

First, make sure that you copy over phi_copy into the phi function, if this is intended to be used as initial state/guess for the next iterate.

Looking at the SNES line search reports, this looks like line search is working correctly, but it is unable to find a step size. It could suggest a loss of elipticity in your system (for example Jacobian matrix becoming singular). I also see that you have no boundary conditions applied, but for the case where term_double_well == driving_force you only have the Laplace operator and boundary conditions are required to make system matrix regular. Try to print the norm of (term_double_well - driving_force) inside SNES, for example in the F() callback.

1 Like

Thank you for looking into this!
I’ve tried adding

phi.x.array[:] = phi_copy.array[:].copy()

after my solve, and removing

phi.x.array[:] = 0

from my solver loop.

Projecting term_double_well and driving_force into my FS_PF space and printing their values shows that they are quite different, one in the range [-2.3, 15.2], the other in the range [-0.14, 0.14], resulting in a large norm difference too.

The problem ideally shouldn’t have any boundary conditions associated with it.