Chaboche nonassociative hardening

Overview

The Chaboche model has been developed over a long period by Chaboche and coworkers [C2008] [C1989a] [C1989b]. It is one of a few canonical high temperature constitutive models for metals that accounts for the interaction of creep and kinematic hardening.

The Chaboche model includes an extension of the combined isotropic/kinematic hardening model originally proposed by Frederick and Armstrong [FA2007]. The hardening variables are a standard isotropic hardening variable defined by a strain-like equivalent inelastic strain \alpha mapped to a stress-like isotropic hardening variable describing the expansion of the flow surface (Q). Supplementing this associative isotropic hardening is nonassociative kinematic hardening describing the shift in the flow surface in stress space. This kinematic hardening is often called the Chaboche model. It consists of a total backstress summed from several individual backstress contributions.

The total history vector \bm{\alpha} is

\bm{\alpha}=\left[\begin{array}{ccccc} \alpha & \boldsymbol{X}_{1} & \boldsymbol{X}_{2} & \ldots & \boldsymbol{X}_{n}\end{array}\right]

where each \bm{X}_i is one of n individual backstresses. The model converts this vector of history variables into the stress-like quantities needed by the yield surface with the map

\mathbf{q}=\left[\begin{array}{cc} Q\left(\alpha\right) & \sum_{i=1}^{n}\mathbf{X}_{i}\end{array}\right]

The map for the isotropic hardening is provided by another object implementing the isotropic hardening interface.

The history evolution equation for the isotropic part of the model is associative and proportional only to the scalar inelastic strain rate

\mathbf{h}_\gamma^\alpha = \sqrt{\frac{2}{3}}.

The evolution equations for each individual backstress are:

\mathbf{h}_{\gamma}^{X_i} = -\frac{2}{3} C_i \frac{\operatorname{dev}\left(\bm{\sigma} - \mathbf{X}\right)}{\left\Vert \operatorname{dev}\left(\bm{\sigma} - \mathbf{X}\right) \right\Vert} - \sqrt{\frac{2}{3}} \gamma_i\left(\alpha, T \right) \mathbf{X}_i

\mathbf{h}_{t}^{X_i} = -\sqrt{\frac{3}{2}} A_i \left\Vert \mathbf{X}_i \right\Vert ^ {a_i - 1} \mathbf{x}_i

\mathbf{h}_{t}^{x_i} = -\sqrt{\frac{2}{3}} \frac{\mathrm{d}C_i / \mathrm{d}t}{C_i} \mathbf{X}_i

The model parameters for each backstress are then C_i, A_i, a_i, and \gamma_i as a function of the equivalent inelastic strain. Various options for gamma are described below. The model maintains 1 + 6n history variables, where n is the number of backstresses.

The implementation has an option to turn on or off the part of the backstress evolution proportional to the temperature rate. Note this contribution is in any event zero for isothermal loading.

For one backstress (n=1), A_1 = 0, a_1 = 1, and the non-isothermal term turned off the model degenerates to the classical Frederick-Armstrong model [FA2007].

Warning

All of the NEML yield surfaces assume the opposite of the standard sign convention for isotropic and kinematic hardening. The hardening model is expected to return a negative value of the isotropic hardening stress and a negative value of the backstress.

Parameters

Parameter

Object type

Description

Default

iso

neml::IsotropicHardeningRule

Isotropic hardening

No

c

std::vector<neml::Interpolate>

Values of constant C for each backstress

No

gmodels

std::vector<neml::GammaModel>

The gamma functions for each backstress

No

A

std::vector<neml::Interpolate>

The value of A for each backstress

No

a

std::vector<neml::Interpolate>

The value of a for each backstress

No

noniso

bool

Include the nonisothermal term?

true

The number of backstresses is set implicitly from the lengths of these vectors. The model will return an error if they have different lengths.

Class description

class Chaboche : public neml::NonAssociativeHardening

Chaboche model: generalized Frederick-Armstrong.

Public Functions

Chaboche(ParameterSet &params)

Parameters: isotropic hardening model, vector of backstress constants C, vector of gamma functions, vector of static recovery constants A, vector static recovery constants a, flag trigger the nonisothermal terms

virtual size_t ninter() const

1 (isotropic) + 6 (backstress) = 7

virtual void populate_hist(History &h) const

Setup the internal state.

virtual void init_hist(History &h) const

Initialize the history.

virtual void q(const double *const alpha, double T, double *const qv) const

Map the isotropic variable, map the backstresses.

virtual void dq_da(const double *const alpha, double T, double *const qv) const

Derivative of map.

