https://mooseframework.inl.gov
Loading...
Searching...
No Matches
TotalLagrangianStressDivergenceBase.C
Go to the documentation of this file.
1//* This file is part of the MOOSE framework
2//* https://mooseframework.inl.gov
3//*
4//* All rights reserved, see COPYRIGHT for full restrictions
5//* https://github.com/idaholab/moose/blob/master/COPYRIGHT
6//*
7//* Licensed under LGPL 2.1, please see LICENSE for details
8//* https://www.gnu.org/licenses/lgpl-2.1.html
9
11
12template <class G>
15{
17 // This kernel requires use_displaced_mesh to be off
18 params.suppressParameter<bool>("use_displaced_mesh");
19 return params;
20}
21
22template <class G>
24 const InputParameters & parameters)
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")),
29 _dpk1_bypass_fbar(
30 getMaterialPropertyByName<RankFourTensor>(_base_name + "pk1_jacobian_bypass_fbar"))
31{
32}
33
34template <class G>
37{
38 // F-bar doesn't modify the test function
39 return G::gradOp(component, _grad_test[_i][_qp], _test[_i][_qp], _q_point[_qp]);
40}
41
42template <class G>
45{
46 // After the F_ust-wrap architectural change, pk1_jacobian = dPK1/d(F_ust) already
47 // contains the local F-bar contribution (via the sigma-chain through
48 // `_d_F_stab_d_F_ust`). The trial gradient is always unstabilized; the non-local F-bar
49 // Jacobian contribution is added explicitly in `computeQpJacobianDisplacement`.
50 return gradTrialUnstabilized(component);
51}
52
53template <class G>
56{
57 // Without F-bar stabilization, simply return the gradient of the trial functions
58 return G::gradOp(component, _grad_phi[_j][_qp], _phi[_j][_qp], _q_point[_qp]);
59}
60
61template <class G>
62void
64{
65 // For total Lagrangian, the averaging is taken on the reference frame regardless of geometric
66 // nonlinearity. The stored quantity is what the strain calc's `_d_F_stab_d_F_avg` contracts
67 // with: deltaF_avg in `F_bar_mode = total`, deltaf_avg in `F_bar_mode = incremental`.
68 // total: avg_q(grad_phi[j][q]) -> deltaF_avg per DOF
69 // incremental: avg_q(grad_phi[j][q] * F_ust_old[q]^{-1})
70 // -> deltaf_avg per DOF
71 // (since f_ust = F_ust * F_ust_old^{-1} and F_ust_old is fixed w.r.t. the
72 // current Newton iterate's disp, so deltaf_ust = deltaF_ust * F_ust_old^{-1}).
73 const bool incremental = (_F_bar_mode == FBarMode::Incremental);
74 // F_ust_old[qp]^{-1} depends only on qp, but the average below runs once per trial DOF j.
75 // Precompute the per-qp inverse once instead of re-inverting the 3x3 for every (qp, j).
76 std::vector<RankTwoTensor> f_ust_old_inv;
77 if (incremental)
78 {
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();
82 }
83 for (auto j : make_range(_phi.size()))
84 _avg_grad_trial[component][j] = StabilizationUtils::elementAverage(
85 [this, component, j, incremental, &f_ust_old_inv](unsigned int qp)
86 {
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;
89 },
90 _JxW,
91 _coord);
92}
93
94template <class G>
95void
97{
98 LagrangianStressDivergenceBase::precalculateResidual();
99 if (_stabilize_strain && _F_bar_mode == FBarMode::Incremental)
100 {
101 computeAverageGradientSpatialTest();
102 cachePK1ContractionFUst();
103 }
104}
105
106template <class G>
107void
109{
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]);
114}
115
116template <class G>
117void
119{
121 // Populate the per-(qp, j) local PK1 chain cache for the diagonal column (beta = _alpha).
122 // Runs regardless of `_stabilize_strain` because the local chain is always needed; the
123 // helper itself only touches `_avg_grad_trial` when stab is on.
124 populateLocalPK1Cache(_alpha);
125 if (_stabilize_strain && _F_bar_mode == FBarMode::Incremental)
126 {
127 computeAverageGradientSpatialTest();
128 computeAverageGradientSpatialPhi(_alpha);
129 computeAvgTestPhiCross(_alpha);
130 }
131}
132
133template <class G>
134void
136{
138 // Populate the per-(qp, j) local PK1 chain cache for the matched off-diagonal beta.
139 for (auto beta : make_range(_ndisp))
140 if (jvar == _disp_nums[beta])
141 {
142 populateLocalPK1Cache(beta);
143 if (_stabilize_strain && _F_bar_mode == FBarMode::Incremental)
144 {
145 computeAverageGradientSpatialTest();
146 computeAverageGradientSpatialPhi(beta);
147 computeAvgTestPhiCross(beta);
148 }
149 break;
150 }
151}
152
153template <class G>
154void
156{
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)
162 {
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));
165 }
166
167 // B-bar volumetric correction (incremental mode only): cache the column-independent
168 // `pk1 : F_ust` per qp and the per-(qp, j) `dA/dU` term so the Jacobian inner loop reads
169 // scalars instead of recomputing three double contractions per (_i, _j, component).
170 const bool bbar = _stabilize_strain && _F_bar_mode == FBarMode::Incremental;
171 if (bbar)
172 {
173 cachePK1ContractionFUst();
174 _dA_dU_cache.assign(n_qp, std::vector<Real>(n_phi));
175 }
176
177 for (unsigned int qp = 0; qp < n_qp; ++qp)
178 {
179 const RankFourTensor & dpk1 = _dpk1_d_grad_u[qp];
180 const RankFourTensor & dFdGU = _d_F_d_grad_u[qp];
181 for (unsigned int j = 0; j < n_phi; ++j)
182 {
183 // gradTrial == gradTrialUnstabilized in TL (line ~50); single cache feeds both consumers.
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)
188 {
189 // Compose the full non-local F-bar PK1 perturbation:
190 // deltasigma_NL = D_nl[qp] * (_d_F_d_grad_u[qp] * _avg_grad_trial[beta][j])
191 // deltaPK1_NL = det(F_ust) * deltasigma_NL * F_ust^{-T} (large kinematics)
192 // = deltasigma_NL (small kinematics)
193 // D_nl (`_d_nl_fbar`), det(F_ust), and F_ust^{-1} are all per-qp material properties
194 // from the stress/strain materials -- no kernel-side cache.
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();
200 else
201 _delta_PK1_NL_cache[qp][j] = delta_sigma_nl;
202 // Local + non-local PK1 derivative: the single tensor the disp Jacobian contracts against.
203 _dpk1_total_cache[qp][j] = _dpk1_grad_trial_cache[qp][j] + _delta_PK1_NL_cache[qp][j];
204 }
205 // dA/dU = [ (dPK1_local + dPK1_NL) : F_ust + pk1 : dF_ust ] / 3, all per (qp, j).
206 if (bbar)
207 _dA_dU_cache[qp][j] = (_dpk1_total_cache[qp][j].doubleContraction(_F_ust[qp]) +
208 _pk1[qp].doubleContraction(_grad_trial_cache[qp][j])) /
209 3.0;
210 }
211 }
212}
213
214template <class G>
215Real
217{
218 // (grad_x test_i)_component = (grad_X test_i)_j (F_ust^{-1})_{j, component}
219 // Push-forward via F_ust (= F_actual at alpha=1) matches the PK1 wrap. F_ust^{-1} is a
220 // material property (computed once per qp by the strain calc), not recomputed here.
221 if (!_large_kinematics)
222 return _grad_test[_i][_qp](component);
223 const RankTwoTensor & F_inv = (*_F_ust_inv)[_qp];
224 Real out = 0.0;
225 for (unsigned int j = 0; j < 3; ++j)
226 out += _grad_test[_i][_qp](j) * F_inv(j, component);
227 return out;
228}
229
230template <class G>
231Real
233{
234 if (!_large_kinematics)
235 return _grad_phi[_j][_qp](component);
236 const RankTwoTensor & F_inv = (*_F_ust_inv)[_qp];
237 Real out = 0.0;
238 for (unsigned int j = 0; j < 3; ++j)
239 out += _grad_phi[_j][_qp](j) * F_inv(j, component);
240 return out;
241}
242
243template <class G>
244void
246{
247 // _avg_grad_spatial_test[i] = (1/V_x) int (grad_x test_i)_alpha dV_x
248 // = (sum_qp (grad_X test_i)_j (F_ust^{-1})_{j, _alpha} * J_ust * w)
249 // / (sum_qp J_ust * w), w = JxW * coord
250 // For small kinematics, F_ust = I, J_ust = 1, reducing to OLD's element-averaged grad_test.
251 _avg_grad_spatial_test.assign(_test.size(), 0.0);
252 Real V_x = 0.0;
253 for (unsigned int qp = 0; qp < _qrule->n_points(); ++qp)
254 {
255 const Real J = _large_kinematics ? (*_F_ust_det)[qp] : 1.0;
256 const Real w = J * _JxW[qp] * _coord[qp];
257 V_x += w;
258 const RankTwoTensor F_inv = _large_kinematics ? (*_F_ust_inv)[qp] : RankTwoTensor::Identity();
259 for (unsigned int i = 0; i < _test.size(); ++i)
260 {
261 Real g_x = 0.0;
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;
265 }
266 }
267 for (unsigned int i = 0; i < _test.size(); ++i)
268 _avg_grad_spatial_test[i] /= V_x;
269}
270
271template <class G>
272void
274{
275 // Same structure as computeAverageGradientSpatialTest, but for trial functions and component
276 // beta.
277 _avg_grad_spatial_phi[beta].assign(_phi.size(), 0.0);
278 Real V_x = 0.0;
279 for (unsigned int qp = 0; qp < _qrule->n_points(); ++qp)
280 {
281 const Real J = _large_kinematics ? (*_F_ust_det)[qp] : 1.0;
282 const Real w = J * _JxW[qp] * _coord[qp];
283 V_x += w;
284 const RankTwoTensor F_inv = _large_kinematics ? (*_F_ust_inv)[qp] : RankTwoTensor::Identity();
285 for (unsigned int j = 0; j < _phi.size(); ++j)
286 {
287 Real g_x = 0.0;
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;
291 }
292 }
293 for (unsigned int j = 0; j < _phi.size(); ++j)
294 _avg_grad_spatial_phi[beta][j] /= V_x;
295}
296
297template <class G>
298void
300{
301 // Populate the cross-products
302 // _avg_test_phi_cross[b1][b2][i][j] = (1/V_x) int (grad_x test_i)_{b1} * (grad_x phi_j)_{b2}
303 // dV_x
304 // for the 4 combinations of (b1, b2) in {_alpha, beta}. The d(avg_grad_spatial_test)/dU
305 // term in the B-bar Jacobian needs both (alpha, beta) and (beta, alpha) entries; the
306 // diagonal (alpha == beta) collapses to a single combination.
307 const unsigned int n_test = _test.size();
308 const unsigned int n_phi = _phi.size();
309 std::vector<unsigned int> bs = {_alpha};
310 if (beta != _alpha)
311 bs.push_back(beta);
312 // Zero out and resize the affected slots
313 for (auto b1 : bs)
314 for (auto b2 : bs)
315 {
316 _avg_test_phi_cross[b1][b2].assign(n_test, std::vector<Real>(n_phi, 0.0));
317 }
318 Real V_x = 0.0;
319 // Cache (grad_x test_i)_{b1} and (grad_x phi_j)_{b2} per qp to avoid recomputing for
320 // each (i, j) pair.
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)
324 {
325 const Real J = _large_kinematics ? (*_F_ust_det)[qp] : 1.0;
326 const Real w = J * _JxW[qp] * _coord[qp];
327 V_x += w;
328 const RankTwoTensor F_inv = _large_kinematics ? (*_F_ust_inv)[qp] : RankTwoTensor::Identity();
329 for (unsigned int bi = 0; bi < bs.size(); ++bi)
330 {
331 const unsigned int b = bs[bi];
332 for (unsigned int i = 0; i < n_test; ++i)
333 {
334 Real g = 0.0;
335 for (unsigned int k = 0; k < 3; ++k)
336 g += _grad_test[i][qp](k) * F_inv(k, b);
337 gx_test[bi][i] = g;
338 }
339 for (unsigned int j = 0; j < n_phi; ++j)
340 {
341 Real g = 0.0;
342 for (unsigned int k = 0; k < 3; ++k)
343 g += _grad_phi[j][qp](k) * F_inv(k, b);
344 gx_phi[bi][j] = g;
345 }
346 }
347 for (unsigned int b1i = 0; b1i < bs.size(); ++b1i)
348 for (unsigned int b2i = 0; b2i < bs.size(); ++b2i)
349 {
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;
356 }
357 }
358 for (auto b1 : bs)
359 for (auto b2 : bs)
360 {
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)
364 dest[i][j] /= V_x;
365 }
366}
367
368template <class G>
369Real
371{
372 Real result = gradTest(_alpha).doubleContraction(_pk1[_qp]);
373
374 // OLD-compat B-bar volumetric correction (only in `F_bar_mode = incremental`, the explicit
375 // OLD-compat mode). This adds
376 // int (tr sigma / 3) * (avg_grad_x test - grad_x test)_alpha dV_x
377 // expressed in reference-frame integration as
378 // sum_qp ((PK1 : F_ust) / 3) * (avg_grad_spatial_test[_i] - grad_x_test_alpha) * JxW * coord
379 // (the J = det(F_ust) factor is already absorbed into `PK1 : F_ust = J * tr sigma`).
380 // Without this term, PK1 = det(F_ust) sigma F_ust^{-T} reproduces OLD's `sigma : grad_x test`
381 // term but not OLD's vol-locking correction; for uniform sigma that's harmless (the integral
382 // vanishes per element) but for non-uniform sigma -- e.g. mixed-component Dirichlet BCs producing
383 // non-affine equilibrium with plasticity + a kinematic decomposition that gives spatially varying
384 // sigma -- it drives the converged displacement away from OLD's. Scoped to incremental mode
385 // because (a) that's the documented OLD-compat F-bar mode and (b) the existing `total` mode tests
386 // are calibrated to the F-bar-in-sigma-only formulation (adding the B-bar term there would be
387 // a separate behavior change).
388 if (_stabilize_strain && _F_bar_mode == FBarMode::Incremental)
389 {
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));
392 }
393 return result;
394}
395
396template <class G>
397Real
399 unsigned int beta)
400{
401 // gradTest(alpha) feeds the local Jacobian contraction below.
402 const RankTwoTensor grad_test = gradTest(alpha);
403
404 // Local (+ non-local F-bar) Jacobian: J_{alpha beta} = gradTest_alpha : dPK1_total, where
405 // dPK1_total = dPK1/d(grad u) * grad_phi_beta (local) plus the wrapped non-local F-bar
406 // perturbation. Both pieces depend only on (qp, j) and are precomputed and pre-summed into
407 // `_dpk1_total_cache` by `populateLocalPK1Cache(beta)`, so a single contraction covers both.
408 // Without stabilization there is no non-local piece, so the local cache is contracted directly.
409 Real J = grad_test.doubleContraction(_stabilize_strain ? _dpk1_total_cache[_qp][_j]
410 : _dpk1_grad_trial_cache[_qp][_j]);
411
412 // OLD-compat B-bar volumetric correction Jacobian (only in `F_bar_mode = incremental`).
413 // The residual added the term R_extra = (PK1:F_ust)/3 * (avg_T - T_alpha) summed over qps.
414 // Linearizing per (i, j, alpha, beta):
415 // J_extra_qp = (1/3) * d(PK1:F_ust)/dU * (avg_T - T_alpha)
416 // + (1/3) * (PK1:F_ust) * (d(avg_T)/dU - dT_alpha/dU)
417 // with derivatives in U (the trial-DOF for component beta at node j):
418 // d(PK1:F_ust)/dU|qp = (dPK1_local + dPK1_NL) : F_ust + PK1 : dF_ust_local
419 // dPK1_local = _dpk1_grad_trial_cache[_qp][_j] (cached above)
420 // dPK1_NL = d_PK1_NL (cached above)
421 // dF_ust = _grad_trial_cache[_qp][_j] (cached unstabilized trial)
422 // dT_alpha/dU|qp = -(grad_x test_i)_beta * (grad_x phi_j)_alpha (local cross)
423 // d(avg_T)/dU = avgCross(alpha, beta) - avgCross(beta, alpha) - avg_T(i) *
424 // avg_grad_spatial_phi[beta][j]
425 // avgCross(b1, b2) = _avg_test_phi_cross[b1][b2][i][j] (precomputed)
426 if (_stabilize_strain && _F_bar_mode == FBarMode::Incremental)
427 {
428 // A_qp (= pk1:F_ust/3, per qp) and dA_dU (per qp, j) are precomputed in
429 // `cachePK1ContractionFUst` / `populateLocalPK1Cache` -- no double contractions here.
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;
434
435 const Real dA_dU = _dA_dU_cache[_qp][_j];
436
437 // dB/dU: -dT_alpha/dU + d(avg_T)/dU
438 // dT_alpha/dU = -(grad_x test_i)_beta * (grad_x phi_j)_alpha (local cross at _qp)
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;
442
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];
446
447 const Real dB_dU = d_avg_T_dU - dT_alpha_dU;
448 J += dA_dU * B + A_qp * dB_dU;
449 }
450
451 return J;
452}
453
454template <class G>
455Real
457{
458 // Multiple eigenstrains may depend on the same coupled var
459 RankTwoTensor total_deigen;
460 for (const auto deigen_darg : _deigenstrain_dargs[cvar])
461 total_deigen += (*deigen_darg)[_qp];
462
463 // No eigenstrain -> no temperature coupling. Short-circuit before dereferencing the
464 // d_sigma/d_eigenstrain property (only fetched when eigenstrains are coupled; see
465 // LagrangianStressDivergenceBase ctor).
466 if (total_deigen.L2norm() == 0.0)
467 return 0.0;
468
469 // Direct chain through the constitutive update. The stress material publishes
470 // d_sigma/d_eigenstrain (= -Jinv * small_jacobian for the objective-rate path,
471 // with the sign convention that an eigenstrain increase
472 // reduces the mechanical strain).
473 // We then wrap to PK1 the same way the residual does:
474 // dP/dT = det(F) * dsigma/dT * F^{-T} (large kinematics)
475 // dP/dT = dsigma/dT (small kinematics, P == sigma by convention)
476 const RankTwoTensor dsigma_dT = (*_dcauchy_stress_d_eigenstrain)[_qp] * total_deigen;
477 RankTwoTensor dP_dT;
478 if (_large_kinematics)
479 dP_dT = _F[_qp].det() * dsigma_dT * _F_inv[_qp].transpose();
480 else
481 dP_dT = dsigma_dT;
482 return dP_dT.doubleContraction(gradTest(_alpha)) * _temperature->phi()[_j][_qp];
483}
484
485template <class G>
486Real
488{
489 // d(R_disp_alpha)/d(strain_zz_j) at qp = gradTest_alpha : d(PK1)/d(strain_zz_j).
490 // strain_zz feeds `_F[(2,2)]` AFTER F-bar runs in `ComputeLagrangianWPSStrain`, so
491 // strain_zz perturbations bypass F-bar's chain. Use `_dpk1_bypass_fbar` (= the
492 // pk1_jacobian variant computed with the F-bar `_d_F_stab_d_F_ust` factor REPLACED
493 // by identity in the sigma chain) for a consistent Jacobian.
494 return _dpk1_bypass_fbar[_qp].contractionKl(2, 2, gradTest(_alpha)) *
495 _out_of_plane_strain->phi()[_j][_qp];
496}
497
void suppressParameter(const std::string &name)
Base class of the "Lagrangian" kernel system.
virtual void precalculateOffDiagJacobian(unsigned int jvar) override
T doubleContraction(const RankTwoTensorTempl< T > &a) const
RankTwoTensorTempl< T > transpose() const
static RankTwoTensorTempl Identity()
Enforce equilibrium with a total Lagrangian formulation.
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
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 &parameters)
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...
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)