v0.16.0
Loading...
Searching...
No Matches
Static Public Member Functions | Static Public Attributes | List of all members
EshelbianPlasticity::GriffithCohesiveLaw Struct Reference
Collaboration diagram for EshelbianPlasticity::GriffithCohesiveLaw:
[legend]

Static Public Member Functions

template<typename T >
static T getTau (const T &k, double gc)
 
template<typename T >
static auto getDiffTau (const T &tau, const T &kappa, double gc)
 
template<typename T >
static T getAlpha (const T &kappa, double gc, double min_stiffness)
 
template<typename T >
static T getDiffAlpha (const T &kappa, double gc, double min_stiffness)
 
template<typename T >
static auto invTau (const T &tau, double Gf)
 
static double getInitialStrength (double kappa, double gc)
 
static double invInitialStrength (double strength, double gc)
 
template<typename T >
static auto calculateY (const T t_eff, const T &kappa, double gc, double min_stiffness)
 
template<typename T >
static auto calculateDissipation (const T &delta_kappa, const T t_eff, const T &kappa, double gc, double min_stiffness)
 
template<typename T >
static auto calculateDissipationSurplus (const T &delta_kappa, const T t_eff, const T &kappa, double gc, double min_stiffness)
 
template<typename T >
static auto calculateDissipationSurplusDiffKappa (const T &delta_kappa, const T &t_eff, const T &kappa, double gc, double min_stiffness)
 
template<typename T >
static auto calculateDissipationSurplusDiffTraction (const FTensor::Tensor1< T, 3 > &t_traction, const T &delta_kappa, const T &kappa, FTensor::Tensor1< double, 3 > &t_n_normalize, double gc, double beta, double min_stiffness)
 
template<typename T >
static auto calculateGap (const FTensor::Tensor1< T, 3 > &t_traction, FTensor::Tensor1< double, 3 > &t_n_normalize, double alpha, double beta, bool sign_sensitive=true)
 
template<typename T >
static auto calculateDiffGapDTraction (const FTensor::Tensor1< T, 3 > &t_traction, FTensor::Tensor1< double, 3 > &t_n_normalize, double alpha, double beta, bool sign_sensitive=true)
 
template<typename T >
static auto calculateEffectiveTraction (const FTensor::Tensor1< T, 3 > &t_traction, FTensor::Tensor1< double, 3 > &t_n_normalize, double beta)
 

Static Public Attributes

static constexpr double eps = 1e-8
 
static constexpr double pi = boost::math::constants::pi<double>()
 
static constexpr double root_pi
 

Detailed Description

Definition at line 26 of file EshelbianCohesive.cpp.

Member Function Documentation

◆ calculateDiffGapDTraction()

template<typename T >
static auto EshelbianPlasticity::GriffithCohesiveLaw::calculateDiffGapDTraction ( const FTensor::Tensor1< T, 3 > &  t_traction,
FTensor::Tensor1< double, 3 > &  t_n_normalize,
double  alpha,
double  beta,
bool  sign_sensitive = true 
)
inlinestatic

Definition at line 204 of file EshelbianCohesive.cpp.

207 {
208 FTENSOR_INDEX(3, i);
210 FTensor::Tensor1<std::complex<T>, 3> t_cpx_delta;
211 FTensor::Tensor1<std::complex<T>, 3> t_cpx_traction;
212 for (auto jj = 0; jj != 3; ++jj) {
213 t_cpx_traction(i) = t_traction(i);
214 t_cpx_traction(jj) += eps * 1i;
215 auto [teff_cpx, t_cpx_gap] = calculateGap(t_cpx_traction, t_n_normalize,
216 alpha, beta, sign_sensitive);
217 for (auto ii = 0; ii != 3; ++ii) {
218 auto v = t_cpx_gap(ii).imag();
219 t_dgap(ii, jj) = v / eps;
220 }
221 }
222 return t_dgap;
223 }
#define FTENSOR_INDEX(DIM, I)
FTensor::Index< 'i', SPACE_DIM > i
const double v
phase velocity of light in medium (cm/ns)
static auto calculateGap(const FTensor::Tensor1< T, 3 > &t_traction, FTensor::Tensor1< double, 3 > &t_n_normalize, double alpha, double beta, bool sign_sensitive=true)

