From 40d85cbef37debaa2443c94a985aa6bb859df69f Mon Sep 17 00:00:00 2001
From: "Dmitry Yu. Naumov" <github@naumov.de>
Date: Fri, 9 Nov 2018 17:10:52 +0100
Subject: [PATCH] [PL] PF; MaterialIDs based solid models.

---
 .../PhaseField/CreatePhaseFieldProcess.cpp    | 45 +++++--------------
 ProcessLib/PhaseField/PhaseFieldFEM.h         | 20 +++++++--
 ProcessLib/PhaseField/PhaseFieldProcessData.h | 36 +++++++--------
 3 files changed, 43 insertions(+), 58 deletions(-)

diff --git a/ProcessLib/PhaseField/CreatePhaseFieldProcess.cpp b/ProcessLib/PhaseField/CreatePhaseFieldProcess.cpp
index 1d019588127..63dad638ad6 100644
--- a/ProcessLib/PhaseField/CreatePhaseFieldProcess.cpp
+++ b/ProcessLib/PhaseField/CreatePhaseFieldProcess.cpp
@@ -11,9 +11,10 @@
 
 #include <cassert>
 
-#include "MaterialLib/SolidModels/CreateLinearElasticIsotropic.h"
-#include "MaterialLib/SolidModels/LinearElasticIsotropicPhaseField.h"
+#include "MaterialLib/SolidModels/CreateConstitutiveRelation.h"
+#include "MaterialLib/SolidModels/MechanicsBase.h"
 #include "ProcessLib/Output/CreateSecondaryVariables.h"
+#include "ProcessLib/Utils/ProcessUtils.h"
 
 #include "PhaseFieldProcess.h"
 #include "PhaseFieldProcessData.h"
@@ -99,40 +100,14 @@ std::unique_ptr<Process> createPhaseFieldProcess(
             variable_ph->getNumberOfComponents());
     }
 
-    // Constitutive relation.
-    // read type;
-    auto const constitutive_relation_config =
-        //! \ogs_file_param{prj__processes__process__PHASE_FIELD__constitutive_relation}
-        config.getConfigSubtree("constitutive_relation");
+    auto solid_constitutive_relations =
+        MaterialLib::Solids::createConstitutiveRelations<DisplacementDim>(
+            parameters, config);
 
     auto const phasefield_parameters_config =
         //! \ogs_file_param{prj__processes__process__PHASE_FIELD__phasefield_parameters}
         config.getConfigSubtree("phasefield_parameters");
 
