https://mooseframework.inl.gov
Loading...
Searching...
No Matches
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
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
43void
49
50RealVectorValue
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 std::vector< double > x
registerMooseObject("SolidMechanicsApp", SalehaniIrani3DCTraction)
MaterialProperty< RankTwoTensor > & _dinterface_traction_djump
the traction's derivatives wrt the displacement jump in local coordinates
const MaterialProperty< RealVectorValue > & _interface_displacement_jump
The displacment jump in local coordaintes.
MaterialProperty< RealVectorValue > & _interface_traction
the value of the traction in local coordinates
Base class used to implement traction separetion laws for materials whose beahvior can be described u...
void addRequiredParam(const std::string &name, const std::string &doc_string)
void addClassDescription(const std::string &doc_string)
unsigned int _qp
Implementation of the non-stateful exponential traction separation law proposed by Salehani,...
SalehaniIrani3DCTraction(const InputParameters &parameters)
RankTwoTensor computeTractionDerivatives()
method computing the total traction derivatives w.r.t. the interface displacement jump
void computeInterfaceTractionAndDerivatives() override
Compute the local traction and derivatives. This method should fill the _interface_traction and _dint...
static InputParameters validParams()
const RealVectorValue _max_allowable_traction
the vector representing the maximum allowed traction in each direction
RealVectorValue computeTraction()
method computing the total traction
const RealVectorValue _delta_u0
the displacement jump associated to the maximum traction