This document describes how to build a behaviour of concrete describing the damage evolution following Fichant-La Borderie and the load induced thermal strain (LITS) following Torelli et al (See [14] for details).

We strongly advice readers to refer to the following documents before continuing:

Description of the coupled behaviour

The behaviour is described by a standard split of the strain \(\underline{\varepsilon}^{\mathrm{to}}\) in an elastic and a viscoplastic parts, respectively denoted \(\underline{\varepsilon}^{\mathrm{el}}\) and \(\underline{\varepsilon}^{\mathrm{LITS}}\):

\[ \underline{\varepsilon}^{\mathrm{to}}=\underline{\varepsilon}^{\mathrm{el}}+\underline{\varepsilon}^{\mathrm{LITS}} \qquad(1)\]

Damage behaviour

The stress \(\underline{\sigma}\) is related to the the elastic strain \(\underline{\varepsilon}^{\mathrm{el}}\) by the Fichant-La Borderie damage behaviour:

\[ \underline{\sigma}= f_{FLB}{\left(d,\underline{\varepsilon}^{\mathrm{el}}\right)} \qquad(2)\]

where \(d\) is a scalar damage variable. See this page for details.

Damage evolution

The damage evolution is a function of the equivalent elastic strain \(\varepsilon^{\mathrm{el}}_{\mathrm{eq}}\), which will be defined hereafter:

However, the latter expression must be modified to take into account the irreversibility of the damage evolution. Let \({\left.d\right|_{t}}\) be the value of the damage at the beginning of the time step and \({\left.d\right|_{t+\Delta\,t}}\) its value at the end of the time step, \({\left.d\right|_{t+\Delta\,t}}\) is determined as follows:

\[ {\left.d\right|_{t+\Delta\,t}}=\max{\left({\left.d\right|_{t}},1-{{\displaystyle \frac{\displaystyle \epsilon_{0}}{\displaystyle {\left.\varepsilon^{\mathrm{el}}_{\mathrm{eq}}\right|_{t+\Delta\,t}}}}}\,\exp{\left(B_{t}\,{\left(\epsilon_{0}-{\left.\varepsilon^{\mathrm{el}}_{\mathrm{eq}}\right|_{t+\Delta\,t}}\right)}\right)}\right)} \]

where \({\left.\varepsilon^{\mathrm{el}}_{\mathrm{eq}}\right|_{t+\Delta\,t}}\) is the value of the equivalent elastic strain at the end of the time step.

Equivalent strain

The equivalent elastic strain \(\varepsilon^{\mathrm{el}}_{\mathrm{eq}}\) is defined as:

\[ \varepsilon^{\mathrm{el}}_{\mathrm{eq}}=\sqrt{{\left<\underline{\varepsilon}^{\mathrm{el}}\right>_{+}}\,\colon\,{\left<\underline{\varepsilon}^{\mathrm{el}}\right>_{+}}}= \sqrt{\sum_{I=1}^{3}{\left<\varepsilon^{\mathrm{el}}_{I}\right>_{+}}^2} \]

where \({\left<\underline{\varepsilon}^{\mathrm{el}}\right>_{+}}\) is the positive part of the elastic strain and \(\left(\varepsilon^{\mathrm{el}}_{I}\right)_{i \in [1:3]}\) are its eigenvalues.

Computation of the stress

The stress tensor \(\underline{\sigma}\) is then computed as follows: \[ {\left.\underline{\sigma}\right|_{t+\Delta\,t}}={\left(1-{\left.d\right|_{t+\Delta\,t}}\right)}\,{\left<{\left.\underline{\sigma}^{\mathrm{eff}}\right|_{t+\Delta\,t}}\right>_{+}}+{\left(1-{\left.d\right|_{t+\Delta\,t}}^{a}\right)}\,{\left<{\left.\underline{\sigma}^{\mathrm{eff}}\right|_{t+\Delta\,t}}\right>_{-}} \]

where the effective stress tensor \(\underline{\sigma}^{\mathrm{eff}}\) is computed using the standard Hooke law:

\[ {\left.\underline{\sigma}^{\mathrm{eff}}\right|_{t+\Delta\,t}}={\left.\underline{\underline{\mathbf{D}}}\right|_{t+\Delta\,t}}\,\colon\,{\left.\underline{\varepsilon}^{\mathrm{el}}\right|_{t+\Delta\,t}} \]

