39 double const aperture0,
40 Eigen::Ref<Eigen::VectorXd const>
42 Eigen::Ref<Eigen::VectorXd const>
44 Eigen::Ref<Eigen::VectorXd const>
46 Eigen::Ref<Eigen::VectorXd const>
48 Eigen::Ref<Eigen::VectorXd>
50 Eigen::Ref<Eigen::MatrixXd>
53 material_state_variables)
56 &material_state_variables) !=
nullptr);
63 auto const mp = evaluatedMaterialProperties(t, x);
69 const int index_ns = DisplacementDim - 1;
70 double const w_n = w[index_ns];
71 for (
int i = 0; i < index_ns; i++)
76 sigma.noalias() = C * w;
78 double const aperture = w_n + aperture0;
80 sigma.coeffRef(index_ns) =
81 mp.Kn * w_n *
logPenalty(aperture0, aperture, _penalty_aperture_cutoff);
83 C(index_ns, index_ns) =
87 sigma.noalias() += sigma0;
90 if (sigma[index_ns] < 0)
99 const double w_n_effective = w_n + sigma0[index_ns] / mp.Kn;
100 double degradation = 0.0;
103 state.damage_prev = 1.0;
109 computeDamage(state.damage_prev, w_n_effective, mp.w_np, mp.w_nf);
110 degradation = ((1 - state.damage) * mp.w_np) /
111 (mp.w_np + state.damage * (mp.w_nf - mp.w_np));
117 Eigen::VectorXd w_eff = w;
119 w_eff[index_ns] = w_n_effective;
122 if (state.damage > state.damage_prev)
126 Eigen::Matrix<double, DisplacementDim, 1> dd_dw =
127 Eigen::Matrix<double, DisplacementDim, 1>::Zero();
129 double const tmp = mp.w_np + state.damage * (mp.w_nf - mp.w_np);
131 (mp.w_np * mp.w_nf) / ((mp.w_nf - mp.w_np) * (tmp * tmp));
133 C -= C * w_eff * (dd_dw).transpose();