1. 02 Jun, 2022 1 commit
  2. 01 Jun, 2022 3 commits
  3. 23 May, 2022 2 commits
  4. 21 May, 2022 4 commits
  5. 20 May, 2022 3 commits
  6. 19 May, 2022 3 commits
  7. 18 May, 2022 7 commits
    • Gräser, Carsten's avatar
      Merge branch 'feature/ensure-monotonocity' into 'master' · 749a5bbe
      Gräser, Carsten authored
      Ensure and track monotonicity
      See merge request !51
    • 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
      * 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.
    • Gräser, Carsten's avatar
      Extend and improve IntegralFunctionalDirectionalRestriction · d1a5767b
      Gräser, Carsten authored
      * Export origin and direction
      * Cache and use evaluation matrix times origin
      * Implement `operator()`
    • Sander, Oliver's avatar
      Merge branch 'modularize-spectrally-degraded-energy' into 'master' · b7e0f05b
      Sander, Oliver authored
      Modularize the Decomposed::DamagedElasticEnergyDensity class
      See merge request !50
    • Sander, Oliver's avatar
      Use the linear AT-1 term assembled by CrackSurfaceAssembler · 4dadee14
      Sander, Oliver authored
      Previously, we would use the CrackSurfaceAssembler class to assemble
      the linear term of the crack surface density functional that appears
      in the AT-1 model, and then throw it away.  The actual computation
      would get the term from the DamagedElasticEnergyDensity implementations.
      However, conceptually that linear term doesn't really have anything
      to do the the damaged elastic energy density.  Therefore, as a
      cleanup measure, remove the AT-1 term from the damaged elastic energy
      density implementations.
    • Sander, Oliver's avatar
    • Sander, Oliver's avatar
      Move the split function in spectral coordinates into a separate file · 4494e98d
      Sander, Oliver authored
      The current Decomposed::DamagedElasticEnergyDensity class does too many
      things together:
      a) It implements the St.Venant-Kirchhoff density in terms of the strain
         eigenvalues, split into tensile and compressive parts as described
         by Miehe, Welschinger, Hofacker.
      b) It degrades the tensile part with a hard-wired degradation function.
      c) It transforms the degraded density and its gradient and Hesse matrix
         from spectral to physical coordinates.
      This patch modularizes a): It introduces a separate class MieheSplitting
      that only computes the positive and negative parts of the St.Venant-
      Kirchhoff density in spectral coordinates (and the gradient and
      Hesse matrix).
  8. 16 May, 2022 2 commits
  9. 07 May, 2022 7 commits
    • Sander, Oliver's avatar
      Merge branch 'spectral-speedup-patches' into 'master' · 923098cb
      Sander, Oliver authored
      Patches to speed up TNNMG for materials with a spectral split.
      See merge request !48
    • Sander, Oliver's avatar
      Remove the trEps method · fa151a36
      Sander, Oliver authored
      Instead, simply sum the eigenvalues to get the trace
      of the strain matrix.
    • Sander, Oliver's avatar
      Add non-blocked Density::gradientHessian method · 7e59fd36
      Sander, Oliver authored
      ... and use it in IntegralFunctionalConstrainedLinearization::bind.
      This saves another 5% for the model with the spectrally split
      energy density.
    • Sander, Oliver's avatar
    • Sander, Oliver's avatar
      Local solver: Compute density gradient and Hessian in one go · e06e72c6
      Sander, Oliver authored
      Previously, computing the gradient and the Hesse matrix of the energy
      density where two separate operations.  For the spectrally split
      density this was wasteful, because each call involved an expensive
      eigenvector decomposition.  This commit introduces a new method
      called 'gradientHessian' which returns both first and second
      derivatives together.  That way, the eigendecomposition is
      done only once, and run-time is saved.
    • Sander, Oliver's avatar
      Refactor spectrally split energy density · 389a7f58
      Sander, Oliver authored
      This patch does a lot of refactoring which, to my eyes,
      makes the code easier to understand.
      Also, it adds documentation for the transformation rules
      for spectral functions.  These rules are nontrivial, and we
      need to state where they were taken from.
      This patch adds the references to a paper by
      Lewis and Sendov, which derives and explains the formulas.
    • Sander, Oliver's avatar
      Allow to compute local gradient and Hesse matrix together · 36f1462e
      Sander, Oliver authored
      This can be considerably more efficient, because the two methods
      sometimes share a considerable amount of code.
      The prime example for this is the energy density of a degraded
      elastic material with a spectral split.  In that situation,
      both the gradient and the Hesse matrix implementations need
      an eigenvector decomposition of the strain, which is quite
      expensive.  With the new code, the eigenvector decomposition
      is computed only once and used for both the gradient and
      the Hesse matrix.
  10. 06 May, 2022 5 commits
  11. 12 Apr, 2022 2 commits
  12. 08 Apr, 2022 1 commit
    • Sander, Oliver's avatar
      Use a block-diagonal matrix for evaluation matrix blocks · 370f8cca
      Sander, Oliver authored
      The blocks of the evaluation matrix are sparse.  In particular,
      they have a block-diagonal structure.  Previously, the implementation
      used a FieldMatrix for these blocks.  Which, in theory, is wasteful
      because of the matrix sparsity.
      This commit introduces a block-diagonal matrix with compile-time size
      for this.
      Unfortunately, initial tests do not show any speedup.