This is a collection of many interacting patches that help to ensure monotonicity of the TNNMG iteration and add more diagnostic output to track the latter:
ScalarSumFunctional::operator()in a way that is consistent with the global energy evaluation. Unfortunately this means we cannot use the evaluation of the individual constrained functionals.
derivative(ScalarSumFunctional). The functional is in general not differentiable, hence we return the minimal norm entry of the subdifferential or, equivalently, the projection of zero into the subdifferential. Finding a root of the subdifferential is equivalent to find a root of this single-valued map. Furthermore a subdifferential-aware bisection is equivalent to a bisection for the single-valued map.
- To ensure monotonicity of the coarse grid correction add a postprocessing step to the line search: After an approximate root of the derivative has been found, check if this decreases energy. If not, then half the step size until it does. Since we have a descent direction this must terminate. This step is necessary because the functional is not convex.
- When comparing energies take care to always evaluate it exactly the same way, to avoid non-monotonicity due to inconsistent evaluation algorithms.
- Track energy decrease of nonlinear smoother and coarse grid correction. While the latter is guaranteed by the above changes, it may happen that the smoother is not monotone - either because of local solves with uncontrolled inexactness (called exact in our terminalogy, arg...) or because of round-off-errors.
- Add more diagnostic output to the table:
- Number of subdifferential evaluations during line search. Hint on interpretation: This will be at least 2+#bisectionSteps.
- Number of functional evaluations during line search. Hint on interpretation: This will be 2+#reductionSteps, where #reductionSteps is the number of halving steps done to ensure monotonicity (see above).
- Energy after TNNMG step with 16 digits.
- Energy after nonlinear pre-smoothing with 16 digits.
- If the nonlinear pre-smoother is not monotone:
Relative monotonicity violation of the smoother with an additional
Xmarker for easier grepping.