11 #include "libmesh/utility.h"
21 params.addParam<
bool>(
"numerical_stiffness",
false,
"Flag for numerical stiffness");
22 params.addParam<Real>(
"damage_stiffness", 1e-8,
"Avoid zero after complete damage");
23 params.addParam<Real>(
"zero_tol", 1e-12,
"Tolerance for numerical zero");
24 params.addParam<Real>(
25 "zero_perturb", 1e-8,
"Perturbation value when strain value less than numerical zero");
26 params.addParam<Real>(
"perturbation_scale_factor", 1e-5,
"Perturbation scale factor");
27 params.addRequiredCoupledVar(
"c",
"Damage variable");
28 params.addParam<
bool>(
29 "use_current_history_variable",
false,
"Use the current value of the history variable.");
30 params.addParam<MaterialPropertyName>(
31 "F_name",
"E_el",
"Name of material property storing the elastic energy");
32 params.addClassDescription(
33 "Computes damaged stress and energy in the intermediate configuration assuming isotropy");
40 _num_stiffness(getParam<bool>(
"numerical_stiffness")),
41 _kdamage(getParam<Real>(
"damage_stiffness")),
42 _use_current_hist(getParam<bool>(
"use_current_history_variable")),
43 _l(getMaterialProperty<Real>(
"l")),
44 _gc(getMaterialProperty<Real>(
"gc_prop")),
45 _zero_tol(getParam<Real>(
"zero_tol")),
46 _zero_pert(getParam<Real>(
"zero_perturb")),
47 _pert_val(getParam<Real>(
"perturbation_scale_factor")),
48 _c(coupledValue(
"c")),
51 declarePropertyDerivative<
RankTwoTensor>(_base_name +
"stress", getVar(
"c", 0)->
name())),
53 _F(declareProperty<Real>(getParam<MaterialPropertyName>(
"F_name"))),
54 _dFdc(declarePropertyDerivative<Real>(getParam<MaterialPropertyName>(
"F_name"),
55 getVar(
"c", 0)->
name())),
56 _d2Fdc2(declarePropertyDerivative<Real>(
57 getParam<MaterialPropertyName>(
"F_name"), getVar(
"c", 0)->
name(), getVar(
"c", 0)->
name())),
58 _d2Fdcdstrain(declareProperty<
RankTwoTensor>(
"d2Fdcdstrain")),
59 _hist(declareProperty<Real>(
"hist")),
60 _hist_old(getMaterialPropertyOld<Real>(
"hist"))
81 for (
unsigned int i = 0; i < LIBMESH_DIM; ++i)
82 for (
unsigned int j = 0; j < LIBMESH_DIM; ++j)
83 for (
unsigned int k = 0; k < LIBMESH_DIM; ++k)
99 Real xfac = Utility::pow<2>(1.0 - c) +
_kdamage;
101 std::vector<Real> eigval;
103 _ee.symmetricEigenvaluesEigenvectors(eigval, evec);
105 for (
unsigned int i = 0; i < LIBMESH_DIM; ++i)
106 _etens[i].vectorOuterProduct(evec.column(i), evec.column(i));
109 for (
unsigned int i = 0; i < LIBMESH_DIM; ++i)
112 Real etrpos = (std::abs(etr) + etr) / 2.0;
113 Real etrneg = (std::abs(etr) - etr) / 2.0;
117 for (
unsigned int i = 0; i < LIBMESH_DIM; ++i)
119 pk2pos +=
_etens[i] * (lambda * etrpos + 2.0 * mu * (std::abs(eigval[i]) + eigval[i]) / 2.0);
120 pk2neg +=
_etens[i] * (lambda * etrneg + 2.0 * mu * (std::abs(eigval[i]) - eigval[i]) / 2.0);
127 std::vector<Real> epos(LIBMESH_DIM), eneg(LIBMESH_DIM);
128 for (
unsigned int i = 0; i < LIBMESH_DIM; ++i)
130 epos[i] = (std::abs(eigval[i]) + eigval[i]) / 2.0;
131 eneg[i] = (std::abs(eigval[i]) - eigval[i]) / 2.0;
135 Real pval(0.0), nval(0.0);
136 for (
unsigned int i = 0; i < LIBMESH_DIM; ++i)
138 pval += epos[i] * epos[i];
139 nval += eneg[i] * eneg[i];
143 const Real G0_pos = lambda * etrpos * etrpos / 2.0 + mu * pval;
144 const Real G0_neg = lambda * etrneg * etrneg / 2.0 + mu * nval;
154 hist_variable =
_hist[_qp];
157 _F[_qp] = hist_variable * xfac - G0_neg +
_gc[_qp] / (2 *
_l[_qp]) * c * c;
160 _dFdc[_qp] = -hist_variable * 2.0 * (1.0 - c) * (1 -
_kdamage) +
_gc[_qp] /
_l[_qp] * c;
167 _dpk2_dc = -pk2pos * 2.0 * (1.0 - c);
176 for (
unsigned int i = 0; i < LIBMESH_DIM; ++i)
177 for (
unsigned int j = i; j < LIBMESH_DIM; ++j)
184 _ee(i, j) += ee_pert;
188 for (
unsigned int k = 0; k < LIBMESH_DIM; ++k)
189 for (
unsigned int l = 0; l < LIBMESH_DIM; ++l)