You should add VecZeroEntries(f) near the top of your FormFunction (it's currently accumulating into whatever was there last) and MatZeroEntries(B) to FormJacobian.
I reduced to nElem = 5 for ease of viewing. With these changes, I see quadratic convergence but the problem is still nonlinear. To explore further, consider using these diagnostics ./SNES_heat -{snes,ksp}_monitor -{snes,ksp}_converged_reason -snes_linesearch_monitor -ksp_view_mat with and without -snes_fd. For readability, I would suggest consistency in "u" vs "x". "David Jiawei LUO LIANG" <12431...@mail.sustech.edu.cn> writes: > I am using the Newton iteration to solve a nonlinear 1D heat equation problem > by using FEM. > > > I attached my source code named "SNES_heat.cpp" > > > when I run the code > > 0 SNES Function norm 1.206289245288e+01 > > 1 SNES Function norm 7.128802192789e+00 > > 2 SNES Function norm 6.608812909525e+00 > > > > you can find that it only iterate 3 steps, and then do all the function > evaluation and finally just stop the program. > > > I think it is not reasonble. I check my code, it is correct if I set it as a > linear problem. it means my Jacobian and Residual function is correct. > > > But when I set it as a nonlinear, the residual seems reduces as not > expected. > > > I doubt that whether my understanding of the newton iteration is different > from SNES's newton iteration process. > > > > > > > > > David Jiawei LUO LIANG > > > > 南方科技大学/学生/研究生/2024 > > > > 广东省深圳市南山区学苑大道1088号 > > > > >