◆ calculateDissipation()

template<typename T >
static auto EshelbianPlasticity::GriffithCohesiveLaw::calculateDissipation ( const T &  delta_kappa,
const T  t_eff,
const T &  kappa,
double  gc,
double  min_stiffness 
)
inlinestatic

Definition at line 101 of file EshelbianCohesive.cpp.

103 {
104 T Y = calculateY(t_eff, kappa + delta_kappa, gc, min_stiffness);
105 return Y * delta_kappa;
106 }
double kappa
static auto calculateY(const T t_eff, const T &kappa, double gc, double min_stiffness)

◆ calculateDissipationSurplus()

template<typename T >
static auto EshelbianPlasticity::GriffithCohesiveLaw::calculateDissipationSurplus ( const T &  delta_kappa,
const T  t_eff,
const T &  kappa,
double  gc,
double  min_stiffness 
)
inlinestatic

Definition at line 109 of file EshelbianCohesive.cpp.

111 {
112 T M = calculateY(t_eff, kappa + delta_kappa, gc, min_stiffness) -
113 getTau(kappa + delta_kappa, gc);
114 return -M * delta_kappa;
115 }
static T getTau(const T &k, double gc)

◆ calculateDissipationSurplusDiffKappa()

template<typename T >
static auto EshelbianPlasticity::GriffithCohesiveLaw::calculateDissipationSurplusDiffKappa ( const T &  delta_kappa,
const T &  t_eff,
const T &  kappa,
double  gc,
double  min_stiffness 
)
inlinestatic

Definition at line 118 of file EshelbianCohesive.cpp.

121 {
122
123 std::complex<T> cpx_delta = delta_kappa;
124 std::complex<T> cpx_t_eff = t_eff;
125 std::complex<T> cpx_kappa = kappa;
126 cpx_delta += eps * 1i;
127 std::complex<T> cpx_M = calculateDissipationSurplus(
128 cpx_delta, cpx_t_eff, cpx_kappa, gc, min_stiffness);
129 return cpx_M.imag() / eps;
130 }
static auto calculateDissipationSurplus(const T &delta_kappa, const T t_eff, const T &kappa, double gc, double min_stiffness)

◆ calculateDissipationSurplusDiffTraction()

template<typename T >
static auto EshelbianPlasticity::GriffithCohesiveLaw::calculateDissipationSurplusDiffTraction ( const FTensor::Tensor1< T, 3 > &  t_traction,
const T &  delta_kappa,
const T &  kappa,
FTensor::Tensor1< double, 3 > &  t_n_normalize,
double  gc,
double  beta,
double  min_stiffness 
)
inlinestatic

Definition at line 133 of file EshelbianCohesive.cpp.

136 {
137 FTENSOR_INDEX(3, i);
138 FTensor::Tensor1<double, 3> t_diff_traction;
139 std::complex<T> cpx_delta = delta_kappa;
140 std::complex<T> cpx_kappa = kappa;
141 FTensor::Tensor1<std::complex<T>, 3> t_cpx_traction;
142 for (auto jj = 0; jj != 3; ++jj) {
143 t_cpx_traction(i) = t_traction(i);
144 t_cpx_traction(jj) += eps * 1i;
145 std::complex<T> cpx_teff =
146 calculateEffectiveTraction(t_cpx_traction, t_n_normalize, beta);
147 std::complex<T> cpx_M = calculateDissipationSurplus(
148 cpx_delta, cpx_teff, cpx_kappa, gc, min_stiffness);
149 t_diff_traction(jj) = cpx_M.imag() / eps;
150 }
151 return t_diff_traction;
152 }
static auto calculateEffectiveTraction(const FTensor::Tensor1< T, 3 > &t_traction, FTensor::Tensor1< double, 3 > &t_n_normalize, double beta)

◆ calculateEffectiveTraction()

