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