www.mooseframework.org
SalehaniIrani3DCTraction.C
Go to the documentation of this file.
1 //* This file is part of the MOOSE framework
2 //* https://www.mooseframework.org
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 registerMooseObject("TensorMechanicsApp", SalehaniIrani3DCTraction);
13 
14 template <>
15 InputParameters
17 {
18  InputParameters params = validParams<CZMMaterialBase>();
19  params.addClassDescription("3D Coupled (3DC) cohesive law of Salehani and Irani with no damage");
20  params.addRequiredParam<Real>(
21  "normal_gap_at_maximum_normal_traction",
22  "The value of normal gap at which maximum normal traction is achieved");
23  params.addRequiredParam<Real>(
24  "tangential_gap_at_maximum_shear_traction",
25  "The value of tangential gap at which maximum shear traction is achieved");
26  params.addRequiredParam<Real>("maximum_normal_traction",
27  "The maximum normal traction the interface can sustain");
28  params.addRequiredParam<Real>("maximum_shear_traction",
29  "The maximum shear traction the interface can sustain");
30  return params;
31 }
32 
33 SalehaniIrani3DCTraction::SalehaniIrani3DCTraction(const InputParameters & parameters)
34  : CZMMaterialBase(parameters),
35  _delta_u0({getParam<Real>("normal_gap_at_maximum_normal_traction"),
36  std::sqrt(2) * getParam<Real>("tangential_gap_at_maximum_shear_traction"),
37  std::sqrt(2) * getParam<Real>("tangential_gap_at_maximum_shear_traction")}),
38  _max_allowable_traction({getParam<Real>("maximum_normal_traction"),
39  getParam<Real>("maximum_shear_traction"),
40  getParam<Real>("maximum_shear_traction")})
41 {
42 }
43 
44 RealVectorValue
46 {
47 
48  // The convention for ordering the traction is N, T, S, where N is the normal direction, and T and
49  // S are two arbitrary tangential directions.
50  RealVectorValue traction_local;
51 
52  // temporary containers for auxiliary calculations
53  Real aa, x, exp_x, a_i, b_i;
54  // index variable to avoid multiple redefinitions
55  unsigned int i;
56 
57  x = 0;
58  for (i = 0; i < 3; i++)
59  {
60  aa = _displacement_jump[_qp](i) / _delta_u0[i];
61  if (i > 0)
62  aa *= aa; // square for shear component
63 
64  x += aa;
65  }
66 
67  exp_x = std::exp(-x);
68 
69  for (i = 0; i < 3; i++)
70  {
71  if (i == 0)
72  aa = std::exp(1);
73  else
74  aa = std::sqrt(2 * std::exp(1));
75 
76  a_i = _max_allowable_traction[i] * aa;
77  b_i = _displacement_jump[_qp](i) / _delta_u0[i];
78  traction_local(i) = a_i * b_i * exp_x;
79  }
80 
81  return traction_local;
82 }
83 
86 {
87  RankTwoTensor traction_jump_derivatives_local;
88 
89  // this function computes the partial derivates of Tn[0][:], Tt[1][:], Ts[2][:]
90  // wrt dun, dut, dus
91  // T_i = a_i*b_i*exp(-x) with:
92  // a_i = \sigma_i,max * (\alpha_i*e)^{1/\alpha_i} with \alpha_i = 1 for i==n
93  // \alpha_i = 2 for i!=n
94  // b_i = \delta_u,i / \delta_0,i
95  // x = sum_i=1^3{(\delta_u,i / \delta_0,i)^\alpha_i} with \alpha_i = 1 for i==n
96  // \alpha_i = 2 for i!=n
97 
98  // dTi_duj = a_i * ( dBi_duj * exp(-x) + b_i * exp(-x) * dx_duj )
99  // = a_i * ( exp(-x) * (dBi_duj + b_i * dx_duj ) )
100 
101  // temporary containers for auxiliary calculations
102  Real aa, exp_x, x;
103  // index variables to avoid multiple redefinitions
104  unsigned int i, j;
105 
106  // compute x and the exponential term
107  aa = 0;
108  x = 0;
109  for (i = 0; i < 3; i++)
110  {
111  aa = _displacement_jump[_qp](i) / _delta_u0[i];
112  if (i > 0)
113  aa *= aa;
114  x += aa;
115  }
116  exp_x = std::exp(-x);
117 
118  // compute partial derivatives in local coordiante wrt the displacement jump
119  // | dTn/dun dTn/dut dTn/dus |
120  // dTi_duj = | dTt/dun dTt/dut dTt/dus | = _traction_derivative[i][j]
121  // | dTs/dun dTs/dut dTs/dus |
122  Real a_i, b_i;
123  Real dbi_dui, dx_duj;
124 
125  for (i = 0; i < 3; i++)
126  {
127  if (i == 0) // alpha = 1
128  a_i = std::exp(1);
129  else // alpha = 2
130  a_i = std::sqrt(2 * std::exp(1));
131 
132  a_i *= _max_allowable_traction[i];
133  b_i = _displacement_jump[_qp](i) / _delta_u0[i];
134 
135  for (j = 0; j < 3; j++)
136  {
137 
138  dbi_dui = 0;
139  if (i == j)
140  dbi_dui = 1 / _delta_u0[j];
141 
142  if (j == 0) // alpha = 1
143  dx_duj = 1. / _delta_u0[j];
144  else // alpha = 2
145  dx_duj = 2. * _displacement_jump[_qp](j) / (_delta_u0[j] * _delta_u0[j]);
146 
147  traction_jump_derivatives_local(i, j) =
148  a_i * exp_x * (dbi_dui - b_i * dx_duj); // the minus sign is due to exp(-x)
149  }
150  }
151 
152  return traction_jump_derivatives_local;
153 }
validParams< CZMMaterialBase >
InputParameters validParams< CZMMaterialBase >()
Definition: CZMMaterialBase.C:16
SalehaniIrani3DCTraction::_max_allowable_traction
const std::vector< Real > _max_allowable_traction
the vector representing the maximum allowed traction in each direction
Definition: SalehaniIrani3DCTraction.h:34
SalehaniIrani3DCTraction.h
validParams< SalehaniIrani3DCTraction >
InputParameters validParams< SalehaniIrani3DCTraction >()
Definition: SalehaniIrani3DCTraction.C:16
registerMooseObject
registerMooseObject("TensorMechanicsApp", SalehaniIrani3DCTraction)
SalehaniIrani3DCTraction
Implementation of the non-stateful exponential traction separation law proposed by Salehani,...
Definition: SalehaniIrani3DCTraction.h:20
SalehaniIrani3DCTraction::computeTractionDerivatives
virtual RankTwoTensor computeTractionDerivatives() override
method returning the traction derivitaves wrt local displacement jump.
Definition: SalehaniIrani3DCTraction.C:85
CZMMaterialBase::_displacement_jump
MaterialProperty< RealVectorValue > & _displacement_jump
Definition: CZMMaterialBase.h:58
CZMMaterialBase
This is the base Material class for implementing a traction separation material model.
Definition: CZMMaterialBase.h:29
SalehaniIrani3DCTraction::SalehaniIrani3DCTraction
SalehaniIrani3DCTraction(const InputParameters &parameters)
Definition: SalehaniIrani3DCTraction.C:33
SalehaniIrani3DCTraction::_delta_u0
const std::vector< Real > _delta_u0
the displacement jump associated to the maximum traction
Definition: SalehaniIrani3DCTraction.h:31
RankTwoTensorTempl< Real >
SalehaniIrani3DCTraction::computeTraction
virtual RealVectorValue computeTraction() override
method returning the traction in the interface coordinate system.
Definition: SalehaniIrani3DCTraction.C:45