Loading [MathJax]/extensions/tex2jax.js
https://mooseframework.inl.gov
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends
SalehaniIrani3DCTraction.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 registerMooseObject("SolidMechanicsApp", SalehaniIrani3DCTraction);
13 
16 {
18  params.addClassDescription("3D Coupled (3DC) cohesive law of Salehani and Irani with no damage");
19  params.addRequiredParam<Real>(
20  "normal_gap_at_maximum_normal_traction",
21  "The value of normal gap at which maximum normal traction is achieved");
22  params.addRequiredParam<Real>(
23  "tangential_gap_at_maximum_shear_traction",
24  "The value of tangential gap at which maximum shear traction is achieved");
25  params.addRequiredParam<Real>("maximum_normal_traction",
26  "The maximum normal traction the interface can sustain");
27  params.addRequiredParam<Real>("maximum_shear_traction",
28  "The maximum shear traction the interface can sustain");
29  return params;
30 }
31 
34  _delta_u0({getParam<Real>("normal_gap_at_maximum_normal_traction"),
35  std::sqrt(2) * getParam<Real>("tangential_gap_at_maximum_shear_traction"),
36  std::sqrt(2) * getParam<Real>("tangential_gap_at_maximum_shear_traction")}),
37  _max_allowable_traction({getParam<Real>("maximum_normal_traction"),
38  getParam<Real>("maximum_shear_traction"),
39  getParam<Real>("maximum_shear_traction")})
40 {
41 }
42 
43 void
45 {
48 }
49 
52 {
53 
54  // The convention for ordering the traction is N, T, S, where N is the normal direction, and T and
55  // S are two arbitrary tangential directions.
56  RealVectorValue traction_local;
57 
58  // temporary containers for auxiliary calculations
59  Real aa, x, exp_x, a_i, b_i;
60  // index variable to avoid multiple redefinitions
61  unsigned int i;
62 
63  x = 0;
64  for (i = 0; i < 3; i++)
65  {
67  if (i > 0)
68  aa *= aa; // square for shear component
69 
70  x += aa;
71  }
72 
73  exp_x = std::exp(-x);
74 
75  for (i = 0; i < 3; i++)
76  {
77  if (i == 0)
78  aa = std::exp(1);
79  else
80  aa = std::sqrt(2 * std::exp(1));
81 
82  a_i = _max_allowable_traction(i) * aa;
84  traction_local(i) = a_i * b_i * exp_x;
85  }
86 
87  return traction_local;
88 }
89 
92 {
93  RankTwoTensor traction_jump_derivatives_local;
94 
95  // this function computes the partial derivates of Tn[0][:], Tt[1][:], Ts[2][:]
96  // wrt dun, dut, dus
97  // T_i = a_i*b_i*exp(-x) with:
98  // a_i = \sigma_i,max * (\alpha_i*e)^{1/\alpha_i} with \alpha_i = 1 for i==n
99  // \alpha_i = 2 for i!=n
100  // b_i = \delta_u,i / \delta_0,i
101  // x = sum_i=1^3{(\delta_u,i / \delta_0,i)^\alpha_i} with \alpha_i = 1 for i==n
102  // \alpha_i = 2 for i!=n
103 
104  // dTi_duj = a_i * ( dBi_duj * exp(-x) + b_i * exp(-x) * dx_duj )
105  // = a_i * ( exp(-x) * (dBi_duj + b_i * dx_duj ) )
106 
107  // temporary containers for auxiliary calculations
108  Real aa, exp_x, x;
109  // index variables to avoid multiple redefinitions
110  unsigned int i, j;
111 
112  // compute x and the exponential term
113  aa = 0;
114  x = 0;
115  for (i = 0; i < 3; i++)
116  {
118  if (i > 0)
119  aa *= aa;
120  x += aa;
121  }
122  exp_x = std::exp(-x);
123 
124  // compute partial derivatives in local coordiante wrt the displacement jump
125  // | dTn/dun dTn/dut dTn/dus |
126  // dTi_duj = | dTt/dun dTt/dut dTt/dus | = _traction_derivative[i][j]
127  // | dTs/dun dTs/dut dTs/dus |
128  Real a_i, b_i;
129  Real dbi_dui, dx_duj;
130 
131  for (i = 0; i < 3; i++)
132  {
133  if (i == 0) // alpha = 1
134  a_i = std::exp(1);
135  else // alpha = 2
136  a_i = std::sqrt(2 * std::exp(1));
137 
138  a_i *= _max_allowable_traction(i);
140 
141  for (j = 0; j < 3; j++)
142  {
143 
144  dbi_dui = 0;
145  if (i == j)
146  dbi_dui = 1 / _delta_u0(j);
147 
148  if (j == 0) // alpha = 1
149  dx_duj = 1. / _delta_u0(j);
150  else // alpha = 2
151  dx_duj = 2. * _interface_displacement_jump[_qp](j) / (_delta_u0(j) * _delta_u0(j));
152 
153  traction_jump_derivatives_local(i, j) =
154  a_i * exp_x * (dbi_dui - b_i * dx_duj); // the minus sign is due to exp(-x)
155  }
156  }
157 
158  return traction_jump_derivatives_local;
159 }
const RealVectorValue _delta_u0
the displacement jump associated to the maximum traction
RealVectorValue computeTraction()
method computing the total traction
void computeInterfaceTractionAndDerivatives() override
Compute the local traction and derivatives. This method should fill the _interface_traction and _dint...
MaterialProperty< RealVectorValue > & _interface_traction
the value of the traction in local coordinates
void addRequiredParam(const std::string &name, const std::string &doc_string)
SalehaniIrani3DCTraction(const InputParameters &parameters)
unsigned int _qp
registerMooseObject("SolidMechanicsApp", SalehaniIrani3DCTraction)
const std::vector< double > x
Base class used to implement traction separetion laws for materials whose beahvior can be described u...
RankTwoTensor computeTractionDerivatives()
method computing the total traction derivatives w.r.t. the interface displacement jump ...
Implementation of the non-stateful exponential traction separation law proposed by Salehani...
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
void addClassDescription(const std::string &doc_string)
static const std::complex< double > j(0, 1)
Complex number "j" (also known as "i")
const RealVectorValue _max_allowable_traction
the vector representing the maximum allowed traction in each direction
const MaterialProperty< RealVectorValue > & _interface_displacement_jump
The displacment jump in local coordaintes.
MaterialProperty< RankTwoTensor > & _dinterface_traction_djump
the traction&#39;s derivatives wrt the displacement jump in local coordinates
static InputParameters validParams()