Post by Zou (Non-US), LingMatt, thanks for the reply.
The simulation is a transient simulation, which eventually converges to a steady-state solution, given enough simulation time.
My code runs fine and I could tell the simulation reaches steady state by looking at the residual monitored by SNES monitor function.
See an example screen output
Solving time step 90, using BDF1, dt = 0.1.
Current time (the starting time of this time step) = 8.85.
NL step = 0, SNES Function norm = 1.47538E-02
NL step = 1, SNES Function norm = 8.06971E-04
total_FunctionCall_number: 0
converged, time step increased = 0.1
Solving time step 91, using BDF1, dt = 0.1.
Current time (the starting time of this time step) = 8.95.
NL step = 0, SNES Function norm = 1.10861E-02
NL step = 1, SNES Function norm = 6.26584E-04
total_FunctionCall_number: 0
converged, time step increased = 0.1
Solving time step 92, using BDF1, dt = 0.1.
Current time (the starting time of this time step) = 9.05.
NL step = 0, SNES Function norm = 7.21253E-03
NL step = 1, SNES Function norm = 9.93402E-04
total_FunctionCall_number: 0
converged, time step increased = 0.1
Solving time step 93, using BDF1, dt = 0.1.
Current time (the starting time of this time step) = 9.15.
NL step = 0, SNES Function norm = 5.40260E-03
NL step = 1, SNES Function norm = 6.21162E-04
total_FunctionCall_number: 0
converged, time step increased = 0.1
Solving time step 94, using BDF1, dt = 0.1.
Current time (the starting time of this time step) = 9.25.
NL step = 0, SNES Function norm = 3.40214E-03
NL step = 1, SNES Function norm = 6.16805E-04
total_FunctionCall_number: 0
converged, time step increased = 0.1
Solving time step 95, using BDF1, dt = 0.1.
Current time (the starting time of this time step) = 9.35.
NL step = 0, SNES Function norm = 2.29656E-03
NL step = 1, SNES Function norm = 6.19337E-04
total_FunctionCall_number: 0
converged, time step increased = 0.1
Solving time step 96, using BDF1, dt = 0.1.
Current time (the starting time of this time step) = 9.45.
NL step = 0, SNES Function norm = 1.53218E-03
NL step = 1, SNES Function norm = 5.94845E-04
total_FunctionCall_number: 0
converged, time step increased = 0.1
Solving time step 97, using BDF1, dt = 0.1.
Current time (the starting time of this time step) = 9.55.
NL step = 0, SNES Function norm = 1.32136E-03
NL step = 1, SNES Function norm = 6.19933E-04
total_FunctionCall_number: 0
converged, time step increased = 0.1
Solving time step 98, using BDF1, dt = 0.1.
Current time (the starting time of this time step) = 9.65.
NL step = 0, SNES Function norm = 7.09342E-04
NL step = 1, SNES Function norm = 6.18694E-04
total_FunctionCall_number: 0
converged, time step increased = 0.1
Solving time step 99, using BDF1, dt = 0.1.
Current time (the starting time of this time step) = 9.75.
NL step = 0, SNES Function norm = 5.49192E-04
total_FunctionCall_number: 0
converged, time step increased = 0.1
Solving time step 100, using BDF1, dt = 0.1.
Current time (the starting time of this time step) = 9.85.
NL step = 0, SNES Function norm = 5.49192E-04
total_FunctionCall_number: 0
converged, time step increased = 0.1
Solving time step 101, using BDF1, dt = 0.1.
Current time (the starting time of this time step) = 9.95.
NL step = 0, SNES Function norm = 5.49192E-04
total_FunctionCall_number: 0
I observed that after time step 99, the residual never changed, so I believe the transient simulation converges at time step 99.
I wonder can I use the criterion "SNES converges and it takes 0 iteration" to say the simulation reaches a steady state. Such that I don't have to look at the screen and the code knows it converges and should stop.
Put it another way, what's the common way people would implement a scheme to detect a transient simulation reaches steady state.
I don't think so. The above makes no sense to me. You are signaling SNES convergence with a relative
residual norm of 5e-4? That does not sound precise enough to me.
I would argue that number (5.e-4) depends on the problem you are solving (actually I am solving).
The initial residual of the problem starts at ~1e8.
But you might be right, and I have to think about this issue more carefully.
As I said, I think the believable way to find steady states is to look for solutions to the algebraic equations,
perhaps by using timestepping as a preconditioner.
You still need a numerical criterion to let the code understand it converges, right? For example, "a set of solutions have already been found to satisfy the algebraic equations because ___residuals drops below (a number here)__".
After each SNESSolve you could call SNESGetConvergedReason() and if the number of iterations was 0 and the reason was snorm then declare it steady state.