template<typename T >
static auto EshelbianPlasticity::GriffithCohesiveLaw::calculateEffectiveTraction ( const FTensor::Tensor1< T, 3 > &  t_traction,
FTensor::Tensor1< double, 3 > &  t_n_normalize,
double  beta 
)
inlinestatic

Definition at line 227 of file EshelbianCohesive.cpp.

229 {
230 auto [teff, t_gap] = calculateGap(t_traction, t_n_normalize, 1.0, beta);
231 return teff;
232 }

◆ calculateGap()

template<typename T >
static auto EshelbianPlasticity::GriffithCohesiveLaw::calculateGap ( const FTensor::Tensor1< T, 3 > &  t_traction,
FTensor::Tensor1< double, 3 > &  t_n_normalize,
double  alpha,
double  beta,
bool  sign_sensitive = true 
)
inlinestatic

Definition at line 155 of file EshelbianCohesive.cpp.

158 {
159 FTENSOR_INDEX(3, i);
160 FTENSOR_INDEX(3, j);
161 constexpr auto t_kd = FTensor::Kronecker_Delta<double>();
163 t_P(i, j) = t_n_normalize(i) * t_n_normalize(j);
165 t_Q(i, j) = t_kd(i, j) - t_P(i, j);
166 FTensor::Tensor1<T, 3> t_normal;
167 t_normal(i) = t_P(i, j) * t_traction(j);
168 FTensor::Tensor1<T, 3> t_tangential;
169 t_tangential(i) = t_Q(i, j) * t_traction(j);
170
171 if (sign_sensitive) {
172 T s = std::sqrt((t_normal(i) * t_normal(i)) / 4. +
173 (1. / beta) * t_tangential(i) * t_tangential(i));
174 T teff = (t_n_normalize(i) * t_normal(i) / 2.) + s;
175
176 FTensor::Tensor1<T, 3> t_gap{0., 0., 0.};
177 if (std::real(s) > std::numeric_limits<double>::epsilon()) {
178 t_gap(i) = alpha * (
179
180 t_n_normalize(i) * teff / 2. +
181
182 (1.0 / 4.0) * (teff / s) * t_normal(i) +
183
184 (1.0 / beta) * (teff / s) * t_tangential(i)
185
186 );
187 }
188 return std::make_pair(teff, t_gap);
189 } else {
190 T teff = std::sqrt((t_normal(i) * t_normal(i)) +
191 (1. / beta) * t_tangential(i) * t_tangential(i));
193 t_gap(i) = alpha * (
194
195 t_normal(i) + (1.0 / beta) * t_tangential(i)
196
197 );
198 return std::make_pair(teff, t_gap);
199 }
200 }
Kronecker Delta class.
constexpr auto t_kd
FTensor::Index< 'j', 3 > j

◆ calculateY()

template<typename T >
static auto EshelbianPlasticity::GriffithCohesiveLaw::calculateY ( const T  t_eff,
const T &  kappa,
double  gc,
double  min_stiffness 
)
inlinestatic

Definition at line 94 of file EshelbianCohesive.cpp.

95 {
96 T diff_alpha = getDiffAlpha(kappa, gc, min_stiffness);
97 return 0.5 * t_eff * t_eff * diff_alpha;
98 }
static T getDiffAlpha(const T &kappa, double gc, double min_stiffness)

◆ getAlpha()

template<typename T >
static T EshelbianPlasticity::GriffithCohesiveLaw::getAlpha ( const T &  kappa,
double  gc,
double  min_stiffness 
)
inlinestatic

Definition at line 45 of file EshelbianCohesive.cpp.

45 {
46 auto tau = getTau(kappa, gc);
47 return kappa / (kappa * min_stiffness + tau);
48 }

◆ getDiffAlpha()

template<typename T >
static T EshelbianPlasticity::GriffithCohesiveLaw::getDiffAlpha ( const T &  kappa,
double  gc,
double  min_stiffness 
)
inlinestatic

Definition at line 51 of file EshelbianCohesive.cpp.

