From 1b479c49b9a00c20355d82e5e0b4b3f0bf4aad56 Mon Sep 17 00:00:00 2001
From: Dmitri Naumov <github@naumov.de>
Date: Thu, 16 Jan 2020 13:37:33 +0100
Subject: [PATCH] [MatL] Pass local_coordinate_system to MFront.

---
 .../SolidModels/CreateConstitutiveRelation.cpp       |  2 +-
 MaterialLib/SolidModels/MFront/CreateMFront.cpp      |  9 ++++++++-
 MaterialLib/SolidModels/MFront/CreateMFront.h        |  6 ++++++
 MaterialLib/SolidModels/MFront/MFront.cpp            |  8 ++++++--
 MaterialLib/SolidModels/MFront/MFront.h              | 12 ++++++++----
 Tests/MaterialLib/MFront.cpp                         |  6 +++---
 6 files changed, 32 insertions(+), 11 deletions(-)

diff --git a/MaterialLib/SolidModels/CreateConstitutiveRelation.cpp b/MaterialLib/SolidModels/CreateConstitutiveRelation.cpp
index 87250af2e14..aec10048af8 100644
--- a/MaterialLib/SolidModels/CreateConstitutiveRelation.cpp
+++ b/MaterialLib/SolidModels/CreateConstitutiveRelation.cpp
@@ -75,7 +75,7 @@ createConstitutiveRelation(
     {
 #ifdef OGS_USE_MFRONT
         return MaterialLib::Solids::MFront::createMFront<DisplacementDim>(
-            parameters, config);
+            parameters, local_coordinate_system, config);
 #else   // OGS_USE_MFRONT
         OGS_FATAL(
             "OGS is compiled without MFront support. See OGS_USE_MFRONT CMake "
diff --git a/MaterialLib/SolidModels/MFront/CreateMFront.cpp b/MaterialLib/SolidModels/MFront/CreateMFront.cpp
index fbc223167f3..f60e81d3f5f 100644
--- a/MaterialLib/SolidModels/MFront/CreateMFront.cpp
+++ b/MaterialLib/SolidModels/MFront/CreateMFront.cpp
@@ -55,6 +55,8 @@ namespace MFront
 template <int DisplacementDim>
 std::unique_ptr<MechanicsBase<DisplacementDim>> createMFront(
     std::vector<std::unique_ptr<ParameterLib::ParameterBase>> const& parameters,
+    boost::optional<ParameterLib::CoordinateSystem> const&
+        local_coordinate_system,
     BaseLib::ConfigTree const& config)
 {
     INFO("### MFRONT ########################################################");
@@ -191,7 +193,8 @@ std::unique_ptr<MechanicsBase<DisplacementDim>> createMFront(
     INFO("### MFRONT END ####################################################");
 
     return std::make_unique<MFront<DisplacementDim>>(
-        std::move(behaviour), std::move(material_properties));
+        std::move(behaviour), std::move(material_properties),
+        local_coordinate_system);
 }
 }  // namespace MFront
 }  // namespace Solids
@@ -205,9 +208,13 @@ namespace MFront
 {
 template std::unique_ptr<MechanicsBase<2>> createMFront<2>(
     std::vector<std::unique_ptr<ParameterLib::ParameterBase>> const& parameters,
+    boost::optional<ParameterLib::CoordinateSystem> const&
+        local_coordinate_system,
     BaseLib::ConfigTree const& config);
 template std::unique_ptr<MechanicsBase<3>> createMFront<3>(
     std::vector<std::unique_ptr<ParameterLib::ParameterBase>> const& parameters,
+    boost::optional<ParameterLib::CoordinateSystem> const&
+        local_coordinate_system,
     BaseLib::ConfigTree const& config);
 }  // namespace MFront
 }  // namespace Solids
diff --git a/MaterialLib/SolidModels/MFront/CreateMFront.h b/MaterialLib/SolidModels/MFront/CreateMFront.h
index d5301c95b39..d50fbcb869e 100644
--- a/MaterialLib/SolidModels/MFront/CreateMFront.h
+++ b/MaterialLib/SolidModels/MFront/CreateMFront.h
@@ -25,13 +25,19 @@ namespace MFront
 template <int DisplacementDim>
 std::unique_ptr<MechanicsBase<DisplacementDim>> createMFront(
     std::vector<std::unique_ptr<ParameterLib::ParameterBase>> const& parameters,
+    boost::optional<ParameterLib::CoordinateSystem> const&
+        local_coordinate_system,
     BaseLib::ConfigTree const& config);
 
 extern template std::unique_ptr<MechanicsBase<2>> createMFront<2>(
     std::vector<std::unique_ptr<ParameterLib::ParameterBase>> const& parameters,
+    boost::optional<ParameterLib::CoordinateSystem> const&
+        local_coordinate_system,
     BaseLib::ConfigTree const& config);
 extern template std::unique_ptr<MechanicsBase<3>> createMFront<3>(
     std::vector<std::unique_ptr<ParameterLib::ParameterBase>> const& parameters,
+    boost::optional<ParameterLib::CoordinateSystem> const&
+        local_coordinate_system,
     BaseLib::ConfigTree const& config);
 }  // namespace MFront
 }  // namespace Solids