The behaviour is assumed isotropic, so that the stiffness tensor \({\left.\underline{\underline{\mathbf{D}}}\right|_{t+\Delta\,t}}\) can be related to the first and second Lamé coefficients, denoted respectively \(\lambda\) and \(\mu\), as follows:

\[ {\left.\underline{\underline{\mathbf{D}}}\right|_{t+\Delta\,t}}={\left.\lambda\right|_{t+\Delta\,t}}\,\underline{I}\,\otimes\,\underline{I}+2\,{\left.\mu\right|_{t+\Delta\,t}}\,\underline{\underline{\mathbf{I}}} \]

Load induced thermal strain

The evolution of the load induced thermal strain \(\underline{\varepsilon}^{\mathrm{LITS}}\) is given by:

\[ \underline{\dot{\varepsilon}}^{\mathrm{LITS}}= {{\displaystyle \frac{\displaystyle \eta{\left(\underline{\sigma}\right)}\,\beta{\left(T\right)}}{\displaystyle \sigma_{u0}}}} \left[ -\nu_{\mathrm{LITS}}{\mathrm{tr}{\left({\left<\underline{\sigma}\right>_{-}}\right)}}\,\underline{I} +{\left(1-\nu_{\mathrm{LITS}}\right)}\,{\left<\underline{\sigma}\right>_{-}} \right]\,\dot{T}_{e} \qquad(4)\]

where:

\(\dot{T}_{e}\) is the effective temperature rate defined as follows:

