Ensure and track monotonicity

Merged Gräser, Carsten requested to merge feature/ensure-monotonocity into master

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:

  • Implement 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.
  • Implement 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 X marker for easier grepping.

Merge request reports