47 double const aperture0,
48 Eigen::Ref<Eigen::VectorXd const>
50 Eigen::Ref<Eigen::VectorXd const>
52 Eigen::Ref<Eigen::VectorXd const>
54 Eigen::Ref<Eigen::VectorXd const>
56 Eigen::Ref<Eigen::VectorXd>
58 Eigen::Ref<Eigen::MatrixXd>
61 material_state_variables)
64 &material_state_variables) !=
nullptr);
71 const int index_ns = DisplacementDim - 1;
72 double const aperture = w[index_ns] + aperture0;
76 Ke = Eigen::MatrixXd::Zero(DisplacementDim, DisplacementDim);
77 for (
int i = 0; i < index_ns; i++)
82 Ke(index_ns, index_ns) = mat.Kn;
90 sigma.noalias() = Ke * (w - w_prev);
92 sigma.coeffRef(index_ns) *=
94 sigma.noalias() += sigma_prev;
107 auto yield_function = [&mat](Eigen::VectorXd
const& s)
109 double const sigma_n = s[DisplacementDim - 1];
110 Eigen::VectorXd
const sigma_s = s.head(DisplacementDim - 1);
111 double const mag_tau = sigma_s.norm();
112 return mag_tau + sigma_n * std::tan(mat.phi) - mat.c;
116 double const Fs = yield_function(sigma);
127 auto yield_function_derivative = [&mat](Eigen::VectorXd
const& s)
129 Eigen::Matrix<double, DisplacementDim, 1> dFs_dS;
130 dFs_dS.template head<DisplacementDim - 1>().noalias() =
131 s.template head<DisplacementDim - 1>().normalized();
132 dFs_dS.coeffRef(DisplacementDim - 1) = std::tan(mat.phi);
137 auto plastic_potential_derivative = [&mat](Eigen::VectorXd
const& s)
139 Eigen::Matrix<double, DisplacementDim, 1> dQs_dS;
140 dQs_dS.template head<DisplacementDim - 1>().noalias() =
141 s.template head<DisplacementDim - 1>().normalized();
142 dQs_dS.coeffRef(DisplacementDim - 1) = std::tan(mat.psi);
148 Eigen::FullPivLU<Eigen::Matrix<double, 1, 1, Eigen::RowMajor>>
150 using ResidualVectorType = Eigen::Matrix<double, 1, 1, Eigen::RowMajor>;
151 using JacobianMatrix = Eigen::Matrix<double, 1, 1, Eigen::RowMajor>;
153 JacobianMatrix jacobian;
154 ResidualVectorType solution;
157 auto const update_residual = [&](ResidualVectorType& residual)
158 { residual[0] = yield_function(sigma); };
160 auto const update_jacobian = [&](JacobianMatrix& jacobian)
162 jacobian(0, 0) = -yield_function_derivative(sigma).transpose() *
163 Ke * plastic_potential_derivative(sigma);
166 auto const update_solution = [&](ResidualVectorType
const& increment)
168 solution += increment;
173 solution[0] * plastic_potential_derivative(sigma);
175 sigma.noalias() = Ke * (w - w_prev - state.
w_p + state.
w_p_prev);
179 sigma.noalias() += sigma_prev;
183 linear_solver, update_jacobian, update_residual, update_solution,
186 auto const success_iterations = newton_solver.solve(jacobian);
188 if (!success_iterations)
191 "FractureModel/Coulomb local nonlinear solver didn't "
200 double const Fs = yield_function(sigma);
204 Ke(index_ns, index_ns) *=
206 Eigen::RowVectorXd
const A = yield_function_derivative(sigma).transpose() *
208 (yield_function_derivative(sigma).transpose() *
209 Ke * plastic_potential_derivative(sigma));
210 Kep = Ke - Ke * plastic_potential_derivative(sigma) * A;