Skip to content
  • Gräser, Carsten's avatar
    Ensure and track monotonicity · 81ace1e1
    Gräser, Carsten authored
    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.
    81ace1e1