Good morning,
I have a problem with NonlinearVariationalProblem. I have a quite complicated problem, and I want to solve it. The problem is that I have sensible results for some ranges of parameters, while I have no convergence if I change them.
I try to summarize my problem, but for sure it won’t be exaustive.
P2 = VectorElement("Lagrange", mesh.ufl_cell(), 1) # displacement u
U2 = FunctionSpace(mesh, P2) #u
TT = TensorFunctionSpace(mesh, 'DG', 0)
# Incremental displacement
du = TrialFunction(U2)
# Test functions for displacement
q_v = TestFunction(U2)
# Displacement and pressure (current value)
u = Function(U2)
# Displacement and pressure (previous iteration)
u_prev = Function(U2)
J = Jacobian(u)
P = P_s(u, g1, g2, g3, eig_1, eig_2, eig_3, mu1, mu2) # First Piola Kirchoff tensor
k = Constant(2.17e06)
K = as_matrix([ [k, 0, 0], [0, k, 0], [0, 0, k] ])
deltat = Constant(dt)
L = dot(J*u,q_v)*dx - dot(J*u_prev,q_v)*dx - deltat*inner(P, Grad(K.T*q_v))*dx
j = derivative(L, u, du)
problem = NonlinearVariationalProblem(L, u, bcu, J=j)
solver = NonlinearVariationalSolver(problem)
prm = solver.parameters
info(prm, True)
prm['nonlinear_solver'] = 'snes'
prm['snes_solver']['line_search'] = 'bt'
#prm['snes_solver']['absolute_tolerance'] = 1E-8
#prm['snes_solver']['relative_tolerance'] = 1E-7
prm['snes_solver']['maximum_iterations'] = 100
#prm['snes_solver']['relaxation_parameter'] = 1.0
prm['snes_solver']['linear_solver'] = 'mumps'
#prm['snes_solver']['linear_solver'] = 'gmres'
prm['snes_solver']['error_on_nonconvergence'] = False
#prm['snes_solver']['preconditioner'] = 'hypre_amg'
#prm['snes_solver']['krylov_solver']['absolute_tolerance'] = 1E-9
#prm['snes_solver']['krylov_solver']['relative_tolerance'] = 1E-7
#prm['newton_solver']['krylov_solver']['maximum_iterations'] = 1000
prm['snes_solver']['krylov_solver']['monitor_convergence'] = True
#prm['newton_solver']['krylov_solver']['nonzero_initial_guess'] = True
#prm['newton_solver']['krylov_solver']['gmres']['restart'] = 40
#prm['newton_solver']['krylov_solver']['preconditioner']['same_nonzero_pattern'] = True
#prm['newton_solver']['krylov_solver']['preconditioner']['ilu']['fill_level'] = 0
If I use big value of k (order of magnitude e06) and deltat I obtain sensible results, otherwise it does not converge (for example using k=Constant(2.17e05)).
The problem is that I need to use smaller values. Have you any suggestions? I think is a numerical problem, do you know other ways to solve the non linear variational problem?