Hu and Cocks model for 316H SS

This subsystem implements a single crystal model for 316H stainless steel developed by Hu, Cocks, and coworkers [HC2020]. The model includes a specific flow rule as well as a complex hardening model designed to capture the key features of dislocation forest hardening, precipitation hardening caused by the carbide and Laves phases, and solid solution strengthening caused by Mo, C, and Cr in the alloy. For clarity, the implementation breaks the complex hardening model into several smaller objects.

ArrheniusSlipRule

Overview

This class implements a thermally-activated slip rule, where the slip rate is defined by

\dot{\gamma}_i = \dot{\gamma}_0 \exp \left[ -\frac{\Delta F_0}{kT} \left(1 - \left| \frac{\tau_i}{\tau_{CRSS,i}} \right|^A \right)^B \right] \operatorname{sign}\left(\tau_i \right)

where \dot{\gamma}_i is the slip rate on each system, \tau_i is the resolved shear, \tau_{CRSS,i} is the slip system strength,

\Delta F_0 = \alpha_0 G_0 b^3

and the remaining terms are parameters, described below.

Parameters

Parameter

Object type

Description

Default

resistance

neml::SlipHardening

Slip resistance

N

A

double

Energy barrier shape A

N

B

double

Energy barrier shape B

N

b

double

Burgers vector b

N

g0

double

Reference shear rate \dot{\gamma}_0

N

G0

double

Activation energy G_0

N

k

double

Boltzmann constant k

1.3806485e-23

Class description

class ArrheniusSlipRule : public neml::SlipStrengthSlipRule

An Arrhenius slip rule ala Hu and Cocks.

Public Functions

ArrheniusSlipRule(ParameterSet &params)

Initialize with the strength object, the reference strain rate, and the rate sensitivity

virtual double scalar_sslip(size_t g, size_t i, double tau, double strength, double T) const

The slip rate definition.

virtual double scalar_d_sslip_dtau(size_t g, size_t i, double tau, double strength, double T) const

Derivative of slip rate with respect to the resolved shear.

virtual double scalar_d_sslip_dstrength(size_t g, size_t i, double tau, double strength, double T) const

Derivative of the slip rate with respect to the strength.

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.

Hardening model

The Hu and Cocks model combines dislocation forest hardening, precipitation hardening, and solid solution strengthening. The specific model described in the original work considers two precipitation reactions:

  1. C and Cr form Cr23C6carbides

  2. Mo forms Fe2Mo

Precipitation strengthening and solid solution strengthening are coupled: as the chemical species contributing the to strengthen phase come out of solution that decreases the solid solution strengthening while increasing the precipitation strengthen. The precipitation reactions undergo two phases of evolution: diffusion-controlled growth drawing the required chemical species out of solution followed by Ostwald ripening where the larger precipitates cannibalize the smaller precipitates.

The implementation in NEML treats these reactions are general – the user can specify as many chemical species feeding into as many precipitation reactions as needed. The only current restriction is that two precipitation reactions cannot compete for the same chemical species in solution. This behavior could be added to the implementation if needed.

Each precipitation-solid solution strengthening group can then be treated separately. Similarly, dislocation hardening can be treated separately from the precipitation/solid solution strengthening. The implementation then uses three objects to form the slip system strengths:

  1. A DislocationSpacingHardening object to manage dislocation hardening

  2. An HuCocksPrecipitationModel object for each precipitation reactor

  3. A HuCocksHardening object to sum the contributions of each mechanism on the slip system strength.

For full details of the implementation in NEML see [VM2021].

HuCocksHardening

Overview

This object sums the contributions of the individual precipitation reactions and the dislocation hardening into a single slip system strength. The equation it implements is

\tau_{CRSS,i} = \sqrt{\tau_{d,i}^2 + \tau_p^2} + \tau_s

where \tau_{d,i} is the dislocation hardening strength, provided by the DislocationSpacingHardening model.

\tau_p is the total precipitation hardening given by

\tau_p = \frac{\alpha_p G b}{L_p}

with \alpha_p an interaction coefficient, G the shear modulus, b the Burgers vector, and L_p is

L_p = \sqrt{\frac{1}{\sum_i 2 r_i N_i}}.

with r_i and N_i internal variables defined by the individual HuCocksPrecipitationModel precipitation reaction models.

\tau_s is then the total solid solution strengthening hardening given by

