https://mooseframework.inl.gov
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 
12 template <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 
22 template <class G>
24  const InputParameters & parameters)
25  : LagrangianStressDivergenceBase(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 
34 template <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 
42 template <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 
53 template <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 
61 template <class G>
62 void
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()))
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 
94 template <class G>
95 void
97 {
98  LagrangianStressDivergenceBase::precalculateResidual();
99  if (_stabilize_strain && _F_bar_mode == FBarMode::Incremental)
100  {
101  computeAverageGradientSpatialTest();
102  cachePK1ContractionFUst();
103  }
104 }
105 
106 template <class G>
107 void
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 
116 template <class G>
117 void
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 
133 template <class G>
134 void
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 
153 template <class G>
154 void
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 
214 template <class G>
215 Real
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 
230 template <class G>
231 Real
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 
243 template <class G>
244 void
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 
271 template <class G>
272 void
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 
297 template <class G>
298 void
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 
368 template <class G>
369 Real
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 
396 template <class G>
397 Real
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 
454 template <class G>
455 Real
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 
485 template <class G>
486 Real
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 
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
Definition: NS.h:157
void computeAverageGradientSpatialTest()
Compute element-averaged spatial gradient of test functions for component _alpha, filling _avg_grad_s...
static RankTwoTensorTempl Identity()
void suppressParameter(const std::string &name)
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
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
Definition: NS.h:138
Enforce equilibrium with a total Lagrangian formulation.
OStreamProxy out
IntRange< T > make_range(T beg, T end)
auto elementAverage(const Functor &f, const MooseArray< Real > &JxW, const MooseArray< Real > &coord)
TotalLagrangianStressDivergenceBase(const InputParameters &parameters)
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 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
Definition: NS.h:134
Base class of the "Lagrangian" kernel system.