virtual void h(const double *const s, const double *const alpha, double T, double *const hv) const

Hardening proportional to inelastic strain rate Assume associated isotropic hardening, each backstress is -2/3 * C * X/norm(X) - sqrt(2/3) gamma(ep) * X

virtual void dh_ds(const double *const s, const double *const alpha, double T, double *const dhv) const

Derivative of h wrt stress.

virtual void dh_da(const double *const s, const double *const alpha, double T, double *const dhv) const

Derivative of h wrt history.

virtual void h_time(const double *const s, const double *const alpha, double T, double *const hv) const

Hardening proportional to time Zero for the isotropic part, -A sqrt(3/2) pow(norm(X), a-1) * X for each backstress

virtual void dh_ds_time(const double *const s, const double *const alpha, double T, double *const dhv) const

Derivative of h_time wrt stress.

virtual void dh_da_time(const double *const s, const double *const alpha, double T, double *const dhv) const

Derivative of h_time wrt history.

virtual void h_temp(const double *const s, const double *const alpha, double T, double *const hv) const

Hardening proportional to the temperature rate Zero for the isotropic part Zero for each backstress if noniso = False -sqrt(2/3) * dC/dT / C * X for each backstress if noniso = True

virtual void dh_ds_temp(const double *const s, const double *const alpha, double T, double *const dhv) const

Derivative of h_temp wrt stress.

virtual void dh_da_temp(const double *const s, const double *const alpha, double T, double *const dhv) const

Derivative of h_temp wrt history.

int n() const

Getter for the number of backstresses.

std::vector<double> c(double T) const

Getter for the C constants.

Public Static Functions

static std::string type()

String type for the object system.

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

Initialize from a parameter set.

static ParameterSet parameters()

Default parameters.

Gamma models

The \gamma parameter describes dynamic backstress recovery in the Chaboche model. This tends to send the backstress to some saturated shift of the yield surface with increasing inelastic strain. The Chaboche model allows this dynamic recovery coefficient to vary with the accumulated inelastic strain. These objects then define the dynamic recovery parameter with the interface

\gamma, \frac{\partial\gamma}{\partial \alpha}
\leftarrow
\mathcal{G}\left( \alpha, T \right)

Class description

class GammaModel : public neml::NEMLObject

Model for the gamma constant used in Chaboche hardening.

Subclassed by neml::ConstantGamma, neml::SatGamma

Public Functions

GammaModel(ParameterSet &params)
virtual double gamma(double ep, double T) const = 0

Gamma as a function of equivalent inelastic strain.

virtual double dgamma(double ep, double T) const = 0

Derivative of the gamma function wrt inelastic strain.

Constant gamma

This function returns a value of \gamma that is independent of inelastic strain. It still might depend on temperature. The implementation is

\gamma = C.

Parameters

Parameter

Object type

Description

Default

g

neml::Interpolate

Value of gamma as a function of T

No

Class description

class ConstantGamma : public neml::GammaModel

Gamma is constant with respect to strain.

Public Functions

ConstantGamma(ParameterSet &params)

Parameter is just the constant value.

virtual double gamma(double ep, double T) const

gamma = C

virtual double dgamma(double ep, double T) const

derivative of the gamma function

double g(double T) const

Getter for the constant value.

Public Static Functions

static std::string type()

String type for the object system.

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

Initialize from a parameter set.

static ParameterSet parameters()

Default parameters.

Saturating gamma

This gamma function begins a given value and transitions towards a second, saturated value as a function of accumulated inelastic strain. It implements the function

\gamma = \gamma_{s} + \left(\gamma_0 - \gamma_s \right) e^{-\beta \alpha}.

Parameters

Parameter

Object type

Description

Default

g0

neml::Interpolate

Initial value of gamma

No

gs

neml::Interpolate

Final value of gamma

No

beta

neml::Interpolate

Controls the saturation rate

No

Class description

class SatGamma : public neml::GammaModel

Gamma evolves with a saturating Voce form.

Public Functions

SatGamma(ParameterSet &params)

Parameters are the initial value of gamma, the saturated value of gamma and the saturation speed constant

virtual double gamma(double ep, double T) const

gamma = gs + (g0 - gs) * exp(-beta * ep)

virtual double dgamma(double ep, double T) const

Derivative of the gamma function.

double gs(double T) const

Parameter getter.

double g0(double T) const

Parameter getter.

double beta(double T) const

Parameter getter.

Public Static Functions

static std::string type()

String type for the object system.

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

Initialize from a parameter set.

static ParameterSet parameters()

Default parameters.