www.mooseframework.org
SingleVariableReturnMappingSolution.h
Go to the documentation of this file.
1 //* This file is part of the MOOSE framework
2 //* https://www.mooseframework.org
3 //*
4 //* All rights reserved, see COPYRIGHT for full restrictions
5 //* https://github.com/idaholab/moose/blob/master/COPYRIGHT
6 //*
7 //* Licensed under LGPL 2.1, please see LICENSE for details
8 //* https://www.gnu.org/licenses/lgpl-2.1.html
9 
10 #pragma once
11 
12 #include "MooseTypes.h"
13 #include "DualRealOps.h"
14 #include "ChainedReal.h"
15 #include "ChainedADReal.h"
16 #include "InputParameters.h"
17 
18 class ConsoleStream;
19 
24 template <bool is_ad>
26 {
27 public:
29 
32 
33 protected:
40  void returnMappingSolve(const GenericReal<is_ad> & effective_trial_stress,
41  GenericReal<is_ad> & scalar,
42  const ConsoleStream & console);
43 
49  virtual GenericReal<is_ad>
50  minimumPermissibleValue(const GenericReal<is_ad> & effective_trial_stress) const;
51 
57  virtual GenericReal<is_ad>
58  maximumPermissibleValue(const GenericReal<is_ad> & effective_trial_stress) const;
59 
67  virtual GenericReal<is_ad> initialGuess(const GenericReal<is_ad> & /*effective_trial_stress*/)
68  {
69  return 0.0;
70  }
71 
78  virtual GenericReal<is_ad> computeResidual(const GenericReal<is_ad> & /*effective_trial_stress*/,
79  const GenericReal<is_ad> & /*scalar*/) = 0;
80 
87  virtual GenericReal<is_ad>
88  computeDerivative(const GenericReal<is_ad> & /*effective_trial_stress*/,
89  const GenericReal<is_ad> & /*scalar*/) = 0;
90 
98  computeResidualAndDerivative(const GenericReal<is_ad> & /*effective_trial_stress*/,
99  const GenericChainedReal<is_ad> & /*scalar*/)
100  {
101  mooseError("computeResidualAndDerivative has to be implemented if "
102  "automatic_differentiation_return_mapping = true.");
103  return 0;
104  };
105 
112  virtual Real computeReferenceResidual(const GenericReal<is_ad> & effective_trial_stress,
113  const GenericReal<is_ad> & scalar) = 0;
114 
119  virtual void preStep(const GenericReal<is_ad> & /*scalar_old*/,
120  const GenericReal<is_ad> & /*residual*/,
121  const GenericReal<is_ad> & /*jacobian*/)
122  {
123  }
124 
129  virtual void iterationFinalize(const GenericReal<is_ad> & /*scalar*/) {}
130 
136  virtual void outputIterationSummary(std::stringstream * iter_output, const unsigned int total_it);
137 
140 
143 
147 
155  virtual void outputIterationStep(std::stringstream * iter_output,
156  const GenericReal<is_ad> & effective_trial_stress,
157  const GenericReal<is_ad> & scalar,
158  const Real reference_residual);
159 
166  bool converged(const GenericReal<is_ad> & residual, const Real reference);
167 
168 private:
170  void computeResidualAndDerivativeHelper(const GenericReal<is_ad> & effective_trial_stress,
171  const GenericReal<is_ad> & scalar);
172 
174  {
175  NEVER,
176  ON_ERROR,
177  ALWAYS
179 
180  enum class SolveState
181  {
182  SUCCESS,
183  NAN_INF,
185  };
186 
189  const unsigned int _max_its;
190 
193 
196 
199 
202 
203  // Whether to use automatic differentiation to calculate the derivative. If set to false, you must
204  // override both computeResidual and computeDerivative methods. If set to true, you must override
205  // the computeResidualAndDerivative method.
206  const bool _ad_derivative;
207 
209  const std::size_t _num_resids;
210 
212  std::vector<Real> _residual_history;
213 
215  unsigned int _iteration;
216 
221 
224 
226  const std::string _svrms_name;
227 
235  SolveState internalSolve(const GenericReal<is_ad> effective_trial_stress,
236  GenericReal<is_ad> & scalar,
237  std::stringstream * iter_output = nullptr);
238 
248  bool convergedAcceptable(const unsigned int it, const Real reference);
249 
261  GenericReal<is_ad> & scalar_increment,
262  const GenericReal<is_ad> & scalar_old,
263  const GenericReal<is_ad> min_permissible_scalar,
264  const GenericReal<is_ad> max_permissible_scalar,
265  std::stringstream * iter_output);
266 
276  void updateBounds(const GenericReal<is_ad> & scalar,
277  const GenericReal<is_ad> & residual,
278  const Real init_resid_sign,
279  GenericReal<is_ad> & scalar_upper_bound,
280  GenericReal<is_ad> & scalar_lower_bound,
281  std::stringstream * iter_output);
282 };
283 
bool _line_search
Whether to use line searches to improve convergence.
Real _acceptable_multiplier
Multiplier applied to relative and absolute tolerances for acceptable convergence.
virtual GenericReal< is_ad > computeDerivative(const GenericReal< is_ad > &, const GenericReal< is_ad > &)=0
Compute the derivative of the residual as a function of the scalar variable.
virtual void outputIterationStep(std::stringstream *iter_output, const GenericReal< is_ad > &effective_trial_stress, const GenericReal< is_ad > &scalar, const Real reference_residual)
Output information for a single iteration step to build the convergence history of the model...
std::vector< Real > _residual_history
History of residuals used to check whether progress is still being made on decreasing the residual...
virtual GenericReal< is_ad > maximumPermissibleValue(const GenericReal< is_ad > &effective_trial_stress) const
Compute the maximum permissible value of the scalar.
void mooseError(Args &&... args)
bool convergedAcceptable(const unsigned int it, const Real reference)
Check to see whether the residual is within acceptable convergence limits.
Real _relative_tolerance
Relative convergence tolerance.
virtual void preStep(const GenericReal< is_ad > &, const GenericReal< is_ad > &, const GenericReal< is_ad > &)
This method is called before taking a step in the return mapping algorithm.
SolveState internalSolve(const GenericReal< is_ad > effective_trial_stress, GenericReal< is_ad > &scalar, std::stringstream *iter_output=nullptr)
Method called from within this class to perform the actual return mappping iterations.
const unsigned int _max_its
Maximum number of return mapping iterations.
void checkPermissibleRange(GenericReal< is_ad > &scalar, GenericReal< is_ad > &scalar_increment, const GenericReal< is_ad > &scalar_old, const GenericReal< is_ad > min_permissible_scalar, const GenericReal< is_ad > max_permissible_scalar, std::stringstream *iter_output)
Check to see whether solution is within admissible range, and set it within that range if it is not...
void updateBounds(const GenericReal< is_ad > &scalar, const GenericReal< is_ad > &residual, const Real init_resid_sign, GenericReal< is_ad > &scalar_upper_bound, GenericReal< is_ad > &scalar_lower_bound, std::stringstream *iter_output)
Update the upper and lower bounds of the root for the effective inelastic strain. ...
virtual GenericReal< is_ad > minimumPermissibleValue(const GenericReal< is_ad > &effective_trial_stress) const
Compute the minimum permissible value of the scalar.
virtual Real computeReferenceResidual(const GenericReal< is_ad > &effective_trial_stress, const GenericReal< is_ad > &scalar)=0
Compute a reference quantity to be used for checking relative convergence.
void returnMappingSolve(const GenericReal< is_ad > &effective_trial_stress, GenericReal< is_ad > &scalar, const ConsoleStream &console)
Perform the return mapping iterations.
const bool _internal_solve_full_iteration_history
Whether to output iteration information all the time (regardless of whether iterations converge) ...
virtual void outputIterationSummary(std::stringstream *iter_output, const unsigned int total_it)
Output summary information for the convergence history of the model.
Base class that provides capability for Newton return mapping iterations on a single variable...
SingleVariableReturnMappingSolutionTempl< true > ADSingleVariableReturnMappingSolution
SingleVariableReturnMappingSolutionTempl(const InputParameters &parameters)
typename Moose::GenericType< ChainedReal, is_ad > GenericChainedReal
void computeResidualAndDerivativeHelper(const GenericReal< is_ad > &effective_trial_stress, const GenericReal< is_ad > &scalar)
Helper function to compute and set the _residual and _derivative.
Real _absolute_tolerance
Absolute convergence tolerance.
virtual GenericChainedReal< is_ad > computeResidualAndDerivative(const GenericReal< is_ad > &, const GenericChainedReal< is_ad > &)
Compute the residual and the derivative for a predicted value of the scalar.
bool _bracket_solution
Whether to save upper and lower bounds of root for scalar, and set solution to the midpoint between t...
GenericReal< is_ad > _initial_residual
Residual values, kept as members to retain solver state for summary outputting.
virtual GenericReal< is_ad > computeResidual(const GenericReal< is_ad > &, const GenericReal< is_ad > &)=0
Compute the residual for a predicted value of the scalar.
GenericReal< is_ad > _derivative
Derivative of the residual.
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
enum SingleVariableReturnMappingSolutionTempl::InternalSolveOutput _internal_solve_output_on
bool converged(const GenericReal< is_ad > &residual, const Real reference)
Check to see whether the residual is within the convergence limits.
const std::string _svrms_name
MOOSE input name of the object performing the solve.
virtual void iterationFinalize(const GenericReal< is_ad > &)
Finalize internal state variables for a model for a given iteration.
typename Moose::GenericType< Real, is_ad > GenericReal
SingleVariableReturnMappingSolutionTempl< false > SingleVariableReturnMappingSolution
bool _check_range
Whether to check to see whether iterative solution is within admissible range, and set within that ra...
virtual GenericReal< is_ad > initialGuess(const GenericReal< is_ad > &)
Compute an initial guess for the value of the scalar.
const std::size_t _num_resids
Number of residuals to be stored in history.