74 material_state_variables)
const
76 auto const& eps_m = std::get<MPL::SymmetricTensor<DisplacementDim>>(
78 auto const& eps_m_prev = std::get<MPL::SymmetricTensor<DisplacementDim>>(
80 auto const& sigma_prev = std::get<MPL::SymmetricTensor<DisplacementDim>>(
81 variable_array_prev.
stress);
86 &material_state_variables) !=
nullptr);
91 auto local_lubby2_properties =
95 auto const& P_dev = Invariants::deviatoric_projection;
102 KelvinVector sigd_t = P_dev * sigma_prev / local_lubby2_properties.GM0;
105 double sig_eff = Invariants::equivalentStress(sigd_j);
106 local_lubby2_properties.update(sig_eff);
108 using LocalJacobianMatrix =
114 Eigen::FullPivLU<LocalJacobianMatrix> linear_solver;
127 LocalJacobianMatrix K_loc;
129 using LocalResidualVector =
130 Eigen::Matrix<double, KelvinVectorSize * 3, 1>;
132 auto const update_residual = [&](LocalResidualVector& residual)
137 local_lubby2_properties);
140 auto const update_jacobian = [&](LocalJacobianMatrix& jacobian)
143 t, x, dt, jacobian, sig_eff, sigd_j, state.
eps_K_j,
144 local_lubby2_properties);
147 auto const update_solution = [&](LocalResidualVector
const& increment)
150 sigd_j.noalias() += increment.template segment<KelvinVectorSize>(
162 local_lubby2_properties.update(sig_eff);
166 linear_solver, update_jacobian, update_residual, update_solution,
169 auto const success_iterations = newton_solver.solve(K_loc);
171 if (!success_iterations)
179 if (*success_iterations == 0)
181 linear_solver.compute(K_loc);
187 local_lubby2_properties.KM0,
191 double const delta_eps_m_trace = Invariants::trace(eps_m - eps_m_prev);
192 double const sigma_trace_prev = Invariants::trace(sigma_prev);
194 local_lubby2_properties.GM0 * sigd_j +
195 (local_lubby2_properties.KM0 * delta_eps_m_trace +
196 sigma_trace_prev / 3.) *
197 Invariants::identity2;
198 return {std::make_tuple(
221 res.template segment<KelvinVectorSize>(0).noalias() =
222 (stress_curr - stress_t) -
223 2. * ((strain_curr - strain_t) - (strain_Kel_curr - strain_Kel_t) -
224 (strain_Max_curr - strain_Max_t));
228 (strain_Kel_curr - strain_Kel_t) -
229 dt / (2. * properties.
etaK) *
230 (properties.
GM0 * stress_curr -
231 2. * properties.
GK * strain_Kel_curr);
235 (strain_Max_curr - strain_Max_t) -
236 dt * 0.5 * properties.
GM0 / properties.
etaM * stress_curr;
253 Jac.template block<KelvinVectorSize, KelvinVectorSize>(0, 0)
263 Jac.template block<KelvinVectorSize, KelvinVectorSize>(0,
271 -0.5 * dt * properties.
GM0 / properties.
etaK * KelvinMatrix::Identity();
275 1. / (properties.
etaK * properties.
etaK) *
276 (properties.
GM0 * sig_i - 2. * properties.
GK * eps_K_i);
279 properties.
GM0 / s_eff * sig_i;
281 properties.
etaK / s_eff * sig_i;
284 .noalias() += 0.5 * dt * eps_K_aid * dmu_vK.transpose() +
285 dt / properties.
etaK * eps_K_i * dG_K.transpose();
292 .setConstant(1. + dt * properties.
GK / properties.
etaK);
297 Jac.template block<KelvinVectorSize, KelvinVectorSize>(2 *
KelvinVectorSize,
300 -0.5 * dt * properties.
GM0 / properties.
etaM * KelvinMatrix::Identity();
304 properties.
etaM / s_eff * sig_i;
305 Jac.template block<KelvinVectorSize, KelvinVectorSize>(
307 .noalias() += 0.5 * dt * properties.
GM0 /
308 (properties.
etaM * properties.
etaM) * sig_i *
315 Jac.template block<KelvinVectorSize, KelvinVectorSize>(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.