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 linear_solver, update_jacobian, update_residual, update_solution,
173 _nonlinear_solver_parameters);
175 auto const success_iterations = newton_solver.solve(K_loc);
177 if (!success_iterations)
185 if (*success_iterations == 0)
187 linear_solver.compute(K_loc);
193 local_lubby2_properties.KM0,
197 double const delta_eps_m_trace = Invariants::trace(eps_m - eps_m_prev);
198 double const sigma_trace_prev = Invariants::trace(sigma_prev);
200 local_lubby2_properties.GM0 * sigd_j +
201 (local_lubby2_properties.KM0 * delta_eps_m_trace +
202 sigma_trace_prev / 3.) *
203 Invariants::identity2;
204 return {std::make_tuple(
227 res.template segment<KelvinVectorSize>(0).noalias() =
228 (stress_curr - stress_t) -
229 2. * ((strain_curr - strain_t) - (strain_Kel_curr - strain_Kel_t) -
230 (strain_Max_curr - strain_Max_t));
233 res.template segment<KelvinVectorSize>(KelvinVectorSize).noalias() =
234 (strain_Kel_curr - strain_Kel_t) -
235 dt / (2. * properties.
etaK) *
236 (properties.
GM0 * stress_curr -
237 2. * properties.
GK * strain_Kel_curr);
240 res.template segment<KelvinVectorSize>(2 * KelvinVectorSize).noalias() =
241 (strain_Max_curr - strain_Max_t) -
242 dt * 0.5 * properties.
GM0 / properties.
etaM * stress_curr;
259 Jac.template block<KelvinVectorSize, KelvinVectorSize>(0, 0)
264 Jac.template block<KelvinVectorSize, KelvinVectorSize>(0, KelvinVectorSize)
269 Jac.template block<KelvinVectorSize, KelvinVectorSize>(0,
270 2 * KelvinVectorSize)
275 Jac.template block<KelvinVectorSize, KelvinVectorSize>(KelvinVectorSize, 0)
277 -0.5 * dt * properties.
GM0 / properties.
etaK * KelvinMatrix::Identity();
281 1. / (properties.
etaK * properties.
etaK) *
282 (properties.
GM0 * sig_i - 2. * properties.
GK * eps_K_i);
285 properties.
GM0 / s_eff * sig_i;
287 properties.
etaK / s_eff * sig_i;
288 Jac.template block<KelvinVectorSize, KelvinVectorSize>(KelvinVectorSize,
290 .noalias() += 0.5 * dt * eps_K_aid * dmu_vK.transpose() +
291 dt / properties.
etaK * eps_K_i * dG_K.transpose();
295 Jac.template block<KelvinVectorSize, KelvinVectorSize>(KelvinVectorSize,
298 .setConstant(1. + dt * properties.
GK / properties.
etaK);
303 Jac.template block<KelvinVectorSize, KelvinVectorSize>(2 * KelvinVectorSize,
306 -0.5 * dt * properties.
GM0 / properties.
etaM * KelvinMatrix::Identity();
310 properties.
etaM / s_eff * sig_i;
311 Jac.template block<KelvinVectorSize, KelvinVectorSize>(
312 2 * KelvinVectorSize, 0)
313 .noalias() += 0.5 * dt * properties.
GM0 /
314 (properties.
etaM * properties.
etaM) * sig_i *
321 Jac.template block<KelvinVectorSize, KelvinVectorSize>(2 * KelvinVectorSize,
322 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.