\tau_s = \frac{\alpha_s G b}{L_s}

with \alpha_s an interaction coefficient and using

L_s = \sqrt{\frac{1}{b\sum_j \frac{c_j}{v_{m,i}}}}

with c_j the chemical concentrations contributing to each precipitation reaction and v_{m,i} the corresponding molecular volumes. The chemical concentrations are again defined by the individual HuCocksPrecipitationModel models.

Parameters

Parameter

Object type

Description

Default

dmodel

neml::SlipHardening

Dislocation hardening model

N

pmodels

std::vector

Precipitation hardening models

N

ap

double

Precipitation hardening interaction coefficient \alpha_p

N

ac

double

Solid solution interaction coefficient \alpha_c

N

b

double

Burgers vector b

N

G

neml::Interpolate

Shear modulus

N

Class description

class HuCocksHardening : public neml::SlipHardening

Full Hu and Cocks hardening model.

Public Functions

HuCocksHardening(ParameterSet &params)
virtual std::vector<std::string> varnames() const

Report your variable names.

virtual void set_varnames(std::vector<std::string> vars)

Set new varnames.

virtual void populate_hist(History &history) const

Request whatever history you will need.

virtual void init_hist(History &history) const

Setup history.

virtual double hist_to_tau(size_t g, size_t i, const History &history, Lattice &L, double T, const History &fixed) const

Map the set of history variables to the slip system hardening.

virtual History d_hist_to_tau(size_t g, size_t i, const History &history, Lattice &L, double T, const History &fixed) const

Derivative of the map wrt to history.

virtual History hist(const Symmetric &stress, const Orientation &Q, const History &history, Lattice &L, double T, const SlipRule &R, const History &fixed) const

The rate of the history.

virtual History d_hist_d_s(const Symmetric &stress, const Orientation &Q, const History &history, Lattice &L, double T, const SlipRule &R, const History &fixed) const

Derivative of the history wrt stress.

virtual History d_hist_d_h(const Symmetric &stress, const Orientation &Q, const History &history, Lattice &L, double T, const SlipRule &R, const History &fixed) const

Derivative of the history wrt the history.

virtual History d_hist_d_h_ext(const Symmetric &stress, const Orientation &Q, const History &history, Lattice &L, double T, const SlipRule &R, const History &fixed, std::vector<std::string> ext) const

Derivative of this history wrt the history, external variables.

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.

HuCocksPrecipitationModel

Overview

This class manages a single precipitation reaction. The model considers the evolution of a single precipitate through two phases:

  1. Nucleation and growth by diffusion of the underlying chemical species out of the solid solution, followed by

  2. Ostwald ripening after the solid solution concentrations reach their equilibrium values

During the first phase, the precipitates draw the chemical species out of the solution, affecting the solid solution strengthening provided by those elements.

