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>
8
9namespace Model
10{
11namespace Solid
12{
13namespace Affine
14{
15class J2Plastic : public Isotropic
16{
17public:
19
20 void DefineSlipSystem(Set::Scalar a_yield, Set::Scalar a_hardening, Set::Scalar a_theta)
21 {
22 theta = a_theta;
23 yield_strength = a_yield;
24 hardening_modulus = a_hardening;
25 }
26
31
36
37 void Advance(Set::Scalar /*dt*/, Set::Matrix eps, Set::Matrix /*sig*/) override
38 {
39 Set::Scalar SQ2O3 = sqrt(1.0 - 1.0/((double)AMREX_SPACEDIM));
40
42 Set::Matrix sigdev = sig - (1.0/((double)AMREX_SPACEDIM))*sig.trace()*Set::Matrix::Identity();
43
44 Set::Matrix del_eps = eps - strain_prev;
45 Set::Matrix epsdev = del_eps - (1.0/((double)AMREX_SPACEDIM))*del_eps.trace()*Set::Matrix::Identity();
46
47 Set::Matrix zeta_trial = sigdev - beta + 2.0*ddw.Mu()*epsdev;
48 Set::Scalar f_trial = zeta_trial.norm() - SQ2O3*(yield_strength + theta*hardening_modulus*alpha);
49 if( f_trial <= 0.0) return;
50
51 Set::Matrix n_new = zeta_trial/zeta_trial.norm();
52 Set::Scalar dGamma = f_trial/(2.0*(ddw.Mu())*(1.0 + (hardening_modulus/(3.0*ddw.Mu()))));
53 Set::Scalar dH = SQ2O3*(1.0-theta)*hardening_modulus*dGamma;
54
55 beta += SQ2O3*dH*n_new;
56 F0 += dGamma*n_new;
57 alpha += SQ2O3*dGamma;
58
59 strain_prev = eps;
60
61 if(std::isnan(F0.norm()))
62 {
63 Util::Message(INFO, "f_trial = ", f_trial);
64 Util::Abort(INFO, "Nans detected");
65 }
66 }
67
68public:
69 Set::Matrix beta = Set::Matrix::Zero();
70 Set::Matrix strain_prev = Set::Matrix::Zero();
72 Set::Scalar theta; // isotropic and kinematic hardening parameter
73 Set::Scalar yield_strength; // yield strength
74 Set::Scalar hardening_modulus; // hardening modulus
75
76public:
77 static J2Plastic Zero()
78 {
79 J2Plastic ret;
80 ret.Define(0.,0.,Set::Matrix::Zero());
81 ret.DefineSlipSystem(0.,0.,0.);
82 return ret;
83 }
85 {
86 J2Plastic ret;
87 ret.Define(Util::Random(),Util::Random(),Set::Matrix::Random());
89 ret.beta = Set::Matrix::Random();
90 ret.strain_prev = Set::Matrix::Random();
91 ret.alpha = Util::Random();
92 return ret;
93 }
94 static void Parse(J2Plastic & value, IO::ParmParse & pp)
95 {
96 Isotropic::Parse(value,pp);
97
98 Set::Scalar yield = 1.0, hardening = 1.0, theta_tmp = 1.0;
99 // Yield strength
100 pp.query("yield", yield);
101 // hardening parameter
102 pp.query("hardening", hardening);
103 // $\theta$
104 pp.query("theta", theta_tmp);
105
106 value.DefineSlipSystem(yield, hardening, theta_tmp);
107 }
108 #define OP_CLASS J2Plastic
109 #define OP_VARS X(ddw) X(F0) X(beta) X(theta) X(yield_strength) X(hardening_modulus) X(strain_prev) X(alpha)
111
112};
114}
115}
116}
117
118template<>
123
124template<>
126{
127
128 if (i==0) return name + ".epsp_xx";
129 if (i==1) return name + ".epsp_xy";
130 if (i==2) return name + AMREX_D_PICK("",".epsp_yx",".epsp_xz");
131 if (i==3) return name + AMREX_D_PICK("",".epsp_yy",".epsp_yx");
132 if (i==4) return name + ".epsp_yy";
133 if (i==5) return name + ".epsp_yz";
134 if (i==6) return name + ".epsp_zx";
135 if (i==7) return name + ".epsp_zy";
136 if (i==8) return name + ".epsp_zz";
137 return name;
138}
139
140template<>
141inline void Set::Field<Model::Solid::Affine::J2Plastic>::Copy(int a_lev, amrex::MultiFab &a_dst, int a_dstcomp, int a_nghost) const
142{
143 for (amrex::MFIter mfi(a_dst, amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi)
144 {
145 const amrex::Box& bx = mfi.growntilebox(amrex::IntVect(a_nghost));
146 if (bx.ok())
147 {
148 amrex::Array4<const Model::Solid::Affine::J2Plastic> const & src = ((*this)[a_lev])->array(mfi);
149 amrex::Array4<Set::Scalar> const & dst = a_dst.array(mfi);
150 for (int n = 0; n < AMREX_SPACEDIM*AMREX_SPACEDIM; n++)
151 {
152 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(int i, int j, int k) {
154 });
155 }
156 }
157 }
158}
159
160#endif
#define INFO
Definition Util.H:21
Set::Matrix4< AMREX_SPACEDIM, SYM > ddw
Definition Affine.H:37
static void Parse(Isotropic &value, IO::ParmParse &pp)
Definition Isotropic.H:77
void Define(Set::Scalar a_mu, Set::Scalar a_lambda, Set::Matrix a_F0)
Definition Isotropic.H:25
Set::Matrix DW(const Set::Matrix &F) const override
Definition Isotropic.H:40
static J2Plastic Zero()
Definition J2Plastic.H:77
void Advance(Set::Scalar, Set::Matrix eps, Set::Matrix) override
Definition J2Plastic.H:37
static void Parse(J2Plastic &value, IO::ParmParse &pp)
Definition J2Plastic.H:94
static J2Plastic Random()
Definition J2Plastic.H:84
void DefineSlipSystem(Set::Scalar a_yield, Set::Scalar a_hardening, Set::Scalar a_theta)
Definition J2Plastic.H:20
std::string Name(int) const
Definition Set.H:73
void Copy(int, amrex::MultiFab &, int, int) const
Definition Set.H:68
int NComp() const
Definition Set.H:72
amrex::Real Scalar
Definition Base.H:18
Eigen::Matrix< amrex::Real, AMREX_SPACEDIM, 1 > Vector
Definition Base.H:19
Eigen::Matrix< amrex::Real, AMREX_SPACEDIM, AMREX_SPACEDIM > Matrix
Definition Base.H:22
void Abort(const char *msg)
Definition Util.cpp:225
Set::Scalar Random()
Definition Set.cpp:9
void Message(std::string file, std::string func, int line, Args const &... args)
Definition Util.H:126