51 {
52 T tau = getTau(kappa, gc);
53 T diff_tau = getDiffTau(tau, kappa, gc);
54 T dnom = kappa * min_stiffness + tau;
55 return (tau - kappa * diff_tau) / (dnom * dnom);
56 }
static auto getDiffTau(const T &tau, const T &kappa, double gc)

◆ getDiffTau()

template<typename T >
static auto EshelbianPlasticity::GriffithCohesiveLaw::getDiffTau ( const T &  tau,
const T &  kappa,
double  gc 
)
inlinestatic

Definition at line 40 of file EshelbianCohesive.cpp.

40 {
41 return -tau * (1.0 + (1.0 / (2.0 * kappa)));
42 }

◆ getInitialStrength()

static double EshelbianPlasticity::GriffithCohesiveLaw::getInitialStrength ( double  kappa,
double  gc 
)
inlinestatic

Definition at line 63 of file EshelbianCohesive.cpp.

63 {
64 const double tau = getTau(kappa, gc);
65 return tau * std::sqrt(2.0 / (kappa + 1.5));
66 }

◆ getTau()

template<typename T >
static T EshelbianPlasticity::GriffithCohesiveLaw::getTau ( const T &  k,
double  gc 
)
inlinestatic

Definition at line 34 of file EshelbianCohesive.cpp.

34 {
35 const T c = static_cast<T>(gc) / root_pi;
36 return c * std::exp(-k) / std::sqrt(k);
37 }
const double c
speed of light (cm/ns)
FTensor::Index< 'k', 3 > k

◆ invInitialStrength()

static double EshelbianPlasticity::GriffithCohesiveLaw::invInitialStrength ( double  strength,
double  gc 
)
inlinestatic

Definition at line 68 of file EshelbianCohesive.cpp.

68 {
69 // For negligible residual stiffness, the Mode-I damage-onset condition
70 //
71 // 0.5 * strength^2 * alpha'(kappa) = tau(kappa)
72 //
73 // gives strength = tau(kappa) * sqrt(2 / (kappa + 3/2)). This
74 // function is strictly decreasing, so use invTau(strength) as an
75 // initial upper bound and enlarge it until the root is bracketed.
76 double lower_kappa = 0;
77 double upper_kappa = invTau(strength, gc);
78 while (getInitialStrength(upper_kappa, gc) > strength)
79 upper_kappa *= 2;
80
81 constexpr int max_bisection_iterations = 100;
82 for (int i = 0; i != max_bisection_iterations; ++i) {
83 const double mid_kappa = 0.5 * (lower_kappa + upper_kappa);
84 if (getInitialStrength(mid_kappa, gc) > strength)
85 lower_kappa = mid_kappa;
86 else
87 upper_kappa = mid_kappa;
88 }
89
90 return 0.5 * (lower_kappa + upper_kappa);
91 }
static double getInitialStrength(double kappa, double gc)
static auto invTau(const T &tau, double Gf)

◆ invTau()

template<typename T >
static auto EshelbianPlasticity::GriffithCohesiveLaw::invTau ( const T &  tau,
double  Gf 
)
inlinestatic

Definition at line 58 of file EshelbianCohesive.cpp.

58 {
59 const T z = (2.0 * Gf * Gf) / (pi * tau * tau);
60 return T(0.5) * boost::math::lambert_w0(z); // k=0 == principal branch
61 }

Member Data Documentation

◆ eps

constexpr double EshelbianPlasticity::GriffithCohesiveLaw::eps = 1e-8
inlinestaticconstexpr

Definition at line 28 of file EshelbianCohesive.cpp.

◆ pi

constexpr double EshelbianPlasticity::GriffithCohesiveLaw::pi = boost::math::constants::pi<double>()
inlinestaticconstexpr

Definition at line 30 of file EshelbianCohesive.cpp.

◆ root_pi

constexpr double EshelbianPlasticity::GriffithCohesiveLaw::root_pi
inlinestaticconstexpr
Initial value:
=
boost::math::constants::root_pi<double>()

Definition at line 31 of file EshelbianCohesive.cpp.


The documentation for this struct was generated from the following file: