https://mooseframework.inl.gov
BilinearMixedModeCohesiveZoneModel.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 #include "MooseVariableFE.h"
12 #include "SystemBase.h"
13 #include "MortarUtils.h"
14 #include "MooseUtils.h"
15 #include "MathUtils.h"
16 
17 #include "MortarContactUtils.h"
19 
20 #include "ADReal.h"
21 #include "CohesiveZoneModelTools.h"
22 #include <Eigen/Core>
23 
25 
28 {
30 
31  params.addClassDescription("Computes the bilinear mixed mode cohesive zone model.");
32  params.addRequiredCoupledVar("displacements",
33  "The string of displacements suitable for the problem statement");
34 
35  // Input parameters for bilinear mixed mode traction.
36  params.addParam<MaterialPropertyName>("GI_c",
37  "Critical energy release rate in normal direction.");
38  params.addParam<MaterialPropertyName>("GII_c",
39  "Critical energy release rate in shear direction.");
40  params.addParam<MaterialPropertyName>("normal_strength", "Tensile strength in normal direction.");
41  params.addParam<MaterialPropertyName>("shear_strength", "Tensile strength in shear direction.");
42  params.addParam<Real>("power_law_parameter", "The power law parameter.");
43  MooseEnum criterion("POWER_LAW BK", "BK");
44  params.addParam<Real>("viscosity", 0.0, "Viscosity for damage model.");
45  params.addParam<MooseEnum>(
46  "mixed_mode_criterion", criterion, "Option for mixed mode propagation criterion.");
47  params.addParam<bool>(
48  "lag_displacement_jump",
49  false,
50  "Whether to use old displacement jumps to compute the effective displacement jump.");
51  params.addParam<Real>(
52  "regularization_alpha", 1e-10, "Regularization parameter for the Macaulay bracket.");
53  params.addRangeCheckedParam<Real>(
54  "penalty_stiffness", "penalty_stiffness > 0.0", "Penalty stiffness for CZM.");
55  params.addParamNamesToGroup(
56  "GI_c GII_c normal_strength shear_strength power_law_parameter viscosity "
57  "mixed_mode_criterion lag_displacement_jump regularization_alpha "
58  "penalty_stiffness",
59  "Bilinear mixed mode traction");
60  // End of input parameters for bilinear mixed mode traction.
61 
62  // Suppress augmented Lagrange parameters. AL implementation for CZM remains to be done.
63  params.suppressParameter<Real>("max_penalty_multiplier");
64  params.suppressParameter<Real>("penalty_multiplier");
65  params.suppressParameter<Real>("penetration_tolerance");
66  return params;
67 }
68 
70  const InputParameters & parameters)
71  : WeightedGapUserObject(parameters),
72  PenaltyWeightedGapUserObject(parameters),
73  WeightedVelocitiesUserObject(parameters),
75  _ndisp(coupledComponents("displacements")),
76  _normal_strength(getMaterialProperty<Real>("normal_strength")),
77  _shear_strength(getMaterialProperty<Real>("shear_strength")),
78  _GI_c(getMaterialProperty<Real>("GI_c")),
79  _GII_c(getMaterialProperty<Real>("GII_c")),
80  _penalty_stiffness_czm(getParam<Real>("penalty_stiffness")),
81  _mix_mode_criterion(getParam<MooseEnum>("mixed_mode_criterion").getEnum<MixedModeCriterion>()),
82  _power_law_parameter(getParam<Real>("power_law_parameter")),
83  _viscosity(getParam<Real>("viscosity")),
84  _regularization_alpha(getParam<Real>("regularization_alpha"))
85 {
87 
88  for (unsigned int i = 0; i < _ndisp; ++i)
89  {
90  _grad_disp.push_back(&adCoupledGradient("displacements", i));
91  _grad_disp_neighbor.push_back(&adCoupledGradient("displacements", i));
92  }
93 
94  // Set non-intervening components to zero
95  for (unsigned int i = _ndisp; i < 3; i++)
96  {
97  _grad_disp.push_back(&_ad_grad_zero);
99  }
100 
101  // Checks for bilinear traction input.
102  if (!isParamValid("GI_c") || !isParamValid("GII_c") || !isParamValid("normal_strength") ||
103  !isParamValid("shear_strength") || !isParamValid("power_law_parameter") ||
104  !isParamValid("penalty_stiffness"))
105  paramError("GI_c",
106  "The CZM bilinear mixed mode traction parameters GI_c, GII_c, normal_strength, "
107  "shear_strength, and power_law_parameter are required. Revise your input and add "
108  "those parameters if you want to use the bilinear mixed mode traction model. ");
109 }
110 
111 void
113 {
115 
116  // Called after computeQpProperties() within the same algorithmic step.
117 
118  // Compute F and R.
119  const auto F = (ADRankTwoTensor::Identity() +
121  (*_grad_disp[0])[_qp], (*_grad_disp[1])[_qp], (*_grad_disp[2])[_qp]));
122  const auto F_neighbor = (ADRankTwoTensor::Identity() +
124  (*_grad_disp_neighbor[1])[_qp],
125  (*_grad_disp_neighbor[2])[_qp]));
126 
127  // TODO in follow-on PRs: Trim interior node variable derivatives
129  _F_neighbor_interpolation = F_neighbor * (_JxW_msm[_qp] * _coord[_qp]);
134 }
135 
136 void
138 {
140 
141  // Get the _dof_to_weighted_gap map
142  const auto * const dof = static_cast<const DofObject *>(_lower_secondary_elem->node_ptr(_i));
143 
144  // TODO: Probably better to interpolate the deformation gradients.
145  _dof_to_F[dof] += (*_test)[_i][_qp] * _F_interpolation;
146  _dof_to_F_neighbor[dof] += (*_test)[_i][_qp] * _F_neighbor_interpolation;
149 
150  _dof_to_GI_c[dof] += (*_test)[_i][_qp] * _GI_c_interpolation;
151  _dof_to_GII_c[dof] += (*_test)[_i][_qp] * _GII_c_interpolation;
152 }
153 
154 template <class T>
155 T
157  const std::unordered_map<const DofObject *, T> & map, const Node * const node)
158 {
159  return libmesh_map_find(map, node) / _dof_to_weighted_gap[node].second;
160 }
161 
162 void
164 {
165  // instead we call it explicitly here
167 
168  // save off tangential traction from the last timestep
169  for (auto & map_pr : _dof_to_damage)
170  {
171  auto & [damage, old_damage] = map_pr.second;
172  old_damage = {MetaPhysicL::raw_value(damage)};
173  damage = {0.0};
174  }
175 
176  for (auto & [dof_object, delta_tangential_lm] : _dof_to_frictional_lagrange_multipliers)
177  delta_tangential_lm.setZero();
178 }
179 
180 void
182 {
183  // instead we call it explicitly here
185 
186  // Avoid accumulating interpolation over the time step
187  _dof_to_F.clear();
188  _dof_to_F_neighbor.clear();
190  _dof_to_normal_strength.clear();
191  _dof_to_shear_strength.clear();
192  _dof_to_GI_c.clear();
193  _dof_to_GII_c.clear();
194  _dof_to_delta_initial.clear();
195  _dof_to_delta_final.clear();
196  _dof_to_delta_max.clear();
197  _dof_to_czm_traction.clear();
200  _dof_to_interface_F.clear();
201  _dof_to_interface_R.clear();
202 
203  for (auto & map_pr : _dof_to_rotation_matrix)
204  map_pr.second.setToIdentity();
205 }
206 
207 void
209 {
210  // Compute rotation matrix from secondary surface
211  // Rotation matrices and local interface displacement jump.
212  for (const auto i : make_range(_test->size()))
213  {
214  const Node * const node = _lower_secondary_elem->node_ptr(i);
215 
216  // First call does not have maps available
217  const bool return_boolean = _dof_to_weighted_gap.find(node) == _dof_to_weighted_gap.end();
218  if (return_boolean)
219  return;
220 
221  _dof_to_rotation_matrix[node] = CohesiveZoneModelTools::computeReferenceRotation<true>(
223 
224  // Every time we used quantities from a map we "denormalize" it from the mortar integral.
225  // See normalizing member functions.
228  (libmesh_map_find(_dof_to_weighted_displacements, node));
229  }
230 }
231 
232 void
234 {
235  using std::isfinite;
236 
237  // First call does not have maps available
238  const bool return_boolean = _dof_to_F.find(node) == _dof_to_F.end();
239  if (return_boolean)
240  return;
241 
242  const auto normalized_F = normalizeQuantity(_dof_to_F, node);
243  const auto normalized_F_neighbor = normalizeQuantity(_dof_to_F_neighbor, node);
244 
245  // This 'averaging' assumption below can probably be improved upon.
246  _dof_to_interface_F[node] = 0.5 * (normalized_F + normalized_F_neighbor);
247 
248  for (const auto i : make_range(3))
249  for (const auto j : make_range(3))
250  if (!isfinite(MetaPhysicL::raw_value(normalized_F(i, j))))
251  throw MooseException(
252  "The deformation gradient on the secondary surface is not finite in "
253  "PenaltySimpleCohesiveZoneModel. MOOSE needs to cut the time step size.");
254 
255  const auto dof_to_interface_F_node = libmesh_map_find(_dof_to_interface_F, node);
256 
257  const ADFactorizedRankTwoTensor C = dof_to_interface_F_node.transpose() * dof_to_interface_F_node;
258  const auto Uinv = MathUtils::sqrt(C).inverse().get();
259  _dof_to_interface_R[node] = dof_to_interface_F_node * Uinv;
260 
261  // Transform interface jump according to two rotation matrices
262  const auto global_interface_displacement = _dof_to_interface_displacement_jump[node];
264  (_dof_to_interface_R[node] * _dof_to_rotation_matrix[node]).transpose() *
265  global_interface_displacement;
266 }
267 
268 void
270 {
271  using std::max, std::min;
272 
273  // First call does not have maps available
274  const bool return_boolean = _dof_to_weighted_gap.find(node) == _dof_to_weighted_gap.end();
275  if (return_boolean)
276  return;
277 
278  computeModeMixity(node);
282  computeDamage(node);
283 
284  // Split displacement jump into active and inactive parts
285  const auto interface_displacement_jump =
287 
288  const ADRealVectorValue delta_active(max(interface_displacement_jump(0), 0.0),
289  interface_displacement_jump(1),
290  interface_displacement_jump(2));
291  const ADRealVectorValue delta_inactive(min(interface_displacement_jump(0), 0.0), 0.0, 0.0);
292 
293  // This traction vector is local at this point.
294  _dof_to_czm_traction[node] =
295  -(1.0 - _dof_to_damage[node].first) * _penalty_stiffness_czm * delta_active -
296  _penalty_stiffness_czm * delta_inactive;
297 }
298 
299 void
301 {
302  // First call does not have maps available
303  const bool return_boolean = _dof_to_czm_traction.find(node) == _dof_to_czm_traction.end();
304  if (return_boolean)
305  return;
306 
307  const auto local_traction_vector = libmesh_map_find(_dof_to_czm_traction, node);
308  const auto rotation_matrix = libmesh_map_find(_dof_to_rotation_matrix, node);
309 
310  _dof_to_czm_traction[node] = rotation_matrix * local_traction_vector;
311 }
312 
313 void
315 {
316  using std::sqrt;
317 
318  const auto interface_displacement_jump =
320 
321  if (interface_displacement_jump(0) > _epsilon_tolerance)
322  {
323  const auto delta_s =
324  sqrt(interface_displacement_jump(1) * interface_displacement_jump(1) +
325  interface_displacement_jump(2) * interface_displacement_jump(2) + _epsilon_tolerance);
326 
327  _dof_to_mode_mixity_ratio[node] = delta_s / interface_displacement_jump(0);
328  }
329  else
330  _dof_to_mode_mixity_ratio[node] = 0;
331 }
332 
333 void
335 {
336  using std::sqrt;
337 
338  const auto interface_displacement_jump =
340 
341  const auto mixity_ratio = libmesh_map_find(_dof_to_mode_mixity_ratio, node);
342 
343  const auto delta_normal_knot =
345  const auto delta_shear_knot =
347 
348  _dof_to_delta_initial[node] = delta_shear_knot;
349 
350  if (interface_displacement_jump(0) > _epsilon_tolerance)
351  {
352  const auto delta_mixed = sqrt(delta_shear_knot * delta_shear_knot +
353  Utility::pow<2>(mixity_ratio * delta_normal_knot));
354 
355  _dof_to_delta_initial[node] = delta_normal_knot * delta_shear_knot *
356  sqrt(1.0 + mixity_ratio * mixity_ratio) / delta_mixed;
357  }
358 }
359 
360 void
362 {
363  using std::sqrt, std::pow;
364 
365  const auto interface_displacement_jump =
367 
368  const auto mixity_ratio = libmesh_map_find(_dof_to_mode_mixity_ratio, node);
369 
370  const auto normalized_GI_c = normalizeQuantity(_dof_to_GI_c, node);
371  const auto normalized_GII_c = normalizeQuantity(_dof_to_GII_c, node);
372 
373  _dof_to_delta_final[node] =
374  sqrt(2.0) * 2.0 * normalized_GII_c / normalizeQuantity(_dof_to_shear_strength, node);
375 
376  if (interface_displacement_jump(0) > _epsilon_tolerance)
377  {
379  {
380  _dof_to_delta_final[node] =
381  2.0 / _penalty_stiffness_czm / libmesh_map_find(_dof_to_delta_initial, node) *
382  (normalized_GI_c +
383  (normalized_GII_c - normalized_GI_c) *
384  pow(mixity_ratio * mixity_ratio / (1 + mixity_ratio * mixity_ratio),
386  }
388  {
389  const auto Gc_mixed =
390  pow(1.0 / normalized_GI_c, _power_law_parameter) +
391  pow(mixity_ratio * mixity_ratio / normalized_GII_c, _power_law_parameter);
392  _dof_to_delta_final[node] = (2.0 + 2.0 * mixity_ratio * mixity_ratio) /
394  libmesh_map_find(_dof_to_delta_initial, node) *
395  pow(Gc_mixed, -1.0 / _power_law_parameter);
396  }
397  }
398 }
399 
400 void
402 {
403  using std::sqrt;
404 
405  const auto interface_displacement_jump =
407 
408  const auto delta_normal_pos =
409  MathUtils::regularizedHeavyside(interface_displacement_jump(0), _regularization_alpha) *
410  interface_displacement_jump(0);
411 
412  _dof_to_delta_max[node] = sqrt(Utility::pow<2>(interface_displacement_jump(1)) +
413  Utility::pow<2>(interface_displacement_jump(2)) +
414  Utility::pow<2>(delta_normal_pos) + _epsilon_tolerance);
415 }
416 
417 void
419 {
420  const auto delta_max = libmesh_map_find(_dof_to_delta_max, node);
421  const auto delta_initial = libmesh_map_find(_dof_to_delta_initial, node);
422  const auto delta_final = libmesh_map_find(_dof_to_delta_final, node);
423 
424  if (delta_max < delta_initial)
425  _dof_to_damage[node].first = 0;
426  else if (delta_max > delta_final)
427  _dof_to_damage[node].first = 1.0;
428  else
429  _dof_to_damage[node].first =
430  delta_final * (delta_max - delta_initial) / delta_max / (delta_final - delta_initial);
431 
432  if (_dof_to_damage[node].first < _dof_to_damage[node].second)
433  // Irreversibility
434  _dof_to_damage[node].first = _dof_to_damage[node].second;
435 
436  // Viscous regularization
437  _dof_to_damage[node].first =
438  (_dof_to_damage[node].first + _viscosity * _dof_to_damage[node].second / _dt) /
439  (_viscosity / _dt + 1.0);
440 }
441 
442 void
444 {
445  // Normal contact pressure with penalty
447 
448  for (const auto i : index_range(_czm_interpolated_traction))
449  {
451 
452  for (const auto qp : make_range(_qrule_msm->n_points()))
453  _czm_interpolated_traction[i][qp] = 0.0;
454  }
455 
456  // iterate over nodes
457  for (const auto i : make_range(_test->size()))
458  {
459  // current node
460  const Node * const node = _lower_secondary_elem->node_ptr(i);
461 
462  // End of CZM bilinear computations
463  if (_dof_to_czm_traction.find(node) == _dof_to_czm_traction.end())
464  return;
465 
466  const auto & test_i = (*_test)[i];
467  for (const auto qp : make_range(_qrule_msm->n_points()))
468  for (const auto idx : index_range(_czm_interpolated_traction))
469  _czm_interpolated_traction[idx][qp] += test_i[qp] * _dof_to_czm_traction[node](idx);
470  }
471 }
472 
473 void
475 {
477 
478  const bool send_data_back = !constrainedByOwner();
479 
481  _dof_to_F, _subproblem.mesh(), _nodal, _communicator, send_data_back);
482 
485 
488 
491 
493  _dof_to_GI_c, _subproblem.mesh(), _nodal, _communicator, send_data_back);
494 
496  _dof_to_GII_c, _subproblem.mesh(), _nodal, _communicator, send_data_back);
497 
500 }
501 
502 const ADVariableValue &
504 {
505  mooseAssert(i <= 3,
506  "Internal error in czmGlobalTraction. Index exceeds the traction vector size.");
507 
508  return _czm_interpolated_traction[i];
509 }
510 
511 Real
513 {
514  const auto it = _dof_to_mode_mixity_ratio.find(_subproblem.mesh().nodePtr(node->id()));
515 
516  if (it != _dof_to_mode_mixity_ratio.end())
517  return MetaPhysicL::raw_value(it->second);
518  else
519  return 0.0;
520 }
521 
522 Real
524 {
525  const auto it = _dof_to_damage.find(_subproblem.mesh().nodePtr(node->id()));
526 
527  if (it != _dof_to_damage.end())
528  return MetaPhysicL::raw_value(it->second.first);
529  else
530  return 0.0;
531 }
532 
533 Real
535 {
536  const auto it = _dof_to_interface_displacement_jump.find(_subproblem.mesh().nodePtr(node->id()));
537  const auto it2 = _dof_to_weighted_gap.find(_subproblem.mesh().nodePtr(node->id()));
538 
539  if (it != _dof_to_interface_displacement_jump.end() && it2 != _dof_to_weighted_gap.end())
540  return MetaPhysicL::raw_value(it->second(0) / it2->second.second);
541  else
542  return 0.0;
543 }
544 
545 Real
547 {
548  const auto it = _dof_to_interface_displacement_jump.find(_subproblem.mesh().nodePtr(node->id()));
549  const auto it2 = _dof_to_weighted_gap.find(_subproblem.mesh().nodePtr(node->id()));
550 
551  if (it != _dof_to_interface_displacement_jump.end() && it2 != _dof_to_weighted_gap.end())
552  return MetaPhysicL::raw_value(it->second(1) / it2->second.second);
553  else
554  return 0.0;
555 }
std::unordered_map< const DofObject *, ADRealVectorValue > _dof_to_interface_displacement_jump
Map from degree of freedom to local displacement jump.
virtual MooseMesh & mesh()=0
std::unordered_map< const DofObject *, ADReal > _dof_to_normal_strength
ADReal _normal_strength_interpolation
Interpolated value of normal_strength.
Real getModeMixityRatio(const Node *const node) const
unsigned int _qp
Quadrature point index for the mortar segments.
void paramError(const std::string &param, Args... args) const
std::unordered_map< const DofObject *, ADRankTwoTensor > _dof_to_interface_F
Map from degree of freedom to interface deformation gradient tensor.
std::unordered_map< const DofObject *, ADRankTwoTensor > _dof_to_rotation_matrix
*** Kinematics/displacement jump quantities *** Map from degree of freedom to rotation matrix ...
void addParam(const std::string &name, const std::initializer_list< typename T::value_type > &value, const std::string &doc_string)
virtual void computeFandR(const Node *const node) override
const MooseArray< ADRealVectorValue > & _ad_grad_zero
std::unordered_map< const DofObject *, TwoVector > _dof_to_frictional_lagrange_multipliers
Map from degree of freedom to augmented lagrange multiplier.
const MaterialProperty< Real > & _GI_c
Fracture parameter mode I.
const Real _regularization_alpha
Parameter for the regularization of the Macaulay bracket.
const ADVariableGradient & adCoupledGradient(const std::string &var_name, unsigned int comp=0) const
const Real & _dt
Current delta t... or timestep size.
std::vector< const GenericVariableGradient< true > * > _grad_disp
Coupled displacement gradients.
void communicateRealObject(std::unordered_map< const DofObject *, T > &dof_to_adreal, const MooseMesh &mesh, const bool nodal, const Parallel::Communicator &communicator, const bool send_data_back)
const unsigned int _ndisp
Number of displacement components.
auto raw_value(const Eigen::Map< T > &in)
std::unordered_map< const DofObject *, ADRealVectorValue > _dof_to_weighted_displacements
A map from node to weighted displacements.
virtual const ADVariableValue & czmGlobalTraction(unsigned int i) const
std::unordered_map< const DofObject *, ADReal > _dof_to_delta_initial
registerMooseObject("ContactApp", BilinearMixedModeCohesiveZoneModel)
User object for computing weighted gaps and contact pressure for penalty based mortar constraints...
const bool _nodal
Whether the dof objects are nodal; if they&#39;re not, then they&#39;re elemental.
const std::vector< Real > & _JxW_msm
std::unordered_map< const DofObject *, ADRankTwoTensor > _dof_to_interface_R
Map from degree of freedom to interface rotation tensor.
const Parallel::Communicator & _communicator
virtual void computeBilinearMixedModeTraction(const Node *const node) override
Encapsulate the CZM constitutive behavior.
Creates dof object to weighted tangential velocities map.
const MaterialProperty< Real > & _GII_c
Fracture parameter mode II.
Real getCohesiveDamage(const Node *const node) const
const Real _viscosity
Viscosity for damage model.
ADReal _shear_strength_interpolation
Interpolated value of shear_strength.
static RankTwoTensorTempl Identity()
std::unordered_map< const DofObject *, std::pair< ADReal, Real > > _dof_to_damage
std::unordered_map< const DofObject *, ADReal > _dof_to_delta_max
const libMesh::QBase *const & _qrule_msm
static const std::string F
Definition: NS.h:165
std::unordered_map< const DofObject *, ADReal > _dof_to_GII_c
const Real _epsilon_tolerance
Tolerance to avoid NaN/Inf in automatic differentiation operations.
auto max(const L &left, const R &right)
void suppressParameter(const std::string &name)
SubProblem & _subproblem
virtual void computeQpIProperties() override
Computes properties that are functions both of _qp and _i, for example the weighted gap...
MixedModeCriterion
Mixed-mode propagation criterion.
virtual void computeQpProperties() override
Computes properties that are functions only of the current quadrature point (_qp), e.g.
static RankTwoTensorTempl initializeFromRows(const libMesh::TypeVector< ADReal > &row0, const libMesh::TypeVector< ADReal > &row1, const libMesh::TypeVector< ADReal > &row2)
Real getLocalDisplacementTangential(const Node *const node) const
Elem const *const & _lower_secondary_elem
virtual void computeGlobalTraction(const Node *const node) override
Compute global traction for mortar application.
std::unordered_map< const DofObject *, ADRealVectorValue > _dof_to_czm_traction
Total Lagrangian stress to be applied on CZM interface.
ADRankTwoTensor _F_interpolation
Deformation gradient for interpolation.
const MaterialProperty< Real > & _shear_strength
The shear strength material property.
std::vector< ADVariableValue > _czm_interpolated_traction
The global traction.
const MaterialProperty< Real > & _normal_strength
The normal strength material property.
virtual unsigned int dimension() const
std::unordered_map< const DofObject *, ADRankTwoTensor > _dof_to_F_neighbor
Map from degree of freedom to neighbor, interpolated deformation gradient tensor. ...
std::vector< Point > _normals
ADRankTwoTensor _F_neighbor_interpolation
Deformation gradient for interpolation of the neighbor projection.
const VariableTestValue * _test
A pointer to the test function associated with the weighted gap.
virtual const Node * nodePtr(const dof_id_type i) const
std::unordered_map< const DofObject *, ADReal > _dof_to_delta_final
std::unordered_map< const DofObject *, ADRankTwoTensor > _dof_to_F
Map from degree of freedom to secondary, interpolated deformation gradient tensor.
unsigned int n_points() const
virtual void computeQpProperties() override
Computes properties that are functions only of the current quadrature point (_qp), e.g.
virtual void computeModeMixity(const Node *const node)
T normalizeQuantity(const std::unordered_map< const DofObject *, T > &map, const Node *const node)
Normalize mortar quantities (remove mortar integral scaling)
std::unordered_map< const DofObject *, ADReal > _dof_to_czm_normal_traction
Map from degree of freedom to czm normal traction.
void addRequiredCoupledVar(const std::string &name, const std::string &doc_string)
BilinearMixedModeCohesiveZoneModel(const InputParameters &parameters)
ExpressionBuilder::EBTerm pow(const ExpressionBuilder::EBTerm &left, T exponent)
std::unordered_map< const DofObject *, ADReal > _dof_to_shear_strength
virtual void computeDamage(const Node *const node)
const MooseArray< Real > & _coord
Member for handling change of coordinate systems (xyz, rz, spherical)
ADReal _GI_c_interpolation
Interpolated value of fracture paramter mode I.
virtual void computeCriticalDisplacementJump(const Node *const node)
Creates dof object to weighted gap map.
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
CTSub CT_OPERATOR_BINARY CTMul CTCompareLess CTCompareGreater CTCompareEqual _arg template * sqrt(_arg)) *_arg.template D< dtag >()) CT_SIMPLE_UNARY_FUNCTION(tanh
std::unordered_map< const DofObject *, ADReal > _dof_to_GI_c
void communicateR2T(std::unordered_map< const DofObject *, ADRankTwoTensor > &dof_map_adr2t, const MooseMesh &mesh, const bool nodal, const Parallel::Communicator &communicator, const bool send_data_back)
This function is used to communicate velocities across processes.
IntRange< T > make_range(T beg, T end)
std::vector< const GenericVariableGradient< true > * > _grad_disp_neighbor
Coupled displacement and neighbor displacement gradient.
T regularizedHeavyside(const T &x, Real smoothing_length)
User object that interface pressure resulting from a simple traction separation law.
unsigned int _i
Test function index.
void addClassDescription(const std::string &doc_string)
enum BilinearMixedModeCohesiveZoneModel::MixedModeCriterion _mix_mode_criterion
static const std::complex< double > j(0, 1)
Complex number "j" (also known as "i")
User object that interface pressure resulting from a simple traction separation law.
void addRangeCheckedParam(const std::string &name, const T &value, const std::string &parsed_function, const std::string &doc_string)
bool isParamValid(const std::string &name) const
virtual void computeFinalDisplacementJump(const Node *const node)
const Real _power_law_parameter
Power law parameter for bilinear traction model.
Real getLocalDisplacementNormal(const Node *const node) const
virtual void computeEffectiveDisplacementJump(const Node *const node)
virtual void computeQpIProperties() override
Computes properties that are functions both of _qp and _i, for example the weighted gap...
std::unordered_map< const DofObject *, std::pair< ADReal, Real > > _dof_to_weighted_gap
A map from node to weighted gap and normalization (if requested)
auto min(const L &left, const R &right)
MooseUnits pow(const MooseUnits &, int)
ADReal _GII_c_interpolation
Interpolated value of fracture paramter mode II.
auto index_range(const T &sizable)
static const std::string C
Definition: NS.h:168
std::unordered_map< const DofObject *, ADReal > _dof_to_mode_mixity_ratio
Map from degree of freedom to mode mixity ratio (AD needed?)
unsigned int idx(const ElemType type, const unsigned int nx, const unsigned int i, const unsigned int j)
void addParamNamesToGroup(const std::string &space_delim_names, const std::string group_name)