26 _pk1(getMaterialPropertyByName<
RankTwoTensor>(_base_name +
"pk1_stress")),
27 _dpk1(getMaterialPropertyByName<
RankFourTensor>(_base_name +
"pk1_jacobian")),
28 _dpk1_d_grad_u(getMaterialPropertyByName<
RankFourTensor>(_base_name +
"dpk1_d_grad_u")),
30 getMaterialPropertyByName<
RankFourTensor>(_base_name +
"pk1_jacobian_bypass_fbar"))
39 return G::gradOp(
component, _grad_test[_i][_qp], _test[_i][_qp], _q_point[_qp]);
58 return G::gradOp(
component, _grad_phi[_j][_qp], _phi[_j][_qp], _q_point[_qp]);
73 const bool incremental = (_F_bar_mode == FBarMode::Incremental);
76 std::vector<RankTwoTensor> f_ust_old_inv;
79 f_ust_old_inv.resize(_qrule->n_points());
80 for (
const auto qp :
make_range(_qrule->n_points()))
81 f_ust_old_inv[qp] = _F_ust_old[qp].inverse();
85 [
this,
component,
j, incremental, &f_ust_old_inv](
unsigned int qp)
88 return incremental ? g * f_ust_old_inv[qp] : g;
98 LagrangianStressDivergenceBase::precalculateResidual();
99 if (_stabilize_strain && _F_bar_mode == FBarMode::Incremental)
101 computeAverageGradientSpatialTest();
102 cachePK1ContractionFUst();
110 const unsigned int n_qp = _qrule->n_points();
111 _pk1_ddot_F_ust.assign(n_qp, 0.0);
113 _pk1_ddot_F_ust[qp] = _pk1[qp].doubleContraction(_F_ust[qp]);
124 populateLocalPK1Cache(_alpha);
125 if (_stabilize_strain && _F_bar_mode == FBarMode::Incremental)
127 computeAverageGradientSpatialTest();
128 computeAverageGradientSpatialPhi(_alpha);
129 computeAvgTestPhiCross(_alpha);
140 if (jvar == _disp_nums[beta])
142 populateLocalPK1Cache(beta);
143 if (_stabilize_strain && _F_bar_mode == FBarMode::Incremental)
145 computeAverageGradientSpatialTest();
146 computeAverageGradientSpatialPhi(beta);
147 computeAvgTestPhiCross(beta);
157 const unsigned int n_qp = _qrule->n_points();
158 const unsigned int n_phi = _phi.size();
159 _dpk1_grad_trial_cache.assign(n_qp, std::vector<RankTwoTensor>(n_phi));
160 _grad_trial_cache.assign(n_qp, std::vector<RankTwoTensor>(n_phi));
161 if (_stabilize_strain)
163 _delta_PK1_NL_cache.assign(n_qp, std::vector<RankTwoTensor>(n_phi));
164 _dpk1_total_cache.assign(n_qp, std::vector<RankTwoTensor>(n_phi));
170 const bool bbar = _stabilize_strain && _F_bar_mode == FBarMode::Incremental;
173 cachePK1ContractionFUst();
174 _dA_dU_cache.assign(n_qp, std::vector<Real>(n_phi));
177 for (
unsigned int qp = 0; qp < n_qp; ++qp)
181 for (
unsigned int j = 0;
j < n_phi; ++
j)
184 const RankTwoTensor grad_trial = G::gradOp(beta, _grad_phi[
j][qp], _phi[
j][qp], _q_point[qp]);
185 _grad_trial_cache[qp][
j] = grad_trial;
186 _dpk1_grad_trial_cache[qp][
j] = dpk1 * grad_trial;
187 if (_stabilize_strain)
195 const RankTwoTensor delta_F_avg = dFdGU * _avg_grad_trial[beta][
j];
196 const RankTwoTensor delta_sigma_nl = (*_d_nl_fbar)[qp] * delta_F_avg;
197 if (_large_kinematics)
198 _delta_PK1_NL_cache[qp][
j] =
199 (*_F_ust_det)[qp] * delta_sigma_nl * (*_F_ust_inv)[qp].
transpose();
201 _delta_PK1_NL_cache[qp][
j] = delta_sigma_nl;
203 _dpk1_total_cache[qp][
j] = _dpk1_grad_trial_cache[qp][
j] + _delta_PK1_NL_cache[qp][
j];
207 _dA_dU_cache[qp][
j] = (_dpk1_total_cache[qp][
j].doubleContraction(_F_ust[qp]) +
208 _pk1[qp].doubleContraction(_grad_trial_cache[qp][
j])) /
221 if (!_large_kinematics)
225 for (
unsigned int j = 0;
j < 3; ++
j)
234 if (!_large_kinematics)
238 for (
unsigned int j = 0;
j < 3; ++
j)
251 _avg_grad_spatial_test.assign(_test.size(), 0.0);
253 for (
unsigned int qp = 0; qp < _qrule->n_points(); ++qp)
255 const Real J = _large_kinematics ? (*_F_ust_det)[qp] : 1.0;
256 const Real w = J * _JxW[qp] * _coord[qp];
259 for (
unsigned int i = 0; i < _test.size(); ++i)
262 for (
unsigned int j = 0;
j < 3; ++
j)
263 g_x += _grad_test[i][qp](
j) * F_inv(
j, _alpha);
264 _avg_grad_spatial_test[i] += g_x * w;
267 for (
unsigned int i = 0; i < _test.size(); ++i)
268 _avg_grad_spatial_test[i] /= V_x;
277 _avg_grad_spatial_phi[beta].assign(_phi.size(), 0.0);
279 for (
unsigned int qp = 0; qp < _qrule->n_points(); ++qp)
281 const Real J = _large_kinematics ? (*_F_ust_det)[qp] : 1.0;
282 const Real w = J * _JxW[qp] * _coord[qp];
285 for (
unsigned int j = 0;
j < _phi.size(); ++
j)
288 for (
unsigned int k = 0;
k < 3; ++
k)
289 g_x += _grad_phi[
j][qp](
k) * F_inv(
k, beta);
290 _avg_grad_spatial_phi[beta][
j] += g_x * w;
293 for (
unsigned int j = 0;
j < _phi.size(); ++
j)
294 _avg_grad_spatial_phi[beta][
j] /= V_x;
307 const unsigned int n_test = _test.size();
308 const unsigned int n_phi = _phi.size();
309 std::vector<unsigned int> bs = {_alpha};
316 _avg_test_phi_cross[b1][b2].assign(n_test, std::vector<Real>(n_phi, 0.0));
321 std::vector<std::vector<Real>> gx_test(bs.size(), std::vector<Real>(n_test, 0.0));
322 std::vector<std::vector<Real>> gx_phi(bs.size(), std::vector<Real>(n_phi, 0.0));
323 for (
unsigned int qp = 0; qp < _qrule->n_points(); ++qp)
325 const Real J = _large_kinematics ? (*_F_ust_det)[qp] : 1.0;
326 const Real w = J * _JxW[qp] * _coord[qp];
329 for (
unsigned int bi = 0; bi < bs.size(); ++bi)
331 const unsigned int b = bs[bi];
332 for (
unsigned int i = 0; i < n_test; ++i)
335 for (
unsigned int k = 0;
k < 3; ++
k)
336 g += _grad_test[i][qp](
k) * F_inv(
k,
b);
339 for (
unsigned int j = 0;
j < n_phi; ++
j)
342 for (
unsigned int k = 0;
k < 3; ++
k)
343 g += _grad_phi[
j][qp](
k) * F_inv(
k,
b);
347 for (
unsigned int b1i = 0; b1i < bs.size(); ++b1i)
348 for (
unsigned int b2i = 0; b2i < bs.size(); ++b2i)
350 const unsigned int b1 = bs[b1i];
351 const unsigned int b2 = bs[b2i];
352 auto & dest = _avg_test_phi_cross[b1][b2];
353 for (
unsigned int i = 0; i < n_test; ++i)
354 for (
unsigned int j = 0;
j < n_phi; ++
j)
355 dest[i][
j] += gx_test[b1i][i] * gx_phi[b2i][
j] * w;
361 auto & dest = _avg_test_phi_cross[b1][b2];
362 for (
unsigned int i = 0; i < n_test; ++i)
363 for (
unsigned int j = 0;
j < n_phi; ++
j)
372 Real result = gradTest(_alpha).doubleContraction(_pk1[_qp]);
388 if (_stabilize_strain && _F_bar_mode == FBarMode::Incremental)
390 const Real PK1_F_over_3 = _pk1_ddot_F_ust[_qp] / 3.0;
391 result += PK1_F_over_3 * (_avg_grad_spatial_test[_i] - gradXTestComponent(_alpha));
410 : _dpk1_grad_trial_cache[_qp][_j]);
426 if (_stabilize_strain && _F_bar_mode == FBarMode::Incremental)
430 const Real A_qp = _pk1_ddot_F_ust[_qp] / 3.0;
431 const Real avg_T = _avg_grad_spatial_test[_i];
432 const Real T_alpha = gradXTestComponent(
alpha);
433 const Real B = avg_T - T_alpha;
435 const Real dA_dU = _dA_dU_cache[_qp][_j];
439 const Real T_beta_i = gradXTestComponent(beta);
440 const Real phi_alpha_j = gradXPhiComponent(
alpha);
441 const Real dT_alpha_dU = -T_beta_i * phi_alpha_j;
443 const Real avg_cross_ab = _avg_test_phi_cross[
alpha][beta][_i][_j];
444 const Real avg_cross_ba = _avg_test_phi_cross[beta][
alpha][_i][_j];
445 const Real d_avg_T_dU = avg_cross_ab - avg_cross_ba - avg_T * _avg_grad_spatial_phi[beta][_j];
447 const Real dB_dU = d_avg_T_dU - dT_alpha_dU;
448 J += dA_dU *
B + A_qp * dB_dU;
460 for (
const auto deigen_darg : _deigenstrain_dargs[cvar])
461 total_deigen += (*deigen_darg)[_qp];
466 if (total_deigen.
L2norm() == 0.0)
476 const RankTwoTensor dsigma_dT = (*_dcauchy_stress_d_eigenstrain)[_qp] * total_deigen;
478 if (_large_kinematics)
479 dP_dT = _F[_qp].
det() * dsigma_dT * _F_inv[_qp].
transpose();
494 return _dpk1_bypass_fbar[_qp].contractionKl(2, 2, gradTest(_alpha)) *
495 _out_of_plane_strain->phi()[_j][_qp];
Real gradXPhiComponent(unsigned int component) const
(grad_x phi_j)_component at the current _qp, same push-forward as gradXTestComponent.
virtual RankTwoTensor gradTrialUnstabilized(unsigned int component)
The unstabilized trial function gradient.
virtual void precalculateOffDiagJacobian(unsigned int jvar) override
static const std::string component
virtual Real computeQpJacobianOutOfPlaneStrain() override
virtual void precalculateJacobian() override
void computeAverageGradientSpatialTest()
Compute element-averaged spatial gradient of test functions for component _alpha, filling _avg_grad_s...
static RankTwoTensorTempl Identity()
virtual RankTwoTensor gradTest(unsigned int component) override
void computeAverageGradientSpatialPhi(unsigned int beta)
Compute element-averaged spatial gradient of trial functions for component beta, filling _avg_grad_sp...
void populateLocalPK1Cache(unsigned int beta)
Populate the per-(qp, j) caches consumed by computeQpJacobianDisplacement.
virtual void precalculateOffDiagJacobian(unsigned int jvar) override
virtual Real computeQpJacobianTemperature(unsigned int cvar) override
Real doubleContraction(const RankTwoTensorTempl< Real > &a) const
static InputParameters validParams()
virtual Real computeQpJacobianDisplacement(unsigned int alpha, unsigned int beta) override
RankTwoTensorTempl< Real > transpose() const
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
void cachePK1ContractionFUst()
Cache pk1 : F_ust per qp (the J * tr(sigma) factor of the B-bar volumetric correction).
static const std::string alpha
Enforce equilibrium with a total Lagrangian formulation.
IntRange< T > make_range(T beg, T end)
virtual void precalculateJacobian() override
auto elementAverage(const Functor &f, const MooseArray< Real > &JxW, const MooseArray< Real > &coord)
static InputParameters baseParams()
TotalLagrangianStressDivergenceBase(const InputParameters ¶meters)
void computeAvgTestPhiCross(unsigned int beta)
Compute element-averaged cross product (grad_x test_i)_{b1} * (grad_x phi_j)_{b2} for b1...
static const std::complex< double > j(0, 1)
Complex number "j" (also known as "i")
virtual void precalculateResidual() override
virtual Real computeQpResidual() override
virtual RankTwoTensor gradTrial(unsigned int component) override
Real gradXTestComponent(unsigned int component) const
(grad_x test_i)_component at the current _qp, where the push-forward uses the unstabilized F (= F_act...
virtual void precalculateJacobianDisplacement(unsigned int component) override
Prepare the average shape function gradients for stabilization.
static const std::string k
Base class of the "Lagrangian" kernel system.