From 3c3aea838f0bb84d283eeee9918ebb7002ab6e95 Mon Sep 17 00:00:00 2001 From: Dmitri Naumov <github@naumov.de> Date: Thu, 15 Sep 2016 00:42:34 +0000 Subject: [PATCH] [MatL]computeConstitutiveRelation returns boolean. On error the function returs false to indicate that the local iterations did not succeed. --- .../SolidModels/LinearElasticIsotropic.h | 3 +- MaterialLib/SolidModels/Lubby2-impl.h | 6 ++-- MaterialLib/SolidModels/Lubby2.h | 2 +- MaterialLib/SolidModels/MechanicsBase.h | 28 +++++++++++-------- .../SmallDeformation/SmallDeformationFEM.h | 7 +++-- 5 files changed, 28 insertions(+), 18 deletions(-) diff --git a/MaterialLib/SolidModels/LinearElasticIsotropic.h b/MaterialLib/SolidModels/LinearElasticIsotropic.h index 063f1f07433..bf2d729c2fc 100644 --- a/MaterialLib/SolidModels/LinearElasticIsotropic.h +++ b/MaterialLib/SolidModels/LinearElasticIsotropic.h @@ -79,7 +79,7 @@ public: { } - void computeConstitutiveRelation( + bool computeConstitutiveRelation( double const t, ProcessLib::SpatialPosition const& x, double const /*dt*/, @@ -97,6 +97,7 @@ public: C.noalias() += 2 * _mp.mu(t, x) * KelvinMatrix::Identity(); sigma.noalias() = sigma_prev + C * (eps - eps_prev); + return true; } private: diff --git a/MaterialLib/SolidModels/Lubby2-impl.h b/MaterialLib/SolidModels/Lubby2-impl.h index 392fd020ede..909029fd66c 100644 --- a/MaterialLib/SolidModels/Lubby2-impl.h +++ b/MaterialLib/SolidModels/Lubby2-impl.h @@ -17,7 +17,7 @@ namespace MaterialLib namespace Solids { template <int DisplacementDim> -void Lubby2<DisplacementDim>::computeConstitutiveRelation( +bool Lubby2<DisplacementDim>::computeConstitutiveRelation( double const t, ProcessLib::SpatialPosition const& x, double const dt, @@ -115,7 +115,7 @@ void Lubby2<DisplacementDim>::computeConstitutiveRelation( auto const success_iterations = newton_solver.solve(K_loc); if (!success_iterations) - OGS_FATAL("The local Newton method did not succeed."); + return false; // If the Newton loop didn't run, the linear solver will not be // initialized. @@ -142,6 +142,8 @@ void Lubby2<DisplacementDim>::computeConstitutiveRelation( auto const& P_sph = Invariants::spherical_projection; C.noalias() = state.GM * dzdE * P_dev + 3. * state.KM * P_sph; + + return true; } template <int DisplacementDim> diff --git a/MaterialLib/SolidModels/Lubby2.h b/MaterialLib/SolidModels/Lubby2.h index e2d8d50672e..2d41b6fc954 100644 --- a/MaterialLib/SolidModels/Lubby2.h +++ b/MaterialLib/SolidModels/Lubby2.h @@ -127,7 +127,7 @@ public: { } - void computeConstitutiveRelation( + bool computeConstitutiveRelation( double const t, ProcessLib::SpatialPosition const& x_position, double const dt, diff --git a/MaterialLib/SolidModels/MechanicsBase.h b/MaterialLib/SolidModels/MechanicsBase.h index 8875291d6fc..7040c53aed8 100644 --- a/MaterialLib/SolidModels/MechanicsBase.h +++ b/MaterialLib/SolidModels/MechanicsBase.h @@ -53,7 +53,9 @@ struct MechanicsBase /// Dynamic size Kelvin vector and matrix wrapper for the polymorphic /// constitutive relation compute function. - void computeConstitutiveRelation( + /// Returns false in case of errors in the computation if Newton iterations + /// did not converge, for example. + bool computeConstitutiveRelation( double const t, ProcessLib::SpatialPosition const& x, double const dt, @@ -76,25 +78,29 @@ struct MechanicsBase KelvinVector sigma_{sigma}; KelvinMatrix C_{C}; - computeConstitutiveRelation(t, - x, - dt, - eps_prev_, - eps_, - sigma_prev_, - sigma_, - C_, - material_state_variables); + bool const result = + computeConstitutiveRelation(t, + x, + dt, + eps_prev_, + eps_, + sigma_prev_, + sigma_, + C_, + material_state_variables); sigma = sigma_; C = C_; + return result; } /// Computation of the constitutive relation for specific material model. /// This should be implemented in the derived model. Fixed Kelvin vector and /// matrix size version; for dynamic size arguments there is an overloaded /// wrapper function. - virtual void computeConstitutiveRelation( + /// Returns false in case of errors in the computation if Newton iterations + /// did not converge, for example. + virtual bool computeConstitutiveRelation( double const t, ProcessLib::SpatialPosition const& x, double const dt, diff --git a/ProcessLib/SmallDeformation/SmallDeformationFEM.h b/ProcessLib/SmallDeformation/SmallDeformationFEM.h index eed4503422d..01cb3ab818c 100644 --- a/ProcessLib/SmallDeformation/SmallDeformationFEM.h +++ b/ProcessLib/SmallDeformation/SmallDeformationFEM.h @@ -234,9 +234,10 @@ public: Eigen::Map<typename BMatricesType::NodalForceVectorType const>( local_x.data(), ShapeFunction::NPOINTS * DisplacementDim); - _ip_data[ip]._solid_material.computeConstitutiveRelation( - t, x_position, _process_data.dt, eps_prev, eps, sigma_prev, - sigma, C, material_state_variables); + if (!_ip_data[ip]._solid_material.computeConstitutiveRelation( + t, x_position, _process_data.dt, eps_prev, eps, sigma_prev, + sigma, C, material_state_variables)) + OGS_FATAL("Computation of local constitutive relation failed."); local_b.noalias() -= B.transpose() * sigma * detJ * wp.getWeight(); local_Jac.noalias() += -- GitLab