Alamo
J2Plastic.H
Go to the documentation of this file.
1#ifndef MODEL_SOLID_PLASTIC_J2_H_
2#define MODEL_SOLID_PLASTIC_J2_H_
3
4#include "AMReX.H"
5#include <AMReX_REAL.H>
6#include <eigen3/Eigen/Core>
7#include "Affine.H"
8#include "Set/Set.H"
10
11namespace Model
12{
13namespace Solid
14{
15namespace Affine
16{
17class J2Plastic : public Isotropic
18{
19public:
22
23 J2Plastic(Set::Scalar a_mu, Set::Scalar a_lambda, Set::Scalar a_yield, Set::Scalar a_hardening, Set::Scalar a_theta=1.0)
24 {
25 Define(a_mu, a_lambda, a_yield, a_hardening, a_theta);
26 }
27
28 void Define(Set::Scalar a_mu, Set::Scalar a_lambda, Set::Scalar a_yield, Set::Scalar a_hardening, Set::Scalar a_theta)
29 {
30 m_mu = a_mu;
31 theta = a_theta;
32 yield_strength = a_yield;
33 hardening_modulus = a_hardening;
34
35 curr = PlasticState::Zero();
36 prev = PlasticState::Zero();
37
38 Isotropic::Define(a_mu, a_lambda);
39 }
40
45
47 {
48 return (yield_strength*curr.alpha + 0.5*hardening_modulus*curr.alpha*curr.alpha);
49 }
50
52 {
53 Set::Scalar SQ2O3 = sqrt(1.0 - 1.0/((double)AMREX_SPACEDIM));
54 Set::Matrix sigdev = sigma - (1.0/((double)AMREX_SPACEDIM))*sigma.trace()*Set::Matrix::Identity();
55 Set::Matrix epsdev = strain - strain.trace()*Set::Matrix::Identity();
56
57 Set::Matrix zeta_trial = sigdev - prev.beta + 2.0*m_mu*epsdev;
58
59 Set::Scalar f_trial = zeta_trial.norm() - SQ2O3*(yield_strength + theta*hardening_modulus*prev.alpha);
60 if( f_trial <= 0.0)
61 {
62 curr.epsp = prev.epsp; curr.alpha = prev.alpha; curr.beta = prev.beta;
63 return;
64 }
65 Set::Matrix n_new = zeta_trial/zeta_trial.norm();
66 Set::Scalar dGamma = f_trial/(2.0*(m_mu)*(1.0 + (hardening_modulus/(3.0*m_mu))));
67 Set::Scalar dH = SQ2O3*(1.0-theta)*hardening_modulus*dGamma;
68
69 curr.alpha = prev.alpha + SQ2O3*dGamma;
70 curr.beta = prev.beta + SQ2O3*dH*n_new;
71 curr.epsp = prev.epsp + dGamma*n_new;
73 }
74
76 {
77 prev = Affine::PlasticState::Zero();
78 curr = Affine::PlasticState::Zero();
79 }
80
81 void SetPlasticStrains(PlasticState &a_state)
82 {
83 prev = a_state;
84 curr = a_state;
86 }
87
88 PlasticState GetPlasticState()
89 {
90 return curr;
91 }
92
93public:
94 PlasticState curr, prev;
95 Set::Scalar theta; // isotropic and kinematic hardening parameter
96 Set::Scalar yield_strength; // yield strength
97 Set::Scalar hardening_modulus; // hardening modulus
99
100public:
101 static void Parse(J2Plastic & value, IO::ParmParse & pp)
102 {
103 Set::Scalar mu, lambda;
104 if (pp.contains("lambda") && pp.contains("mu"))
105 {
106 pp.query("lambda",lambda); // Lame constant
107 pp.query("mu",mu); // Shear modulus
108 }
109 else if (pp.contains("E") && pp.contains("nu"))
110 {
111 Set::Scalar E, nu;
112 pp.query("E",E); // Young's modulus
113 pp.query("nu",nu); // Poisson's ratio
114 lambda = E * nu / (1.0 + nu) / (1.0 - 2.0*nu);
115 mu = E / 2.0 / (1.0 + nu);
116 }
117 Set::Scalar yield = 1.0, hardening = 1.0, theta_tmp = 1.0;
118
119 pp.query("yield", yield); // Yield strength
120 pp.query("hardening", hardening); // Hardening constant
121 pp.query("theta", theta_tmp); // Hardening theta
122
123 value.Define(mu, lambda, yield, hardening, theta_tmp);
124 }
125 AMREX_FORCE_INLINE
126 void operator += (const J2Plastic &rhs)
127 {
128 m_mu += rhs.m_mu;
129 curr += rhs.curr;
130 prev += rhs.prev;
131 theta += rhs.theta;
134
135 ddw += rhs.ddw;
136 F0 += rhs.F0;
137 }
138 AMREX_FORCE_INLINE
140 {
141 J2Plastic ret;
142 ret.m_mu = alpha * m_mu;
143 ret.curr = alpha*curr;
144 ret.prev = alpha*prev;
145 ret.theta = alpha*theta;
146 ret.yield_strength = alpha*yield_strength;
148
149 ret.ddw = ddw*alpha;
150 ret.F0 = F0*alpha;
151
152 return ret;
153 }
154 friend J2Plastic operator * (const Set::Scalar alpha, const J2Plastic b);
155 friend J2Plastic operator + (const J2Plastic a, const J2Plastic b);
156 friend J2Plastic operator - (const J2Plastic a, const J2Plastic b);
157
158};
159AMREX_FORCE_INLINE
161{
162 J2Plastic ret;
163 ret.m_mu = alpha * b.m_mu;
164 ret.curr = alpha * b.curr;
165 ret.prev = alpha * b.prev;
166 ret.theta = alpha * b.theta;
167 ret.yield_strength = alpha * b.yield_strength;
168 ret.hardening_modulus = alpha * b.hardening_modulus;
169
170 ret.ddw = b.ddw*alpha;
171 ret.F0 = b.F0*alpha;
172 return ret;
173}
174AMREX_FORCE_INLINE
176{
177 J2Plastic ret;
178 ret.m_mu = a.m_mu + b.m_mu;
179 ret.curr = a.curr + b.curr;
180 ret.prev = a.prev + b.prev;
181 ret.theta = a.theta + b.theta;
184
185 ret.ddw = a.ddw + b.ddw;
186 ret.F0 = a.F0 + b.F0;
187 return ret;
188}
189AMREX_FORCE_INLINE
191{
192 J2Plastic ret;
193 ret.m_mu = a.m_mu - b.m_mu;
194 ret.curr = a.curr - b.curr;
195 ret.prev = a.prev - b.prev;
196 ret.theta = a.theta - b.theta;
199
200 ret.ddw = a.ddw - b.ddw;
201 ret.F0 = a.F0 - b.F0;
202 return ret;
203}
204
205
206}
207}
208}
209#endif
bool contains(std::string name)
Definition ParmParse.H:154
Set::Matrix4< AMREX_SPACEDIM, SYM > ddw
Definition Affine.H:37
void Define(Set::Scalar a_mu, Set::Scalar a_lambda, Set::Matrix a_F0)
Definition Isotropic.H:25
friend J2Plastic operator+(const J2Plastic a, const J2Plastic b)
Definition J2Plastic.H:175
J2Plastic(Set::Scalar a_mu, Set::Scalar a_lambda, Set::Scalar a_yield, Set::Scalar a_hardening, Set::Scalar a_theta=1.0)
Definition J2Plastic.H:23
friend J2Plastic operator*(const Set::Scalar alpha, const J2Plastic b)
Definition J2Plastic.H:160
friend J2Plastic operator-(const J2Plastic a, const J2Plastic b)
Definition J2Plastic.H:190
void SetPlasticStrains(PlasticState &a_state)
Definition J2Plastic.H:81
void EvolvePlasticStrain(Set::Matrix sigma, Set::Matrix strain, Set::Scalar)
Definition J2Plastic.H:51
static void Parse(J2Plastic &value, IO::ParmParse &pp)
Definition J2Plastic.H:101
AMREX_FORCE_INLINE void operator+=(const J2Plastic &rhs)
Definition J2Plastic.H:126
J2Plastic(Solid< Set::Sym::Isotropic > base)
Definition J2Plastic.H:21
void Define(Set::Scalar a_mu, Set::Scalar a_lambda, Set::Scalar a_yield, Set::Scalar a_hardening, Set::Scalar a_theta)
Definition J2Plastic.H:28
AMREX_FORCE_INLINE J2Plastic operator+(const J2Plastic a, const J2Plastic b)
Definition J2Plastic.H:175
AMREX_FORCE_INLINE J2Plastic operator*(const Set::Scalar alpha, const J2Plastic b)
Definition J2Plastic.H:160
AMREX_FORCE_INLINE J2Plastic operator-(const J2Plastic a, const J2Plastic b)
Definition J2Plastic.H:190
amrex::Real Scalar
Definition Base.H:19
Eigen::Matrix< amrex::Real, AMREX_SPACEDIM, AMREX_SPACEDIM > Matrix
Definition Base.H:23