\[ \dot{T}_{e}= \left\{ \begin{aligned} \dot{T} &\quad\text{if}\quad T=T_{\mathrm{max}}\\ 0 &\quad\text{if}\quad T<T_{\mathrm{max}}\\ \end{aligned} \right. \]

where \(T_{\mathrm{max}}\) is the maximal temperature seen by the material over time.

Implicit algorithm

Following the implementation of Torelli’ LITS behaviour (see here for details), the implicit scheme can be reduced to one non linear equation whose only unknown is the elastic strain increment:

\[ f_{\underline{\varepsilon}^{\mathrm{el}}}=\Delta\,\underline{\varepsilon}^{\mathrm{el}}+\Delta\,\underline{\varepsilon}^{\mathrm{LITS}}{\left(\Delta\,\underline{\varepsilon}^{\mathrm{el}}\right)}-\Delta\,\underline{\varepsilon}^{\mathrm{to}}=\underline{0} \qquad(5)\]

Computing the jacobian \({\displaystyle \frac{\displaystyle \partial f_{\underline{\varepsilon}^{\mathrm{el}}}}{\displaystyle \partial \Delta\,\underline{\varepsilon}^{\mathrm{el}}}}\) is straightforward:

\[ {\displaystyle \frac{\displaystyle \partial f_{\underline{\varepsilon}^{\mathrm{el}}}}{\displaystyle \partial \Delta\,\underline{\varepsilon}^{\mathrm{el}}}}=\underline{\underline{\mathbf{I}}}+{\displaystyle \frac{\displaystyle \partial \Delta\,\underline{\varepsilon}^{\mathrm{LITS}}}{\displaystyle \partial {\left.\underline{\sigma}\right|_{t+\theta\,\Delta\,t}}}}\,\colon\,{\displaystyle \frac{\displaystyle \partial {\left.\underline{\sigma}\right|_{t+\theta\,\Delta\,t}}}{\displaystyle \partial \Delta\,\underline{\varepsilon}^{\mathrm{el}}}} \]

The derivative \({\displaystyle \frac{\displaystyle \partial \Delta\,\underline{\varepsilon}^{\mathrm{LITS}}}{\displaystyle \partial {\left.\underline{\sigma}\right|_{t+\theta\,\Delta\,t}}}}\) has been computed on this page while the derivative \({\displaystyle \frac{\displaystyle \partial {\left.\underline{\sigma}\right|_{t+\theta\,\Delta\,t}}}{\displaystyle \partial \Delta\,\underline{\varepsilon}^{\mathrm{el}}}}\) is computed on this page.

Implementation

Choice of the domain specific language

The domain specific language suitable for implementing an implicit scheme is called Implicit. The @DSL keyword allows specifying the domain specific language to be used:

@DSL Implicit;

Choice of the behaviour name

The @Behaviour allows giving a name the behaviour:

@Behaviour FichantLaBorderieDamageAndTorelliLoadInducedThermalStrainBehaviour;

Defining the name of behaviour is required.

Metadata

The @Author, @Date and @Description keywords allows adding metadata to the behaviour (respectively the name of the author of the implementation, the date at which the implementation was written, a short description), as follows:

@Author Thomas Helfer;
@Date 15 / 12 / 2019;
@Description {
  "Implementation of a behaviour combining Fichant-La Borderie' "
  "description of damage and Torelli'LITS"
}

Numerical parameters

We specify two numerical parameters impacting the implicit scheme:

@Epsilon 1.e-14;
@Theta 1;

Thermoelastic properties, computation of the thermal strain

The @ElasticMaterialProperties keyword allows defining the material properties. When those are defined, the Implicit DSL automatically defines the first and second Lamé coefficients in local variables called:

@ElasticMaterialProperties{47000, 0.25};

The @ComputeThermalExpansion keyword allows computing the thermal strain. It is followed by the mean thermal expansion coefficient.

@ComputeThermalExpansion 10e-6;
// parameters of the Fichant-La Borderie part
@Parameter Bt = 3690.070983;
@Parameter e0 = 1.03e-04;
@Parameter a = 3;
// parameters of the LITS part
@Parameter gamma = 1.5;
@Parameter sigmultimate = 50.;
@Parameter nulits = 0.50;
@Parameter tcrit = 0.;
@Parameter b[5] = {2.7031065533E-05, -1.0209170592E-06, 6.1200423753E-9,  //
                   -1.2632648735E-11, 6.9158539621E-15};
@AuxiliaryStateVariable real d;
d.setGlossaryName("Damage");
@AuxiliaryStateVariable StrainStensor elits;
elits.setEntryName("LoadInducedThermaStrain");
@AuxiliaryStateVariable temperature Tmax;
Tmax.setEntryName("MaximalValueOfTheTemperature");
//! LITS increment
@LocalVariable StrainStensor delits;
//! Creep coefficient
@LocalVariable real C;
@LocalVariable StiffnessTensor dsig_ddeel;
@LocalVariable real d_p;
@LocalVariable StiffnessTensor De;
@InitLocalVariables {
  Tmax = max(max(tcrit, Tmax), T);
  const auto T_ = T + theta * dT;
  const auto beta = b[0] + T_ * (b[1] + T_ * (b[2] + T_ * (b[3] + T_ * b[4])));
  const auto dTe = max(T + dT - max(tcrit, Tmax), temperature(0));
  C = (beta / (-sigmultimate)) * dTe;
  De = lambda_tdt * Stensor4::IxI() + 2 * mu_tdt * Stensor4::Id();
} // end of @InitLocalVariables
@Integrator {
  constexpr const auto id = Stensor::Id();
  constexpr const auto esolver = StressStensor::FSESJACOBIEIGENSOLVER;
  constexpr const stress eeps = 1.e-12;
  const stress seps = 1.e-12 * young;
  // positive part
  const auto pp = [](const real x) { return x > 0 ? x : 0; };
  // derivative of the positive part
  const auto dpp = [&eeps](const real x) { return std::abs(x) < eeps ? 0.5 : ((x < 0) ? 0 : 1); };
  // square of the posititve part
  auto square_ppos = [](const strain& v) { return v > 0 ? v * v : 0; };
  // elastic strain at the midle of the time step
  const auto e = eval(eel + deel);
  // eigen values and eigen tensors of the elastic strain
  auto e_vp = tvector<3u, strain>{};
  auto m = tmatrix<3u, 3u, strain>{};
  e.template computeEigenVectors<esolver>(e_vp, m);
  // update the damage
  const auto e_eq = sqrt(square_ppos(e_vp[0]) + square_ppos(e_vp[1]) + square_ppos(e_vp[2]));
  // effective stress at t+dt
  const auto Cd = (e0 / e_eq) * exp(Bt * (e0 - e_eq));
  d_p = (e_eq > e0) ? 1 - Cd : 0;
  const auto bp = d_p > d;
  const auto de = bp ? d_p : d;
  // derivative with respect to the damage
  const auto dde_ddeel = [&]() -> Stensor {
    if (!bp) {
      return Stensor(real(0));
    }
    // positive part of the total strain
    const auto ep = StrainStensor::computeIsotropicFunction(pp, e_vp, m);
    // derivative of the damage
    const auto dde_deq = Cd * (Bt + 1 / e_eq);
    const auto dep_ddeel =
        StrainStensor::computeIsotropicFunctionDerivative(pp, dpp, e_vp, m, eeps * 0.1);
    const auto deq_dep = ep / e_eq;
    return dde_deq * deq_dep * dep_ddeel;
  }();
  // function of the damage to simplify expressions
  const auto de_a = pow(de, a);
  const auto fpd = (1 - de);
  const auto fpn = (1 - de_a);
  // effective stress at the end of the time step
  const auto l_tr_e = lambda_tdt * trace(e);
  const auto s = eval(l_tr_e * id + 2 * mu_tdt * e);
  const auto s_vp = tvector<3u>{l_tr_e + 2 * mu_tdt * e_vp[0],  //
                                l_tr_e + 2 * mu_tdt * e_vp[1],  //
                                l_tr_e + 2 * mu_tdt * e_vp[2]};
  const auto sp = StressStensor::computeIsotropicFunction(pp, s_vp, m);
  const auto dsp = StressStensor::computeIsotropicFunctionDerivative(pp, dpp, s_vp, m, seps * 0.1);
  const auto sn = eval(s - sp);
  const auto dsn = eval(Stensor4::Id() - dsp);
  // final stress
  sig = fpd * sp + fpn * sn;
  // derivative of the stress
  dsig_ddeel = ((fpd - fpn) * dsp + fpn * Stensor4::Id()) * De;
  if (bp) {
    const auto ide = 1 / max(eeps, de);
    const auto dfpd_dd = -1;
    const auto dfpn_dd = -a * de_a * ide;
    dsig_ddeel += dfpd_dd * (sp ^ dde_ddeel) + dfpn_dd * (sn ^ dde_ddeel);
  }
  // LITS part
  const auto sn_eq = sqrt(sn | sn);
  const auto isn_eq = 1 / max(seps, sn_eq);
  const auto cm = -trace(sn) * isn_eq;
  const auto dcm_dsig = eval((-isn_eq * id + trace(sn) * power<3>(isn_eq) * sn) | dsn);
  const auto eta = 1 + (cm - 1) * gamma;
  const auto se = eval((1 + nulits) * sn - nulits * trace(sn) * id);
  delits = C * eta * se;
  const auto deta_dsig = gamma * dcm_dsig;
  const auto dse_dsig = (1 + nulits) * dsn - nulits * ((id ^ id) * dsn);
  const auto ddelits_dsig = C * (se ^ deta_dsig) + C * eta * dse_dsig;
  // elasticity
  feel += delits;
  dfeel_ddeel += ddelits_dsig * dsig_ddeel;
} // end of @Integrator
@UpdateAuxiliaryStateVariables {
  d = max(d, d_p);
  elits += delits;
}
@TangentOperator {
  if (smt == ELASTIC) {
    Dt = De;
  } else if (smt==CONSISTENTTANGENTOPERATOR){
    Stensor4 ddeel_ddeto;
    getPartialJacobianInvert(ddeel_ddeto);
    Dt = dsig_ddeel * ddeel_ddeto;
  }
}

References

1.
Fichant, Stéphanie. Endommagement et anisotropie induite du béton de structures : Modélisations approchées. thesis. Cachan, Ecole normale supérieure, 1996. Available from: http://www.theses.fr/1996DENS0015
2.
Gangnant, Alexandre. Étude de la rupture quasi-fragile d’un béton à l’échelle mésoscopique : Aspects expérimentaux et modélisation. thesis. Bordeaux, 2016. Available from: http://www.theses.fr/2016BORD0401
3.
Torelli, Giacomo, Mandal, Parthasarathi, Gillie, Martin and Tran, Van-Xuan. A confinement-dependent load-induced thermal strain constitutive model for concrete subjected to temperatures up to 500 °c. International Journal of Mechanical Sciences. 4 January 2018. DOI 10.1016/j.ijmecsci.2017.12.054. Available from: http://www.sciencedirect.com/science/article/pii/S0020740317337372
4.
Draup, Jefry, Gangnant, Alexandre, Colette, Gaëtan, Doughty, Graham, Guo, Jiansong, Helfer, Thomas, Torelli, Giacomo and Mandal, Parthasarathi. Development of a novel damage model for concrete subjected to high temperature and constraint. In : Proceeding of SMIRT 25. Charlotte,NC,USA, August 2019. Available from: https://www.researchgate.net/publication/333783199_Development_of_a_Novel_Damage_Model_for_Concrete_Subjected_to_High_Temperature_and_Constraint