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]);
50 return gradTrialUnstabilized(component);
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();
83 for (
auto j : make_range(_phi.size()))
85 [
this, component, j, incremental, &f_ust_old_inv](
unsigned int qp)
87 const RankTwoTensor g = G::gradOp(component, _grad_phi[j][qp], _phi[j][qp], _q_point[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);
112 for (
const auto qp : make_range(n_qp))
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);
139 for (
auto beta : make_range(_ndisp))
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)
222 return _grad_test[_i][_qp](component);
225 for (
unsigned int j = 0; j < 3; ++j)
226 out += _grad_test[_i][_qp](j) * F_inv(j, component);
234 if (!_large_kinematics)
235 return _grad_phi[_j][_qp](component);
238 for (
unsigned int j = 0; j < 3; ++j)
239 out += _grad_phi[_j][_qp](j) * F_inv(j, component);
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));
409 Real J = grad_test.
doubleContraction(_stabilize_strain ? _dpk1_total_cache[_qp][_j]
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];
Base class of the "Lagrangian" kernel system.
virtual void precalculateOffDiagJacobian(unsigned int jvar) override
static InputParameters validParams()
virtual void precalculateJacobian() override
T doubleContraction(const RankTwoTensorTempl< T > &a) const
RankTwoTensorTempl< T > transpose() const
static RankTwoTensorTempl Identity()
Enforce equilibrium with a total Lagrangian formulation.
static InputParameters baseParams()
void computeAvgTestPhiCross(unsigned int beta)
Compute element-averaged cross product (grad_x test_i)_{b1} * (grad_x phi_j)_{b2} for b1,...
virtual RankTwoTensor gradTrial(unsigned int component) override
virtual Real computeQpJacobianTemperature(unsigned int cvar) override
void cachePK1ContractionFUst()
Cache pk1 : F_ust per qp (the J * tr(sigma) factor of the B-bar volumetric correction).
virtual RankTwoTensor gradTrialUnstabilized(unsigned int component)
The unstabilized trial function gradient.
virtual void precalculateOffDiagJacobian(unsigned int jvar) override
virtual void precalculateJacobianDisplacement(unsigned int component) override
Prepare the average shape function gradients for stabilization.
void computeAverageGradientSpatialTest()
Compute element-averaged spatial gradient of test functions for component _alpha, filling _avg_grad_s...
virtual RankTwoTensor gradTest(unsigned int component) override
virtual void precalculateResidual() override
virtual Real computeQpResidual() override
void computeAverageGradientSpatialPhi(unsigned int beta)
Compute element-averaged spatial gradient of trial functions for component beta, filling _avg_grad_sp...
virtual Real computeQpJacobianDisplacement(unsigned int alpha, unsigned int beta) override
TotalLagrangianStressDivergenceBase(const InputParameters ¶meters)
virtual Real computeQpJacobianOutOfPlaneStrain() 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 precalculateJacobian() override
Real gradXPhiComponent(unsigned int component) const
(grad_x phi_j)_component at the current _qp, same push-forward as gradXTestComponent.
void populateLocalPK1Cache(unsigned int beta)
Populate the per-(qp, j) caches consumed by computeQpJacobianDisplacement.
auto elementAverage(const Functor &f, const MooseArray< Real > &JxW, const MooseArray< Real > &coord)