The model tracks a precipitation reaction with three internal variables: math:`f the volume fraction, N the number volume density, and r the average precipitate radius. One of these three variables is redundant, but the model evolves all three (consistency) to improve the numerical stability of the as a whole. The chemical concentrations in solution underlying the precipitation reaction can be determined given these three variables describing the precipitates.

The model applies a different ODE to evolve the internal variables in each of the regimes. The two regimes are split by the chemical concentration of the critical species in solution. The model is in the growth regime when

c_j < c_{eq,j}

for all species contributing to the reaction. Conversely, the model is in the ripening regime when

c_j = c_{eq,j}

for that critical species.

Growth regime

In the growth regime the chemical concentrations evolve as

c_j = \frac{c_{0,j} - f c_{p,j}}{1-f}

where c_j is the concentration in solution for species j, c_{0,j} is the initial solution concentration for that species, and c_{p.j} is the chemical concentration of the species in the precipitate. The model stays in the growth regime until the first species contributing the precipitation reaction reaches the solution equilibrium concentration c_{eq,j}.

In this regime

\dot{f}_{growth} = \frac{4}{3}\pi \left(\dot{N} r^3 + 3 N r^2 \dot{r} \right)

\dot{r}_{growth} = \frac{D}{r} \frac{c_j - c_{eq,j}}{c_{p,j} - c_{eq,j}} + \frac{\dot{N}_{growth}}{N} \left( r_c - r \right)

with G_v the Gibb’s free energy driving the reaction

G_v = -\frac{kT}{v_m} \ln \frac{c_{eff}}{c_{eff,eq}}

using

c_{eff} = \prod_{j} c_j.nit

Diffusion of the slowest species controls the reaction rate, with

D = D_0 \exp\left( \frac{-Q_0}{RT} \right)

where D_0 is the diffusivity at absolute zero, Q_0 the activation energy, and R the universal gas constant.

Finally,

r_c = -2 \frac{\chi}{G_v}

with \chi the interface energy.

For the nucleation rate:

\dot{N}_{growth} = N_0 Z \beta \exp\left(-\frac{G^*}{kT} \right)

with

G^* = \frac{16 \pi \chi^3}{3 G_v^2}

and

Z \beta = \frac{2 v_m D c_j}{a_m^4} \sqrt{\frac{\chi}{kT}}

where a_m is the relevant lattice parameter.

In the growth regime the nucleation rate is positive.

Ripening regime

In the ripening regime the solution chemical concentrations are frozen and do not change. The critical species, the element which first reaches the equilibrium concentration, is frozen at that solution equilibrium concentration c_{j,eq} and the other species remained fixed at the final concentrations from the growth phase.

In this regime:

\dot{f}_{ripening} = 0

\dot{r}_{ripening} = \frac{M}{3r^2}

\dot{N}_{ripening} = -\frac{3N}{r} \dot{r}_{ripening}

with

M = C_f \frac{8 \chi V_m D c_j}{9 R T}

where C_f is a coarsening factor and V_m = N_a v_m is the molar volume (N_a Avagadro’s number).

In the ripening regime the nucleation rate is negative, the radius growth rate is positive, and there is no net growth in volume fraction.

Switching mechanisms

A hard switch between the growth and ripening regimes produces an unstable numerical model. Instead the NEML implementation mixes the two rates using a sigmoid function:

\dot{r} = f(c_j) \dot{r}_{growth} + (1-f(c_j)) \dot{r}_{ripening}

and

\dot{N} = f(c_j) \dot{N}_{growth} + (1-f(c_j)) \dot{N}_{ripening}

where

f\left(c_{j}\right)=\begin{cases}
      \frac{c_{j}-c_{0,j}}{c_{eq,j}-c_{0,j}} & c_{j}\le c_{eq,j}\\
      1 & c_{j}>c_{eq,j}
\end{cases}

With this setup the volume fraction evolution equation naturally trends towards zero in the ripening regime.

Additionally, the equations are scaled to equalize the magnitude of the internal variables, again to help with numerical performance

Parameters

Parameter

Object type

Description

Default

c0

std::vector

Initial solution concentration of each species

N

cp

std::vector

Precipitate concentration of each species

N

ceq

std::vector

Equilibrium solution concentration of each species

N

am

double

Lattice parameter

N

N0

double

Nucleation site density N_0

N

Vm

double

Molar volume

N

chi

double

Surface energy

N

D0

double

Reference diffusivity

N

Q0

double

Diffusion activation energy

N

Cf

neml::Interpolate

Coarsening factor

N

kboltz

double

Boltzmann constant

1.3806485e-23

R

double

Gas constant

8.31462

Na

double

Avagadro’s number

6.02e23

rate

size_t

Index of rate-limiting chemical species

0

f_init

double

Initial volume fraction

4.18879e-16

r_init

double

Initial radius

1e-9

N_init

double

Initial number density

1e11

fs

double

Scaling factor on volume fraction

0.1

rs

double

Scaling factor on radius

1e-9

Ns

double

Scaling factor on number density

1e12

Class description

class HuCocksPrecipitationModel : public neml::HistoryNEMLObject

Implementation of a single chemistry <-> size model.

Public Functions

HuCocksPrecipitationModel(ParameterSet &params)
virtual std::vector<std::string> varnames() const

Report your variable names.

virtual void set_varnames(std::vector<std::string> vars)

Set new varnames.

virtual void populate_hist(History &history) const

Request whatever history you will need.

virtual void init_hist(History &history) const

Setup history.

double f(const History &history) const

Actual (unscaled) f.

double r(const History &history) const

Actual (unscaled) r.

double N(const History &history) const

Actual (unscaled) N.

std::vector<double> rate(const History &history, double T) const

Rate vector.

std::vector<std::vector<double>> jac(const History &history, double T) const

Jacobian matrix.

virtual double f_rate(double f, double r, double N, double T) const

The volume fraction rate.

virtual double df_df(double f, double r, double N, double T) const

df_df

virtual double df_dr(double f, double r, double N, double T) const

df_dr

virtual double df_dN(double f, double r, double N, double T) const

df_dN

virtual double r_rate(double f, double r, double N, double T) const

The radius rate.

virtual double dr_df(double f, double r, double N, double T) const

dr_df

virtual double dr_dr(double f, double r, double N, double T) const

dr_dr

virtual double dr_dN(double f, double r, double N, double T) const

dr_dN

virtual double N_rate(double f, double r, double N, double T) const

The number density rate.

virtual double dN_df(double f, double r, double N, double T) const

dN_df

virtual double dN_dr(double f, double r, double N, double T) const

dN_dr

virtual double dN_dN(double f, double r, double N, double T) const

dN_dN

size_t nspecies() const

Number of chemical species.

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

Concentration vector.

std::vector<double> dc_df(double f, double T) const

Derivative of the concentration vector.

double Gv(double f, double T) const

Driving force for precipitation.

double dG_df(double f, double T) const

Derivative of the driving force wrt f.

double vm() const

Access the molecular volume.

inline double fs() const

Get the value of the volume fraction scaling term.

inline double rs() const

Get the value of the radius scaling term.

inline double Ns() const

Get the value of the number density scaling term.

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.

DislocationSpacingHardening

Overview

This model can be used as part of the HuCocksHardening model or as a stand-alone model for forest dislocation hardening. The model maintains a single, scalar dislocation density for each slip system, parameterized as a mean obstacle spacing. The slip system strength is given in terms of these obstacle spacings as

\tau_{d,i} = \frac{\alpha_d G b}{L_{d,i}}

with \alpha_d an interaction coefficient, G the shear modulus, b the Burgers vector, and L_{d,i} the dislocation obstacle spacing on system i. This obstacle spacing evolves as

\dot{L}_{d,i} = -L_{d,i}^3 \left( J_1 \left| \dot{\gamma}_i \right| + J_2 \sum_{j \ne i} \left| \dot{\gamma}_j \right|   \right) + \frac{K}{L_{d,i}^3}

with J_1 the self hardening coefficient, J_2 the latent hardening coefficient, and K a temperature dependent parameter describing dislocation recovery.

Parameters

Parameter

Object type

Description

Default

J1

neml::Interpolate

Self hardening coefficient

N

J2

neml::Interpolate

Latent hardening coefficient

N

K

neml::Interpolate

Recovery coefficient

N

L0

double

Initial obstacle spacing

N

a

double

Interaction coefficient \alpha_d

N

b

double

Burgers vector

N

G

neml::Interpolate

Shear modulus

N

L

neml::lattice

Lattice to extract number of systems

N

varprefix

std::string

Prefix of internal variables

"spacing"

Class description

class DislocationSpacingHardening : public neml::SlipHardening

Standard dislocation density model, here evolving the spacing.

Public Functions

DislocationSpacingHardening(ParameterSet &params)
virtual std::vector<std::string> varnames() const

Report your variable names.

virtual void set_varnames(std::vector<std::string> vars)

Set new varnames.

virtual void populate_hist(History &history) const

Request whatever history you will need.

virtual void init_hist(History &history) const

Setup history.

virtual double hist_to_tau(size_t g, size_t i, const History &history, Lattice &L, double T, const History &fixed) const

Map the set of history variables to the slip system hardening.

virtual History d_hist_to_tau(size_t g, size_t i, const History &history, Lattice &L, double T, const History &fixed) const

Derivative of the map wrt to history.

virtual History hist(const Symmetric &stress, const Orientation &Q, const History &history, Lattice &L, double T, const SlipRule &R, const History &fixed) const

The rate of the history.

virtual History d_hist_d_s(const Symmetric &stress, const Orientation &Q, const History &history, Lattice &L, double T, const SlipRule &R, const History &fixed) const

Derivative of the history wrt stress.

virtual History d_hist_d_h(const Symmetric &stress, const Orientation &Q, const History &history, Lattice &L, double T, const SlipRule &R, const History &fixed) const

Derivative of the history wrt the history.

virtual History d_hist_d_h_ext(const Symmetric &stress, const Orientation &Q, const History &history, Lattice &L, double T, const SlipRule &R, const History &fixed, std::vector<std::string> ext) const

Derivative of this history wrt the history, external variables.

size_t size() const

Number of slip systems contributing.

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.