Skip to content

NonlinearJ2

Nonlinear General J2 Plasticity Model

Summary

This is an abstract material class thus cannot be used directly. This class defines a general plasticity model using J2 yielding criterion with associated flow rule and mixed hardening rule. The isotropic/kinematic hardening response can be customized.

To use this model, a derived class shall be defined first.

C++
1
2
3
class YourJ2 final : public NonlinearJ2 {
// class definition
}

The derived class only needs to implement four pure virtual methods that define the isotropic and kinematic hardening rules.

C++
1
2
3
4
virtual double compute_k(double) const = 0; // isotropic hardening
virtual double compute_dk(double) const = 0; // derivative isotropic
virtual double compute_h(double) const = 0; // kinematic hardening
virtual double compute_dh(double) const = 0; // derivative kinematic

All four methods take equivalent plastic strain as the input argument, on output, the corresponding quantities shall be provided.

The isotropic hardening function K(ε¯p) defines the isotropic hardening rule, there are some requirements:

  1. K(ε¯p) should be non-negative,
  2. K(ε¯p=0)=σy where σy is the initial yielding stress.

There is no requirement for the kinematic hardening function H(ε¯p). Both hardening rules can coexist. However, to successfully solve the trial status, there is an additional constraint that shall be applied on the model:

E+H(ε¯p)+K(ε¯p)0 for all ε¯p

Otherwise, the local Newton iteration will fail.

Brief On Theory

The NonlinearJ2 abstract class defines an associative plasticity framework using the von Mises yield criterion, which is defined as follows.

F(σ,ε¯p)=32(sβ(ε¯p)):(sβ(ε¯p))σy(ε¯p)

where β(ε¯p) is the back stress depends on the equivalent plastic strain ε¯p and σy(ε¯p) is the yield stress. Note

3J2=32(sβ(ε¯p)):(sβ(ε¯p))

It is also called J2 plasticity model. A detailed discussion can be seen elsewhere. β(ε¯p)=H(ε¯p) and σy(ε¯p)=K(ε¯p).

History Layout

location paramater
initial_history(0) accumulated plastic strain
initial_history(1-6) back stress

Kinematic Hardening

The back stress β(ε¯p) defines a kinematic hardening response. For example a linear kinematic hardening could be defined as:

β(ε¯p)=EKε¯p

and the derivative

dβ(ε¯p)dε¯p=EK

in which EK is the kinematic hardening stiffness.

In this case, user shall override the corresponding two methods with such an implmentation.

C++
double SampleJ2::compute_h(const double p_strain) const { return e_kin * p_strain; }
double SampleJ2::compute_dh(const double) const { return e_kin; }

Of course, a nonlinear relationship could also be defined.

Isotropic Hardening

The isotropic hardening is defined by function σy(ε¯p). The value σy(0) should be the initial yield stress. Also, for a bilinear isotropic hardening response, user shall override the following two methods.

C++
double SampleJ2::compute_k(const double p_strain) const { return e_iso * p_strain + yield_stress; }
double SampleJ2::compute_dk(const double) const { return e_iso; }

Here another polynomial based isotropic hardening function is shown as an additional example. The function is defined as

σy=σ0(1+i=1naiε¯pi)

where ai are material constants. It is easy to see σy|ε¯p=0=σ0. The derivative is

dσydε¯p=σ0i=1niaiε¯pi1

To define such a hardening behavior, a vector shall be used to store all constants.

C++
// PolyJ2.h
const vec poly_para; // poly_para is a vector stores a_i

The methods could be written as follows.

C++
// PolyJ2.cpp
double PolyJ2::compute_k(const double p_strain) const {
 vec t_vec(poly_para.n_elem);

 t_vec(0) = 1.;
 for(uword I = 1; I < t_vec.n_elem; ++I) t_vec(I) = t_vec(I - 1) * p_strain;

 return yield_stress * dot(poly_para, t_vec);
}

double PolyJ2::compute_dk(const double p_strain) const {
 vec t_vec(poly_para.n_elem);

 t_vec(0) = 0.;
 t_vec(1) = 1.;
 for(uword I = 2; I < t_vec.n_elem; ++I) t_vec(I) = (double(I) + 1.) * pow(p_strain, double(I));

 return yield_stress * dot(poly_para, t_vec);
}

Example

A few different models are shown as examples. User can define arbitrary models.