-    auto const type =
-        //! \ogs_file_param{prj__processes__process__PHASE_FIELD__constitutive_relation__type}
-        constitutive_relation_config.peekConfigParameter<std::string>("type");
-
-    std::unique_ptr<MaterialLib::Solids::PhaseFieldExtension<DisplacementDim>>
-        material = nullptr;
-    if (type == "LinearElasticIsotropic")
-    {
-        const bool skip_type_checking = false;
-        auto elastic_model =
-            MaterialLib::Solids::createLinearElasticIsotropic<DisplacementDim>(
-                parameters, constitutive_relation_config, skip_type_checking);
-        material = std::make_unique<
-            MaterialLib::Solids::LinearElasticIsotropicPhaseField<
-                DisplacementDim>>(
-            std::move(elastic_model->getMaterialProperties()));
-    }
-    else
-    {
-        OGS_FATAL(
-            "Cannot construct constitutive relation of given type \'%s\'.",
-            type.c_str());
-    }
-
     // Residual stiffness
     auto& residual_stiffness = findParameter<double>(
         phasefield_parameters_config,
@@ -212,9 +187,11 @@ std::unique_ptr<Process> createPhaseFieldProcess(
          ((*crack_scheme == "propagating") || (*crack_scheme == "static")));
 
     PhaseFieldProcessData<DisplacementDim> process_data{
-        std::move(material), residual_stiffness,  crack_resistance,
-        crack_length_scale,  kinetic_coefficient, solid_density,
-        history_field,       specific_body_force, propagating_crack,
+        materialIDs(mesh),   std::move(solid_constitutive_relations),
+        residual_stiffness,  crack_resistance,
+        crack_length_scale,  kinetic_coefficient,
+        solid_density,       history_field,
+        specific_body_force, propagating_crack,
         crack_pressure};
 
     SecondaryVariableCollection secondary_variables;
diff --git a/ProcessLib/PhaseField/PhaseFieldFEM.h b/ProcessLib/PhaseField/PhaseFieldFEM.h
index d8baae92313..ec85389e166 100644
--- a/ProcessLib/PhaseField/PhaseFieldFEM.h
+++ b/ProcessLib/PhaseField/PhaseFieldFEM.h
@@ -12,7 +12,9 @@
 #include <memory>
 #include <vector>
 
-#include "MaterialLib/SolidModels/PhaseFieldExtension.h"
+#include "MaterialLib/SolidModels/LinearElasticIsotropic.h"
+#include "MaterialLib/SolidModels/LinearElasticIsotropicPhaseField.h"
+#include "MaterialLib/SolidModels/SelectSolidConstitutiveRelation.h"
 #include "MathLib/LinAlg/Eigen/EigenMapTools.h"
 #include "NumLib/Fem/FiniteElement/TemplateIsoparametric.h"
 #include "NumLib/Fem/ShapeMatrixPolicy.h"
@@ -126,6 +128,19 @@ public:
         _ip_data.reserve(n_integration_points);
         _secondary_data.N.resize(n_integration_points);
 
+        auto& solid_material =
+            MaterialLib::Solids::selectSolidConstitutiveRelation(
+                _process_data.solid_materials,
+                _process_data.material_ids,
+                e.getID());
+        if (!dynamic_cast<MaterialLib::Solids::LinearElasticIsotropic<
+                DisplacementDim> const*>(&solid_material))
+        {
+            OGS_FATAL(
+                "For phasefield process only linear elastic solid material "
+                "support is implemented.");
+        }
+
         auto const shape_matrices =
             initShapeMatrices<ShapeFunction, ShapeMatricesType,
                               IntegrationMethod, DisplacementDim>(
@@ -136,8 +151,7 @@ public:
 
         for (unsigned ip = 0; ip < n_integration_points; ip++)
         {
-            // displacement (subscript u)
-            _ip_data.emplace_back(*_process_data.material);
+            _ip_data.emplace_back(solid_material);
             auto& ip_data = _ip_data[ip];
             ip_data.integration_weight =
                 _integration_method.getWeightedPoint(ip).getWeight() *
diff --git a/ProcessLib/PhaseField/PhaseFieldProcessData.h b/ProcessLib/PhaseField/PhaseFieldProcessData.h
index 75fdace0717..069c0dc3254 100644
--- a/ProcessLib/PhaseField/PhaseFieldProcessData.h
+++ b/ProcessLib/PhaseField/PhaseFieldProcessData.h
@@ -33,8 +33,11 @@ template <int DisplacementDim>
 struct PhaseFieldProcessData
 {
     PhaseFieldProcessData(
-        std::unique_ptr<MaterialLib::Solids::MechanicsBase<DisplacementDim>>&&
-            material_,
+        MeshLib::PropertyVector<int> const* const material_ids_,
+        std::map<int,
+                 std::unique_ptr<
+                     MaterialLib::Solids::MechanicsBase<DisplacementDim>>>&&
+            solid_materials_,
         Parameter<double> const& residual_stiffness_,
         Parameter<double> const& crack_resistance_,
         Parameter<double> const& crack_length_scale_,
@@ -42,8 +45,10 @@ struct PhaseFieldProcessData
         Parameter<double> const& solid_density_,
         Parameter<double>& history_field_,
         Eigen::Matrix<double, DisplacementDim, 1> const& specific_body_force_,
-        bool propagating_crack_, bool crack_pressure_)
-        : material{std::move(material_)},
+        bool const propagating_crack_,
+        bool const crack_pressure_)
+        : material_ids(material_ids_),
+          solid_materials{std::move(solid_materials_)},
           residual_stiffness(residual_stiffness_),
           crack_resistance(crack_resistance_),
           crack_length_scale(crack_length_scale_),
@@ -56,21 +61,7 @@ struct PhaseFieldProcessData
     {
     }
 
-    PhaseFieldProcessData(PhaseFieldProcessData&& other)
-        : material{std::move(other.material)},
-          residual_stiffness(other.residual_stiffness),
-          crack_resistance(other.crack_resistance),
-          crack_length_scale(other.crack_length_scale),
-          kinetic_coefficient(other.kinetic_coefficient),
-          solid_density(other.solid_density),
-          history_field(other.history_field),
-          specific_body_force(other.specific_body_force),
-          dt(other.dt),
-          t(other.t),
-          propagating_crack(other.propagating_crack),
-          crack_pressure(other.crack_pressure)
-    {
-    }
+    PhaseFieldProcessData(PhaseFieldProcessData&& other) = default;
 
     //! Copies are forbidden.
     PhaseFieldProcessData(PhaseFieldProcessData const&) = delete;
@@ -81,8 +72,11 @@ struct PhaseFieldProcessData
     //! Assignments are not needed.
     void operator=(PhaseFieldProcessData&&) = delete;
 
-    std::unique_ptr<MaterialLib::Solids::MechanicsBase<DisplacementDim>>
-        material;
+    MeshLib::PropertyVector<int> const* const material_ids;
+
+    std::map<int, std::unique_ptr<
+                      MaterialLib::Solids::MechanicsBase<DisplacementDim>>>
+        solid_materials;
     Parameter<double> const& residual_stiffness;
     Parameter<double> const& crack_resistance;
     Parameter<double> const& crack_length_scale;
-- 
GitLab