80 material_state_variables)
const
82 auto const& eps_m = std::get<MPL::SymmetricTensor<DisplacementDim>>(
84 auto const& eps_m_prev = std::get<MPL::SymmetricTensor<DisplacementDim>>(
86 auto const& sigma_prev = std::get<MPL::SymmetricTensor<DisplacementDim>>(
87 variable_array_prev.
stress);
92 &material_state_variables) !=
nullptr);
97 auto local_lubby2_properties =
101 auto const& P_dev = Invariants::deviatoric_projection;
108 KelvinVector sigd_t = P_dev * sigma_prev / local_lubby2_properties.GM0;
111 double sig_eff = Invariants::equivalentStress(sigd_j);
112 local_lubby2_properties.update(sig_eff);
114 using LocalJacobianMatrix =
115 Eigen::Matrix<double, KelvinVectorSize * 3, KelvinVectorSize * 3,
120 Eigen::FullPivLU<LocalJacobianMatrix> linear_solver;
133 LocalJacobianMatrix K_loc;
135 using LocalResidualVector =
136 Eigen::Matrix<double, KelvinVectorSize * 3, 1>;
138 auto const update_residual = [&](LocalResidualVector& residual)
140 calculateResidualBurgers(dt, eps_m_d_i, eps_m_d_t, sigd_j, sigd_t,
143 local_lubby2_properties);
146 auto const update_jacobian = [&](LocalJacobianMatrix& jacobian)
148 calculateJacobianBurgers(
149 t, x, dt, jacobian, sig_eff, sigd_j, state.
eps_K_j,
150 local_lubby2_properties);
153 auto const update_solution = [&](LocalResidualVector
const& increment)
156 sigd_j.noalias() += increment.template segment<KelvinVectorSize>(
157 KelvinVectorSize * 0);
159 increment.template segment<KelvinVectorSize>(KelvinVectorSize *
162 increment.template segment<KelvinVectorSize>(KelvinVectorSize *
167 KelvinVectorSize>::equivalentStress(sigd_j);
168 local_lubby2_properties.update(sig_eff);
172 decltype(linear_solver), LocalJacobianMatrix,
173 decltype(update_jacobian), LocalResidualVector,
174 decltype(update_residual),
decltype(update_solution)>(
175 linear_solver, update_jacobian, update_residual, update_solution,
176 _nonlinear_solver_parameters);
178 auto const success_iterations = newton_solver.
solve(K_loc);
180 if (!success_iterations)
188 if (*success_iterations == 0)
190 linear_solver.compute(K_loc);
195 tangentStiffnessA<DisplacementDim>(local_lubby2_properties.GM0,
196 local_lubby2_properties.KM0,
200 double const delta_eps_m_trace = Invariants::trace(eps_m - eps_m_prev);
201 double const sigma_trace_prev = Invariants::trace(sigma_prev);
203 local_lubby2_properties.GM0 * sigd_j +
204 (local_lubby2_properties.KM0 * delta_eps_m_trace +
205 sigma_trace_prev / 3.) *
206 Invariants::identity2;
207 return {std::make_tuple(
262 Jac.template block<KelvinVectorSize, KelvinVectorSize>(0, 0)
267 Jac.template block<KelvinVectorSize, KelvinVectorSize>(0, KelvinVectorSize)
272 Jac.template block<KelvinVectorSize, KelvinVectorSize>(0,
273 2 * KelvinVectorSize)
278 Jac.template block<KelvinVectorSize, KelvinVectorSize>(KelvinVectorSize, 0)
280 -0.5 * dt * properties.
GM0 / properties.
etaK * KelvinMatrix::Identity();
284 1. / (properties.
etaK * properties.
etaK) *
285 (properties.
GM0 * sig_i - 2. * properties.
GK * eps_K_i);
288 properties.
GM0 / s_eff * sig_i;
290 properties.
etaK / s_eff * sig_i;
291 Jac.template block<KelvinVectorSize, KelvinVectorSize>(KelvinVectorSize,
293 .noalias() += 0.5 * dt * eps_K_aid * dmu_vK.transpose() +
294 dt / properties.
etaK * eps_K_i * dG_K.transpose();
298 Jac.template block<KelvinVectorSize, KelvinVectorSize>(KelvinVectorSize,
301 .setConstant(1. + dt * properties.
GK / properties.
etaK);
306 Jac.template block<KelvinVectorSize, KelvinVectorSize>(2 * KelvinVectorSize,
309 -0.5 * dt * properties.
GM0 / properties.
etaM * KelvinMatrix::Identity();
313 properties.
etaM / s_eff * sig_i;
314 Jac.template block<KelvinVectorSize, KelvinVectorSize>(
315 2 * KelvinVectorSize, 0)
316 .noalias() += 0.5 * dt * properties.
GM0 /
317 (properties.
etaM * properties.
etaM) * sig_i *
324 Jac.template block<KelvinVectorSize, KelvinVectorSize>(2 * KelvinVectorSize,
325 2 * KelvinVectorSize)
std::optional< std::tuple< KelvinVector, std::unique_ptr< typename MechanicsBase< DisplacementDim >::MaterialStateVariables >, KelvinMatrix > > integrateStress(MaterialPropertyLib::VariableArray const &variable_array_prev, MaterialPropertyLib::VariableArray const &variable_array, double const t, ParameterLib::SpatialPosition const &x, double const dt, typename MechanicsBase< DisplacementDim >::MaterialStateVariables const &material_state_variables) const override
void calculateJacobianBurgers(double const t, ParameterLib::SpatialPosition const &x, double const dt, JacobianMatrix &Jac, double s_eff, const KelvinVector &sig_i, const KelvinVector &eps_K_i, detail::LocalLubby2Properties< DisplacementDim > const &properties) const
Calculates the 18x18 Jacobian.
void calculateResidualBurgers(double const dt, const KelvinVector &strain_curr, const KelvinVector &strain_t, const KelvinVector &stress_curr, const KelvinVector &stress_t, const KelvinVector &strain_Kel_curr, const KelvinVector &strain_Kel_t, const KelvinVector &strain_Max_curr, const KelvinVector &strain_Max_t, ResidualVector &res, detail::LocalLubby2Properties< DisplacementDim > const &properties) const
Calculates the 18x1 residual vector.