From 2ef77d984dca60800317fe949fc56778ffc65312 Mon Sep 17 00:00:00 2001 From: Dmitri Naumov <dmitri.naumov@ufz.de> Date: Fri, 1 Feb 2019 19:50:51 +0100 Subject: [PATCH] [MatL] Rewrite MFront states. Avoids mutable memb. --- MaterialLib/SolidModels/MFront/MFront.cpp | 23 ++++++++++++----------- MaterialLib/SolidModels/MFront/MFront.h | 3 +-- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/MaterialLib/SolidModels/MFront/MFront.cpp b/MaterialLib/SolidModels/MFront/MFront.cpp index b8baa8a94e3..2da3ad27ae9 100644 --- a/MaterialLib/SolidModels/MFront/MFront.cpp +++ b/MaterialLib/SolidModels/MFront/MFront.cpp @@ -249,9 +249,10 @@ MFront<DisplacementDim>::integrateStress( { assert( dynamic_cast<MaterialStateVariables const*>(&material_state_variables)); - auto& behaviour_data = - static_cast<MaterialStateVariables const&>(material_state_variables) - ._behaviour_data; + // New state, copy of current one, packed in unique_ptr for return. + auto state = std::make_unique<MaterialStateVariables>( + static_cast<MaterialStateVariables const&>(material_state_variables)); + auto& behaviour_data = state->_behaviour_data; // TODO add a test of material behaviour where the value of dt matters. behaviour_data.dt = dt; @@ -305,14 +306,14 @@ MFront<DisplacementDim>::integrateStress( KelvinMatrix C = MFrontToOGS(Eigen::Map<KelvinMatrix>(behaviour_data.K.data())); - // TODO avoid copying the state - auto state_copy = std::make_unique<MaterialStateVariables>( - static_cast<MaterialStateVariables const&>(material_state_variables)); - std::unique_ptr< - typename MechanicsBase<DisplacementDim>::MaterialStateVariables> - state_upcast(state_copy.release()); - - return {std::make_tuple(std::move(sigma), std::move(state_upcast), std::move(C))}; + return boost::make_optional( + std::make_tuple<typename MFront<DisplacementDim>::KelvinVector, + std::unique_ptr<typename MechanicsBase< + DisplacementDim>::MaterialStateVariables>, + typename MFront<DisplacementDim>::KelvinMatrix>( + std::move(sigma), + std::move(state), + std::move(C))); } template <int DisplacementDim> diff --git a/MaterialLib/SolidModels/MFront/MFront.h b/MaterialLib/SolidModels/MFront/MFront.h index 68e9a480866..78d074825f6 100644 --- a/MaterialLib/SolidModels/MFront/MFront.h +++ b/MaterialLib/SolidModels/MFront/MFront.h @@ -67,8 +67,7 @@ public: return operator=(static_cast<MaterialStateVariables const&>(state)); } - // TODO fix: this has to be mutable. - mutable mgis::behaviour::BehaviourData _behaviour_data; + mgis::behaviour::BehaviourData _behaviour_data; }; using KelvinVector = -- GitLab