diff --git a/MaterialLib/SolidModels/MFront/MFront.cpp b/MaterialLib/SolidModels/MFront/MFront.cpp
index e42f0846ece..af4d50973a8 100644
--- a/MaterialLib/SolidModels/MFront/MFront.cpp
+++ b/MaterialLib/SolidModels/MFront/MFront.cpp
@@ -159,9 +159,13 @@ const char* varTypeToString(int v)
 template <int DisplacementDim>
 MFront<DisplacementDim>::MFront(
     mgis::behaviour::Behaviour&& behaviour,
-    std::vector<ParameterLib::Parameter<double> const*>&& material_properties)
+    std::vector<ParameterLib::Parameter<double> const*>&& material_properties,
+    boost::optional<ParameterLib::CoordinateSystem> const&
+        local_coordinate_system)
     : _behaviour(std::move(behaviour)),
-      _material_properties(std::move(material_properties))
+      _material_properties(std::move(material_properties)),
+      _local_coordinate_system(
+          local_coordinate_system ? &local_coordinate_system.get() : nullptr)
 {
     auto const hypothesis = behaviour.hypothesis;
 
diff --git a/MaterialLib/SolidModels/MFront/MFront.h b/MaterialLib/SolidModels/MFront/MFront.h
index c1c36fb7a92..e47f3397708 100644
--- a/MaterialLib/SolidModels/MFront/MFront.h
+++ b/MaterialLib/SolidModels/MFront/MFront.h
@@ -66,11 +66,14 @@ public:
 
     MFront(mgis::behaviour::Behaviour&& behaviour,
            std::vector<ParameterLib::Parameter<double> const*>&&
-               material_properties);
+               material_properties,
+           boost::optional<ParameterLib::CoordinateSystem> const&
+               local_coordinate_system);
 
-    std::unique_ptr<
-        typename MechanicsBase<DisplacementDim>::MaterialStateVariables>
-    createMaterialStateVariables() const override;
+        std::unique_ptr<
+            typename MechanicsBase<DisplacementDim>::
+                MaterialStateVariables> createMaterialStateVariables()
+            const override;
 
     std::optional<std::tuple<KelvinVector,
                              std::unique_ptr<typename MechanicsBase<
@@ -102,6 +105,7 @@ public:
 private:
     mgis::behaviour::Behaviour _behaviour;
     std::vector<ParameterLib::Parameter<double> const*> _material_properties;
+    ParameterLib::CoordinateSystem const* const _local_coordinate_system;
 };
 
 extern template class MFront<2>;
diff --git a/Tests/MaterialLib/MFront.cpp b/Tests/MaterialLib/MFront.cpp
index 83e7a7cf10a..a756a4f9680 100644
--- a/Tests/MaterialLib/MFront.cpp
+++ b/Tests/MaterialLib/MFront.cpp
@@ -53,7 +53,7 @@ struct StandardElasticityBrickBehaviour
             &young_modulus, &poisson_ratio};
 
         auto result = std::make_unique<MFront::MFront<Dim>>(
-            std::move(behaviour), std::move(parameters));
+            std::move(behaviour), std::move(parameters), boost::none);
         return result;
     }
 };
@@ -74,7 +74,7 @@ struct ElasticBehaviour
             &young_modulus, &poisson_ratio};
 
         auto result = std::make_unique<MFront::MFront<Dim>>(
-            std::move(behaviour), std::move(parameters));
+            std::move(behaviour), std::move(parameters), boost::none);
         return result;
     }
 };
@@ -108,7 +108,7 @@ struct MohrCoulombAbboSloanBehaviour
             &tension_cut_off_parameter};
 
         auto result = std::make_unique<MFront::MFront<Dim>>(
-            std::move(behaviour), std::move(parameters));
+            std::move(behaviour), std::move(parameters), boost::none);
         return result;
     }
 };
-- 
GitLab