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  // First call does not have maps available
236  const bool return_boolean = _dof_to_F.find(node) == _dof_to_F.end();
237  if (return_boolean)
238  return;
239 
240  const auto normalized_F = normalizeQuantity(_dof_to_F, node);
241  const auto normalized_F_neighbor = normalizeQuantity(_dof_to_F_neighbor, node);
242 
243  // This 'averaging' assumption below can probably be improved upon.
244  _dof_to_interface_F[node] = 0.5 * (normalized_F + normalized_F_neighbor);
245 
246  for (const auto i : make_range(3))
247  for (const auto j : make_range(3))
248  if (!std::isfinite(MetaPhysicL::raw_value(normalized_F(i, j))))
249  throw MooseException(
250  "The deformation gradient on the secondary surface is not finite in "
251  "PenaltySimpleCohesiveZoneModel. MOOSE needs to cut the time step size.");
252 
253  const auto dof_to_interface_F_node = libmesh_map_find(_dof_to_interface_F, node);
254 
255  const ADFactorizedRankTwoTensor C = dof_to_interface_F_node.transpose() * dof_to_interface_F_node;
256  const auto Uinv = MathUtils::sqrt(C).inverse().get();
257  _dof_to_interface_R[node] = dof_to_interface_F_node * Uinv;
258 
259  // Transform interface jump according to two rotation matrices
260  const auto global_interface_displacement = _dof_to_interface_displacement_jump[node];
262  (_dof_to_interface_R[node] * _dof_to_rotation_matrix[node]).transpose() *
263  global_interface_displacement;
264 }
265 
266 void
268 {
269  // First call does not have maps available
270  const bool return_boolean = _dof_to_weighted_gap.find(node) == _dof_to_weighted_gap.end();
271  if (return_boolean)
272  return;
273 
274  computeModeMixity(node);
278  computeDamage(node);
279 
280  // Split displacement jump into active and inactive parts
281  const auto interface_displacement_jump =
283 
284  const ADRealVectorValue delta_active(std::max(interface_displacement_jump(0), 0.0),
285  interface_displacement_jump(1),
286  interface_displacement_jump(2));
287  const ADRealVectorValue delta_inactive(std::min(interface_displacement_jump(0), 0.0), 0.0, 0.0);
288 
289  // This traction vector is local at this point.
290  _dof_to_czm_traction[node] =
291  -(1.0 - _dof_to_damage[node].first) * _penalty_stiffness_czm * delta_active -
292  _penalty_stiffness_czm * delta_inactive;
293 }
294 
295 void
297 {
298  // First call does not have maps available
299  const bool return_boolean = _dof_to_czm_traction.find(node) == _dof_to_czm_traction.end();
300  if (return_boolean)
301  return;
302 
303  const auto local_traction_vector = libmesh_map_find(_dof_to_czm_traction, node);
304  const auto rotation_matrix = libmesh_map_find(_dof_to_rotation_matrix, node);
305 
306  _dof_to_czm_traction[node] = rotation_matrix * local_traction_vector;
307 }
308 
309 void
311 {
312  const auto interface_displacement_jump =
314 
315  if (interface_displacement_jump(0) > _epsilon_tolerance)
316  {
317  const auto delta_s = std::sqrt(interface_displacement_jump(1) * interface_displacement_jump(1) +
318  interface_displacement_jump(2) * interface_displacement_jump(2) +
320 
321  _dof_to_mode_mixity_ratio[node] = delta_s / interface_displacement_jump(0);
322  }
323  else
324  _dof_to_mode_mixity_ratio[node] = 0;
325 }
326 
327 void
329 {
330  const auto interface_displacement_jump =
332 
333  const auto mixity_ratio = libmesh_map_find(_dof_to_mode_mixity_ratio, node);
334 
335  const auto delta_normal_knot =
337  const auto delta_shear_knot =
339 
340  _dof_to_delta_initial[node] = delta_shear_knot;
341 
342  if (interface_displacement_jump(0) > _epsilon_tolerance)
343  {
344  const auto delta_mixed = std::sqrt(delta_shear_knot * delta_shear_knot +
345  Utility::pow<2>(mixity_ratio * delta_normal_knot));
346 
347  _dof_to_delta_initial[node] = delta_normal_knot * delta_shear_knot *
348  std::sqrt(1.0 + mixity_ratio * mixity_ratio) / delta_mixed;
349  }
350 }
351 
352 void
354 {
355  const auto interface_displacement_jump =
357 
358  const auto mixity_ratio = libmesh_map_find(_dof_to_mode_mixity_ratio, node);
359 
360  const auto normalized_GI_c = normalizeQuantity(_dof_to_GI_c, node);
361  const auto normalized_GII_c = normalizeQuantity(_dof_to_GII_c, node);
362 
363  _dof_to_delta_final[node] =
364  std::sqrt(2.0) * 2.0 * normalized_GII_c / normalizeQuantity(_dof_to_shear_strength, node);
365 
366  if (interface_displacement_jump(0) > _epsilon_tolerance)
367  {
369  {
370  _dof_to_delta_final[node] =
371  2.0 / _penalty_stiffness_czm / libmesh_map_find(_dof_to_delta_initial, node) *
372  (normalized_GI_c +
373  (normalized_GII_c - normalized_GI_c) *
374  std::pow(mixity_ratio * mixity_ratio / (1 + mixity_ratio * mixity_ratio),
376  }
378  {
379  const auto Gc_mixed =
380  std::pow(1.0 / normalized_GI_c, _power_law_parameter) +
381  std::pow(mixity_ratio * mixity_ratio / normalized_GII_c, _power_law_parameter);
382  _dof_to_delta_final[node] = (2.0 + 2.0 * mixity_ratio * mixity_ratio) /
384  libmesh_map_find(_dof_to_delta_initial, node) *
385  std::pow(Gc_mixed, -1.0 / _power_law_parameter);
386  }
387  }
388 }
389 
390 void
392 {
393  const auto interface_displacement_jump =
395 
396  const auto delta_normal_pos =
397  MathUtils::regularizedHeavyside(interface_displacement_jump(0), _regularization_alpha) *
398  interface_displacement_jump(0);
399 
400  _dof_to_delta_max[node] = std::sqrt(Utility::pow<2>(interface_displacement_jump(1)) +
401  Utility::pow<2>(interface_displacement_jump(2)) +
402  Utility::pow<2>(delta_normal_pos) + _epsilon_tolerance);
403 }
404 
405 void
407 {
408  const auto delta_max = libmesh_map_find(_dof_to_delta_max, node);
409  const auto delta_initial = libmesh_map_find(_dof_to_delta_initial, node);
410  const auto delta_final = libmesh_map_find(_dof_to_delta_final, node);
411 
412  if (delta_max < delta_initial)
413  _dof_to_damage[node].first = 0;
414  else if (delta_max > delta_final)
415  _dof_to_damage[node].first = 1.0;
416  else
417  _dof_to_damage[node].first =
418  delta_final * (delta_max - delta_initial) / delta_max / (delta_final - delta_initial);
419 
420  if (_dof_to_damage[node].first < _dof_to_damage[node].second)
421  // Irreversibility
422  _dof_to_damage[node].first = _dof_to_damage[node].second;
423 
424  // Viscous regularization
425  _dof_to_damage[node].first =
426  (_dof_to_damage[node].first + _viscosity * _dof_to_damage[node].second / _dt) /
427  (_viscosity / _dt + 1.0);
428 }
429 
430 void
432 {
433  // Normal contact pressure with penalty
435 
436  for (const auto i : index_range(_czm_interpolated_traction))
437  {
439 
440  for (const auto qp : make_range(_qrule_msm->n_points()))
441  _czm_interpolated_traction[i][qp] = 0.0;
442  }
443 
444  // iterate over nodes
445  for (const auto i : make_range(_test->size()))
446  {
447  // current node
448  const Node * const node = _lower_secondary_elem->node_ptr(i);
449 
450  // End of CZM bilinear computations
451  if (_dof_to_czm_traction.find(node) == _dof_to_czm_traction.end())
452  return;
453 
454  const auto & test_i = (*_test)[i];
455  for (const auto qp : make_range(_qrule_msm->n_points()))
456  for (const auto idx : index_range(_czm_interpolated_traction))
457  _czm_interpolated_traction[idx][qp] += test_i[qp] * _dof_to_czm_traction[node](idx);
458  }
459 }
460 
461 void
463 {
465 
466  const bool send_data_back = !constrainedByOwner();
467 
469  _dof_to_F, _subproblem.mesh(), _nodal, _communicator, send_data_back);
470 
473 
476 
479 
481  _dof_to_GI_c, _subproblem.mesh(), _nodal, _communicator, send_data_back);
482 
484  _dof_to_GII_c, _subproblem.mesh(), _nodal, _communicator, send_data_back);
485 
488 }
489 
490 const ADVariableValue &
492 {
493  mooseAssert(i <= 3,
494  "Internal error in czmGlobalTraction. Index exceeds the traction vector size.");
495 
496  return _czm_interpolated_traction[i];
497 }
498 
499 Real
501 {
502  const auto it = _dof_to_mode_mixity_ratio.find(_subproblem.mesh().nodePtr(node->id()));
503 
504  if (it != _dof_to_mode_mixity_ratio.end())
505  return MetaPhysicL::raw_value(it->second);
506  else
507  return 0.0;
508 }
509 
510 Real
512 {
513  const auto it = _dof_to_damage.find(_subproblem.mesh().nodePtr(node->id()));
514 
515  if (it != _dof_to_damage.end())
516  return MetaPhysicL::raw_value(it->second.first);
517  else
518  return 0.0;
519 }
520 
521 Real
523 {
524  const auto it = _dof_to_interface_displacement_jump.find(_subproblem.mesh().nodePtr(node->id()));
525  const auto it2 = _dof_to_weighted_gap.find(_subproblem.mesh().nodePtr(node->id()));
526 
527  if (it != _dof_to_interface_displacement_jump.end() && it2 != _dof_to_weighted_gap.end())
528  return MetaPhysicL::raw_value(it->second(0) / it2->second.second);
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(1) / it2->second.second);
541  else
542  return 0.0;
543 }
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.
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.
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.
bool isParamValid(const std::string &name) const
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)
void paramError(const std::string &param, Args... args) const
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)
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
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.
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
T regularizedHeavyside(T x, Real smoothing_length)
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)
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)
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)