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