Rate independent plasticity

Overview

This class implements rate independent plasticity described by:

The elastic trial state:

\bm{\varepsilon}^{p}_{tr} = \bm{\varepsilon}^{p}_n

\bm{\sigma}_{tr} = \mathbf{\mathfrak{C}}_{n+1} :
   \left( \bm{\varepsilon}_{n+1} - \bm{\varepsilon}_{tr}^p  \right)

\bm{\alpha}_{tr} = \bm{\alpha}_{n}

The plastic correction:

\bm{\sigma}_{n+1} = \mathbf{\mathfrak{C}}_{n+1} :
   \left( \bm{\varepsilon}_{n+1} - \bm{\varepsilon}_{n+1}^p \right)

\bm{\varepsilon}_{n+1}^p =
   \begin{cases}
      \bm{\varepsilon}^{p}_{tr} & f\left(\bm{\sigma}_{tr},\bm{\alpha}_{tr}\right)\le0\\
      \bm{\varepsilon}^{p}_{tr}+\mathbf{g}\left( \bm{\sigma}_{n+1}, \bm{\alpha}_{n+1}, T_{n+1} \right)\Delta\gamma_{n+1} & f\left(\bm{\sigma}_{tr},\bm{\alpha}_{tr}\right)>0
   \end{cases}

\bm{\alpha}_{n+1} =
   \begin{cases}
      \bm{\alpha}_{tr} & f\left(\bm{\sigma}_{tr},\bm{\alpha}_{tr}\right)\le0\\
      \bm{\alpha}_{tr}+\mathbf{h}\left( \bm{\sigma}_{n+1}, \bm{\alpha}_{n+1}, T_{n+1} \right)\Delta\gamma_{n+1} & f\left(\bm{\sigma}_{tr},\bm{\alpha}_{tr}\right)>0
   \end{cases}

Solving for \Delta \gamma_{n+1} such that

f\left(\bm{\sigma}_{n+1}, \bm{\alpha}_{n+1} \right) = 0

In these equations f is a yield function, \mathbf{g} is a flow function, evaluated at the next state, and \mathbf{h} is the rate of evolution for the history variables, evaluated at the next state. NEML integrates all three of these functions into a Rate independent flow rule interface.

If the step is plastic the stress update is solved through fully-implicit backward Euler integration. The algorithmic tangent is then computed using an implicit function scheme. The work and energy are integrated with a trapezoid rule from the final values of stress and plastic strain.

This model maintains a vector of history variables defined by the model’s Rate independent flow rule interface.

At the end of the step the model (optionally) checks to ensure the step met the Kuhn-Tucker conditions

\Delta \gamma_{n+1} \ge 0

f\left(\bm{\sigma}_{n+1}, \bm{\alpha}_{n+1} \right) \le 0

\Delta \gamma_{n+1} f\left(\bm{\sigma}_{n+1}, \bm{\alpha}_{n+1} \right) = 0.

Parameters

Parameter

Object type

Description

Default

elastic

neml::LinearElasticModel

Temperature dependent elastic constants

No

surface

neml::RateIndependentFlowRule

Flow rule interface

No

alpha

neml::Interpolate

Temperature dependent instantaneous CTE

0.0

tol

double

Integration tolerance

1.0e-8

miter

int

Maximum number of integration iters

50

verbose

bool

Print lots of convergence info

false

kttol

double

Tolerance on the Kuhn-Tucker conditions

1.0e-2

check_kt

bool

Flag to actually check KT

false

Class description

class SmallStrainRateIndependentPlasticity : public neml::SubstepModel_sd

Small strain, rate-independent plasticity.

Public Functions

SmallStrainRateIndependentPlasticity(ParameterSet &params)

Parameters: elasticity model, flow rule, CTE, solver tolerance, maximum solver iterations, verbosity flag, tolerance on the Kuhn-Tucker conditions check, and a flag on whether the KT conditions should be evaluated

virtual void populate_state(History &h) const

Populate internal variables.

virtual void init_state(History &h) const

Initialize history at time zero.

virtual TrialState *setup(const double *const e_np1, const double *const e_n, double T_np1, double T_n, double t_np1, double t_n, const double *const s_n, const double *const h_n)

Setup the trial state.

virtual bool elastic_step(const TrialState *ts, const double *const e_np1, const double *const e_n, double T_np1, double T_n, double t_np1, double t_n, const double *const s_n, const double *const h_n)

Ignore update and take an elastic step.

virtual void update_internal(const double *const x, const double *const e_np1, const double *const e_n, double T_np1, double T_n, double t_np1, double t_n, double *const s_np1, const double *const s_n, double *const h_np1, const double *const h_n)

Interpret the x vector.

virtual void strain_partial(const TrialState *ts, const double *const e_np1, const double *const e_n, double T_np1, double T_n, double t_np1, double t_n, const double *const s_np1, const double *const s_n, const double *const h_np1, const double *const h_n, double *const de)

Minus the partial derivative of the residual with respect to the strain.

virtual void work_and_energy(const TrialState *ts, const double *const e_np1, const double *const e_n, double T_np1, double T_n, double t_np1, double t_n, double *const s_np1, const double *const s_n, double *const h_np1, const double *const h_n, double &u_np1, double u_n, double &p_np1, double p_n)

Do the work calculation.

virtual size_t nparams() const

Number of solver parameters.

virtual void init_x(double *const x, TrialState *ts)

Setup an iteration vector in the solver.

virtual void RJ(const double *const x, TrialState *ts, double *const R, double *const J)

Solver function returning the residual and jacobian of the nonlinear system of equations integrating the model

const std::shared_ptr<const LinearElasticModel> elastic() const

Return the elastic model for subobjects.

void make_trial_state(const double *const e_np1, const double *const e_n, double T_np1, double T_n, double t_np1, double t_n, const double *const s_n, const double *const h_n, SSRIPTrialState &ts)

Setup a trial state.

Public Static Functions

static std::string type()

Type for the object system.

static ParameterSet parameters()

Parameters for the object system.

static std::unique_ptr<NEMLObject> initialize(ParameterSet &params)

Setup from a ParameterSet.