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)](_images/math/5a7483c61cddf46e4c6f322dd3f2e4ccbd9fe00f.png)
where
is the slip rate on each system,
is the resolved shear,
is the slip system strength,

and the remaining terms are parameters, described below.
Parameters¶
Parameter |
Object type |
Description |
Default |
|---|---|---|---|
|
Slip resistance |
N |
|
|
|
Energy barrier shape |
N |
|
|
Energy barrier shape |
N |
|
|
Burgers vector |
N |
|
|
Reference shear rate |
N |
|
|
Activation energy |
N |
|
|
Boltzmann constant |
|
Class description¶
-
class ArrheniusSlipRule : public neml::SlipStrengthSlipRule¶
An Arrhenius slip rule ala Hu and Cocks.
Public Functions
-
ArrheniusSlipRule(ParameterSet ¶ms)¶
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 ¶ms)¶
Initialize from a parameter set.
-
static ParameterSet parameters()¶
Default parameters.
-
ArrheniusSlipRule(ParameterSet ¶ms)¶
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:
C and Cr form Cr23C6carbides
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:
A DislocationSpacingHardening object to manage dislocation hardening
An HuCocksPrecipitationModel object for each precipitation reactor
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

where
is the dislocation hardening strength, provided by
the DislocationSpacingHardening model.
is the
total precipitation hardening given by

with
an interaction coefficient,
the shear modulus,
the Burgers vector, and
is

with
and
internal variables defined by the individual
HuCocksPrecipitationModel precipitation reaction models.
is then the total solid solution strengthening hardening given by

with
an interaction coefficient and using

with
the chemical concentrations contributing to each precipitation reaction and
the corresponding molecular volumes. The chemical concentrations are again defined by the individual HuCocksPrecipitationModel models.
Parameters¶
Parameter |
Object type |
Description |
Default |
|---|---|---|---|
|
Dislocation hardening model |
N |
|
|
Precipitation hardening models |
N |
|
|
|
Precipitation hardening interaction coefficient |
N |
|
|
Solid solution interaction coefficient |
N |
|
|
Burgers vector |
N |
|
Shear modulus |
N |
Class description¶
-
class HuCocksHardening : public neml::SlipHardening¶
Full Hu and Cocks hardening model.
Public Functions
-
HuCocksHardening(ParameterSet ¶ms)¶
-
virtual std::vector<std::string> varnames() const¶
Report your variable names.
-
virtual void set_varnames(std::vector<std::string> vars)¶
Set new varnames.
-
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.
Public Static Functions
-
static std::string type()¶
String type for the object system.
-
static std::unique_ptr<NEMLObject> initialize(ParameterSet ¶ms)¶
Initialize from a parameter set.
-
static ParameterSet parameters()¶
Default parameters.
-
HuCocksHardening(ParameterSet ¶ms)¶
HuCocksPrecipitationModel¶
Overview¶
This class manages a single precipitation reaction. The model considers the evolution of a single precipitate through two phases:
Nucleation and growth by diffusion of the underlying chemical species out of the solid solution, followed by
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,
the
number volume density, and
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

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

for that critical species.
Growth regime¶
In the growth regime the chemical concentrations evolve as

where
is the concentration in solution for species
,
is the initial solution
concentration for that species, and
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
.
In this regime


with
the Gibb’s free energy driving the reaction

using

Diffusion of the slowest species controls the reaction rate, with

where
is the diffusivity at absolute zero,
the activation energy, and
the universal gas constant.
Finally,

with
the interface energy.
For the nucleation rate:

with

and

where
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
and the other species remained fixed at the final concentrations from the growth phase.
In this regime:



with

where
is a coarsening factor and
is the molar volume (
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:

and

where

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 |
|---|---|---|---|
|
Initial solution concentration of each species |
N |
|
|
Precipitate concentration of each species |
N |
|
|
Equilibrium solution concentration of each species |
N |
|
|
|
Lattice parameter |
N |
|
|
Nucleation site density |
N |
|
|
Molar volume |
N |
|
|
Surface energy |
N |
|
|
Reference diffusivity |
N |
|
|
Diffusion activation energy |
N |
|
Coarsening factor |
N |
|
|
|
Boltzmann constant |
|
|
|
Gas constant |
|
|
|
Avagadro’s number |
|
|
|
Index of rate-limiting chemical species |
|
|
|
Initial volume fraction |
|
|
|
Initial radius |
|
|
|
Initial number density |
|
|
|
Scaling factor on volume fraction |
|
|
|
Scaling factor on radius |
|
|
|
Scaling factor on number density |
|
Class description¶
-
class HuCocksPrecipitationModel : public neml::HistoryNEMLObject¶
Implementation of a single chemistry <-> size model.
Public Functions
-
HuCocksPrecipitationModel(ParameterSet ¶ms)¶
-
virtual std::vector<std::string> varnames() const¶
Report your variable names.
-
virtual void set_varnames(std::vector<std::string> vars)¶
Set new varnames.
-
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 ¶ms)¶
Initialize from a parameter set.
-
static ParameterSet parameters()¶
Default parameters.
-
HuCocksPrecipitationModel(ParameterSet ¶ms)¶
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

with
an interaction coefficient,
the shear modulus,
the Burgers vector, and
the dislocation obstacle spacing on system
. This obstacle spacing evolves as

with
the self hardening coefficient,
the latent hardening coefficient, and
a temperature dependent parameter describing dislocation recovery.
Parameters¶
Parameter |
Object type |
Description |
Default |
|---|---|---|---|
|
Self hardening coefficient |
N |
|
|
Latent hardening coefficient |
N |
|
|
Recovery coefficient |
N |
|
|
|
Initial obstacle spacing |
N |
|
|
Interaction coefficient |
N |
|
|
Burgers vector |
N |
|
Shear modulus |
N |
|
|
|
Lattice to extract number of systems |
N |
|
|
Prefix of internal variables |
|
Class description¶
-
class DislocationSpacingHardening : public neml::SlipHardening¶
Standard dislocation density model, here evolving the spacing.
Public Functions
-
DislocationSpacingHardening(ParameterSet ¶ms)¶
-
virtual std::vector<std::string> varnames() const¶
Report your variable names.
-
virtual void set_varnames(std::vector<std::string> vars)¶
Set new varnames.
-
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 ¶ms)¶
Initialize from a parameter set.
-
static ParameterSet parameters()¶
Default parameters.
-
DislocationSpacingHardening(ParameterSet ¶ms)¶






