26 usingTensorIndices(i,
j,
k, l);
27 return (1.0 + dQ.
trace()) * I.times<i,
k,
j, l>(I) - dQ.
times<i,
k,
j, l>(I) -
28 I.times<i,
k,
j, l>(dQ);
32 std::tuple<RankTwoTensor, RankFourTensor>
51 Eigen::Matrix<Real, 9, 9>
A;
52 Eigen::Matrix<Real, 9, 1>
b;
56 b(3 * i +
j) = S0(i,
j);
59 A(3 * i +
j, 3 *
k + l) = J(i,
j,
k, l);
61 const Eigen::Matrix<Real, 9, 1>
x =
A.partialPivLu().solve(
b);
65 S(i,
j) =
x(3 * i +
j);
74 usingTensorIndices(i,
j,
k, l);
75 return S.times<i,
j,
k, l>(I) - I.times<i,
k, l,
j>(
S) -
S.times<i, l,
j,
k>(I);
84 return Jinv * (small_jacobian - U);
97 const Real theta = std::sqrt(theta2);
101 Real f, g, df_dth, dg_dth;
102 const Real small_theta = 1.0e-7;
103 if (theta < small_theta)
105 f = 1.0 - theta2 / 6.0;
106 g = 0.5 - theta2 / 24.0;
107 df_dth = -theta / 3.0;
108 dg_dth = -theta / 12.0;
112 const Real s = std::sin(theta),
c = std::cos(theta);
114 g = (1.0 -
c) / theta2;
115 df_dth = (theta *
c - s) / theta2;
116 dg_dth = (theta * s - 2.0 * (1.0 -
c)) / (theta * theta2);
126 usingTensorIndices(i_, j_, m_, n_);
128 I2.template times<i_, m_, n_, j_>(W) + W.template times<i_, m_, j_, n_>(I2);
130 if (theta >= small_theta)
132 const Real inv_2theta = 1.0 / (2.0 * theta);
135 *dR_dW += (df_dth * inv_2theta) * W.template times<i_, j_, m_, n_>(W);
136 *dR_dW += (dg_dth * inv_2theta) * W2.template times<i_, j_, m_, n_>(W);
162 out.cauchy_stress =
S;
184 out.cauchy_stress =
S;
199 usingTensorIndices(i,
j,
k, l, m);
213 out.cauchy_stress =
S;
225 T.times<m,
j, i, m,
k, l>(d_R_d_F * d_F_d_dL) + d_dO_d_invdf * d_invdf_d_dL;
237 usingTensorIndices(i_, j_, k_, l_, m_, n_);
241 const RankTwoTensor rhat = rotationFromVorticity(in.
dW, need_jacobian ? &d_rhat_d_dW :
nullptr);
247 out.cauchy_stress = rhat * S_inner * rhatT;
282 out.cauchy_jacobian = T1 + T2 + T3;
292 const std::string s = rate;
293 if (s ==
"truesdell")
296 return jaumann(in, need_jacobian);
297 if (s ==
"green_naghdi")
300 return rashid(in, need_jacobian);
301 mooseError(
"Unknown objective_rate value: ", s);
RankFourTensorTempl< T > inverse() const
static RankFourTensorTempl< Real > IdentityFour()
void mooseError(Args &&... args)
Objective-stress-rate updates as stateless free functions.
Outputs greenNaghdi(const Inputs &in, bool need_jacobian)
sigma_{n+1} = J(dO)^{-1} (sigma_n + Deltasigma), with dO built from the polar rotation increment...
Outputs jaumann(const Inputs &in, bool need_jacobian)
sigma_{n+1} = J(dW)^{-1} (sigma_n + Deltasigma). Jaumann rate.
static RankTwoTensorTempl Identity()
const std::vector< double > x
static const std::string S
Real f(Real x)
Test function for Brents method.
Real doubleContraction(const RankTwoTensorTempl< Real > &a) const
RankTwoTensorTempl< Real > transpose() const
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
RankFourTensorTempl< Real > times(const RankTwoTensorTempl< Real > &b) const
Outputs truesdell(const Inputs &in, bool need_jacobian)
sigma_{n+1} = J(dL)^{-1} (sigma_n + Deltasigma). Truesdell rate.
IntRange< T > make_range(T beg, T end)
static const std::complex< double > j(0, 1)
Complex number "j" (also known as "i")
Per-qp outputs a rate produces.
Outputs rashid(const Inputs &in, bool need_jacobian)
sigma_{n+1} = r_hat (sigma_n + Deltasigma) r_hat^T, r_hat = exp(Deltaw).
static const std::string k
Outputs compute(const MooseEnum &rate, const Inputs &in, bool need_jacobian)
Dispatch to the rate selected by the objective_rate enum (truesdell / jaumann / green_naghdi / rashid...