17#ifndef __B2COMPOSITE_CONSISTENT_DAMAGE_MODEL_MCMD_2006_H__
18#define __B2COMPOSITE_CONSISTENT_DAMAGE_MODEL_MCMD_2006_H__
47class CompositeConsistentDamageModelMCMD2006 {
49 CompositeConsistentDamageModelMCMD2006() : damage_data(nullptr) {}
51 ~CompositeConsistentDamageModelMCMD2006() {
delete damage_data; }
54 const double E[2],
const double P,
const double G[3],
const double X[5],
55 const double Gf[5],
const double area,
const double b,
const double time,
56 const double delta_time,
const double viscosity,
const double strain[6],
57 const EquilibriumSolution equilibrium_solution,
double stress[6],
58 double d_stress_d_strain[21],
int& elasticity_domain);
60 const double* get_damages()
const {
62 return damage_data->r;
64 static const double undamage_r[4] = {1.0, 1.0, 1.0, 1.0};
69 const double* get_A()
const {
71 return damage_data->A;
73 static const double undamage_A[5] = {0.0, 0.0, 0.0, 0.0, 0.0};
81 std::fill_n(r, 4, 1.0);
82 std::fill_n(A, 5, -1.0);
83 std::fill_n(warnings, 5,
false);
89 DamageData* damage_data;
92 static double simpson_integration(
double a,
double b,
int n,
const T& f) {
94 double r = (f(a) + f(b)) / 2;
95 const double h = (b - a) / n;
97 for (
int i = 1; i != n; ++i, a += h) { r += (1 + i % 2) * f(a); }
101 template <
typename D_M>
104 G_M(
const D_M& d_M_,
double E,
double P,
double e_stress)
105 : d_M(d_M_), P2(P * P), s_E(e_stress * e_stress / (2 * E)), A(0) {}
106 double operator()(
double r)
const {
107 double tmp = (1 - P2) / (1 - (1 - d_M.value(r, A)) * P2);
108 return tmp * tmp * s_E * d_M.d_value_d_r(r, A);
110 double value(
double A_) {
112 const double ln_inv_K = std::log(1 / 20.0);
113 const double s = -1 / A * ln_inv_K;
114 return simpson_integration(1, 1 + s, 100, *
this);
125 template <
typename D_M>
126 static double compute_adjustment_parameter(
127 double E,
double X,
double Gf,
double characteristic_length, G_M<D_M>& g_M,
double tol) {
133 Gf = Gf / characteristic_length;
135 double A_1 = (2 * characteristic_length * X) / (2 * E * Gf - characteristic_length * X);
137 Exception() <<
"The element size are too big for this material" <<
THROW;
139 double g_1 = g_M.value(A_1);
140 double A_0 = 0.5 * A_1;
141 double g_0 = g_M.value(A_0);
143 for (
int nbiter = 0; nbiter != 50 && g_1 > Gf; ++nbiter) {
145 g_1 = std::max(g_M.value(A_1), 1e-200);
147 lA_1 = std::log(A_1);
148 lg_1 = std::log(g_1);
150 for (
int nbiter = 0; nbiter != 50 && g_0 < Gf; ++nbiter) {
152 g_0 = g_M.value(A_0);
154 lA_0 = std::log(A_0);
155 lg_0 = std::log(g_0);
157 const double lGc = std::log(Gf);
158 for (
int nbiter = 0; nbiter != 20; ++nbiter) {
159 double lA_2 = lA_1 - (lg_1 - lGc) * (lA_1 - lA_0) / (lg_1 - lg_0);
161 lA_2 = std::min(lA_2, 200.0);
162 double A = std::exp(lA_2);
164 for (
int nbiter1 = 0; nbiter1 != 10; ++nbiter1) {
173 if (g_1 != g_1) { Exception() <<
THROW; }
174 if (std::abs(g_1 - Gf) <= tol) {
return A; }
175 lg_1 = std::log(g_1);
176 if (std::abs(lg_1 - lg_0) <= tol) {
return A; }
180 Exception() <<
THROW;
186 D1minus(
const double Apm_,
const double A1plus,
const double rplus)
187 : Apm(Apm_), f(1 - Apm + Apm / rplus * std::
exp(A1plus * (1 - rplus))) {}
188 double value(
const double r,
const double A)
const {
189 return 1 - std::exp(A * (1 - r)) * f / r;
191 double d_value_d_r(
const double r,
const double A)
const {
192 return f * std::exp(A * (1 - r)) * (1 + r * A) / (r * r);
202 D2plus(
const double g_) : g(g_) {}
203 double value(
const double r,
const double A)
const {
204 const double f2plus = (g - 1 + std::sqrt((1 - g) * (1 - g) + 4 * g * r * r)) / (2 * g);
205 return 1 - std::exp(A * (1 - f2plus)) / f2plus;
207 double d_value_d_r(
const double r,
const double A)
const {
208 const double s = std::sqrt((1 - g) * (1 - g) + 4 * g * r * r);
209 return 4 * (g * r * std::exp(A * (1 - s)) * (g * (2 + A) - A * (1 - s)))
219 double value(
const double r,
const double A)
const {
return 1 - std::exp(A * (1 - r)) / r; }
220 double d_value_d_r(
const double r,
const double A)
const {
221 return std::exp(A * (1 - r)) * (1 / (r * r) + A);
csda< T > exp(const csda< T > &a)
Natural exponential of a csda number.
Definition b2csda.H:360
#define THROW
Definition b2exception.H:198
Contains the base classes for implementing Finite Elements.
Definition b2boundary_condition.H:32