From f2b8eb89f528d8e6e5e37b31565864773fc435b4 Mon Sep 17 00:00:00 2001
From: Dmitri Naumov <github@naumov.de>
Date: Wed, 30 Aug 2017 00:08:16 +0200
Subject: [PATCH] [PL] TM: Split TMProcess-impl.h.

---
 .../ThermoMechanicsProcess-impl.h             | 204 ++++++++++++++++++
 .../ThermoMechanicsProcess.cpp                |   1 +
 .../ThermoMechanics/ThermoMechanicsProcess.h  | 157 +-------------
 3 files changed, 215 insertions(+), 147 deletions(-)
 create mode 100644 ProcessLib/ThermoMechanics/ThermoMechanicsProcess-impl.h

diff --git a/ProcessLib/ThermoMechanics/ThermoMechanicsProcess-impl.h b/ProcessLib/ThermoMechanics/ThermoMechanicsProcess-impl.h
new file mode 100644
index 00000000000..25fc9223234
--- /dev/null
+++ b/ProcessLib/ThermoMechanics/ThermoMechanicsProcess-impl.h
@@ -0,0 +1,204 @@
+/**
+ * \file
+ *
+ * \copyright
+ * Copyright (c) 2012-2017, OpenGeoSys Community (http://www.opengeosys.org)
+ *            Distributed under a Modified BSD License.
+ *              See accompanying file LICENSE.txt or
+ *              http://www.opengeosys.org/project/license
+ *
+ */
+
+#pragma once
+
+#include <cassert>
+
+#include "BaseLib/Functional.h"
+#include "ProcessLib/SmallDeformation/CreateLocalAssemblers.h"
+
+#include "ThermoMechanicsFEM.h"
+
+namespace ProcessLib
+{
+namespace ThermoMechanics
+{
+template <int DisplacementDim>
+ThermoMechanicsProcess<DisplacementDim>::ThermoMechanicsProcess(
+    MeshLib::Mesh& mesh,
+    std::unique_ptr<ProcessLib::AbstractJacobianAssembler>&& jacobian_assembler,
+    std::vector<std::unique_ptr<ParameterBase>> const& parameters,
+    unsigned const integration_order,
+    std::vector<std::reference_wrapper<ProcessVariable>>&& process_variables,
+    ThermoMechanicsProcessData<DisplacementDim>&& process_data,
+    SecondaryVariableCollection&& secondary_variables,
+    NumLib::NamedFunctionCaller&& named_function_caller)
+    : Process(mesh, std::move(jacobian_assembler), parameters,
+              integration_order, std::move(process_variables),
+              std::move(secondary_variables), std::move(named_function_caller)),
+      _process_data(std::move(process_data))
+{
+}
+
+template <int DisplacementDim>
+bool ThermoMechanicsProcess<DisplacementDim>::isLinear() const
+{
+    return false;
+}
+
+template <int DisplacementDim>
+void ThermoMechanicsProcess<DisplacementDim>::initializeConcreteProcess(
+    NumLib::LocalToGlobalIndexMap const& dof_table,
+    MeshLib::Mesh const& mesh,
+    unsigned const integration_order)
+{
+    ProcessLib::SmallDeformation::createLocalAssemblers<
+        DisplacementDim, ThermoMechanicsLocalAssembler>(
+        mesh.getElements(), dof_table, _local_assemblers,
+        mesh.isAxiallySymmetric(), integration_order, _process_data);
+
+    // TODO move the two data members somewhere else.
+    // for extrapolation of secondary variables
+    std::vector<MeshLib::MeshSubsets> all_mesh_subsets_single_component;
+    all_mesh_subsets_single_component.emplace_back(
+        _mesh_subset_all_nodes.get());
+    _local_to_global_index_map_single_component.reset(
+        new NumLib::LocalToGlobalIndexMap(
+            std::move(all_mesh_subsets_single_component),
+            // by location order is needed for output
+            NumLib::ComponentOrder::BY_LOCATION));
+
+    Base::_secondary_variables.addSecondaryVariable(
+        "sigma_xx",
+        makeExtrapolator(
+            1, getExtrapolator(), _local_assemblers,
+            &ThermoMechanicsLocalAssemblerInterface::getIntPtSigmaXX));
+
+    Base::_secondary_variables.addSecondaryVariable(
+        "sigma_yy",
+        makeExtrapolator(
+            1, getExtrapolator(), _local_assemblers,
+            &ThermoMechanicsLocalAssemblerInterface::getIntPtSigmaYY));
+
+    Base::_secondary_variables.addSecondaryVariable(
+        "sigma_zz",
+        makeExtrapolator(
+            1, getExtrapolator(), _local_assemblers,
+            &ThermoMechanicsLocalAssemblerInterface::getIntPtSigmaZZ));
+
+    Base::_secondary_variables.addSecondaryVariable(
+        "sigma_xy",
+        makeExtrapolator(
+            1, getExtrapolator(), _local_assemblers,
+            &ThermoMechanicsLocalAssemblerInterface::getIntPtSigmaXY));
+
+    if (DisplacementDim == 3)
+    {
+        Base::_secondary_variables.addSecondaryVariable(
+            "sigma_xz",
+            makeExtrapolator(
+                1, getExtrapolator(), _local_assemblers,
+                &ThermoMechanicsLocalAssemblerInterface::getIntPtSigmaXZ));
+
+        Base::_secondary_variables.addSecondaryVariable(
+            "sigma_yz",
+            makeExtrapolator(
+                1, getExtrapolator(), _local_assemblers,
+                &ThermoMechanicsLocalAssemblerInterface::getIntPtSigmaYZ));
+    }
+    Base::_secondary_variables.addSecondaryVariable(
+        "epsilon_xx",
+        makeExtrapolator(
+            1, getExtrapolator(), _local_assemblers,
+            &ThermoMechanicsLocalAssemblerInterface::getIntPtEpsilonXX));
+
+    Base::_secondary_variables.addSecondaryVariable(
+        "epsilon_yy",
+        makeExtrapolator(
+            1, getExtrapolator(), _local_assemblers,
+            &ThermoMechanicsLocalAssemblerInterface::getIntPtEpsilonYY));
+
+    Base::_secondary_variables.addSecondaryVariable(
+        "epsilon_zz",
+        makeExtrapolator(
+            1, getExtrapolator(), _local_assemblers,
+            &ThermoMechanicsLocalAssemblerInterface::getIntPtEpsilonZZ));
+
+    Base::_secondary_variables.addSecondaryVariable(
+        "epsilon_xy",
+        makeExtrapolator(
+            1, getExtrapolator(), _local_assemblers,
+            &ThermoMechanicsLocalAssemblerInterface::getIntPtEpsilonXY));
+    if (DisplacementDim == 3)
+    {
+        Base::_secondary_variables.addSecondaryVariable(
+            "epsilon_yz",
+            makeExtrapolator(
+                1, getExtrapolator(), _local_assemblers,
+                &ThermoMechanicsLocalAssemblerInterface::getIntPtEpsilonYZ));
+
+        Base::_secondary_variables.addSecondaryVariable(
+            "epsilon_xz",
+            makeExtrapolator(
+                1, getExtrapolator(), _local_assemblers,
+                &ThermoMechanicsLocalAssemblerInterface::getIntPtEpsilonXZ));
+    }
+}
+
+template <int DisplacementDim>
+void ThermoMechanicsProcess<DisplacementDim>::assembleConcreteProcess(
+    const double t, GlobalVector const& x, GlobalMatrix& M, GlobalMatrix& K,
+    GlobalVector& b)
+{
+    DBUG("Assemble ThermoMechanicsProcess.");
+
+    // Call global assembler for each local assembly item.
+    GlobalExecutor::executeMemberDereferenced(
+        _global_assembler, &VectorMatrixAssembler::assemble, _local_assemblers,
+        *_local_to_global_index_map, t, x, M, K, b, _coupling_term);
+}
+
+template <int DisplacementDim>
+void ThermoMechanicsProcess<DisplacementDim>::
+    assembleWithJacobianConcreteProcess(const double t, GlobalVector const& x,
+                                        GlobalVector const& xdot,
+                                        const double dxdot_dx,
+                                        const double dx_dx, GlobalMatrix& M,
+                                        GlobalMatrix& K, GlobalVector& b,
+                                        GlobalMatrix& Jac)
+{
+    DBUG("AssembleJacobian ThermoMechanicsProcess.");
+
+    // Call global assembler for each local assembly item.
+    GlobalExecutor::executeMemberDereferenced(
+        _global_assembler, &VectorMatrixAssembler::assembleWithJacobian,
+        _local_assemblers, *_local_to_global_index_map, t, x, xdot, dxdot_dx,
+        dx_dx, M, K, b, Jac, _coupling_term);
+}
+
+template <int DisplacementDim>
+void ThermoMechanicsProcess<DisplacementDim>::preTimestepConcreteProcess(
+    GlobalVector const& x, double const t, double const dt)
+{
+    DBUG("PreTimestep ThermoMechanicsProcess.");
+
+    _process_data.dt = dt;
+    _process_data.t = t;
+
+    GlobalExecutor::executeMemberOnDereferenced(
+        &ThermoMechanicsLocalAssemblerInterface::preTimestep, _local_assemblers,
+        *_local_to_global_index_map, x, t, dt);
+}
+
+template <int DisplacementDim>
+void ThermoMechanicsProcess<DisplacementDim>::postTimestepConcreteProcess(
+    GlobalVector const& x)
+{
+    DBUG("PostTimestep ThermoMechanicsProcess.");
+
+    GlobalExecutor::executeMemberOnDereferenced(
+        &ThermoMechanicsLocalAssemblerInterface::postTimestep,
+        _local_assemblers, *_local_to_global_index_map, x);
+}
+
+}  // namespace ThermoMechanics
+}  // namespace ProcessLib
diff --git a/ProcessLib/ThermoMechanics/ThermoMechanicsProcess.cpp b/ProcessLib/ThermoMechanics/ThermoMechanicsProcess.cpp
index d13a871acbc..9b391011d73 100644
--- a/ProcessLib/ThermoMechanics/ThermoMechanicsProcess.cpp
+++ b/ProcessLib/ThermoMechanics/ThermoMechanicsProcess.cpp
@@ -8,6 +8,7 @@
  */
 
 #include "ThermoMechanicsProcess.h"
+#include "ThermoMechanicsProcess-impl.h"
 
 namespace ProcessLib
 {
diff --git a/ProcessLib/ThermoMechanics/ThermoMechanicsProcess.h b/ProcessLib/ThermoMechanics/ThermoMechanicsProcess.h
index e0d9339821f..23f8d0552cc 100644
--- a/ProcessLib/ThermoMechanics/ThermoMechanicsProcess.h
+++ b/ProcessLib/ThermoMechanics/ThermoMechanicsProcess.h
@@ -9,11 +9,7 @@
 
 #pragma once
 
-#include <cassert>
-
-#include "NumLib/DOF/DOFTableUtil.h"
 #include "ProcessLib/Process.h"
-#include "ProcessLib/SmallDeformation/CreateLocalAssemblers.h"
 
 #include "ThermoMechanicsFEM.h"
 #include "ThermoMechanicsProcessData.h"
@@ -38,19 +34,11 @@ public:
             process_variables,
         ThermoMechanicsProcessData<DisplacementDim>&& process_data,
         SecondaryVariableCollection&& secondary_variables,
-        NumLib::NamedFunctionCaller&& named_function_caller)
-        : Process(mesh, std::move(jacobian_assembler), parameters,
-                  integration_order, std::move(process_variables),
-                  std::move(secondary_variables),
-                  std::move(named_function_caller)),
-          _process_data(std::move(process_data))
-    {
-    }
+        NumLib::NamedFunctionCaller&& named_function_caller);
 
     //! \name ODESystem interface
     //! @{
-
-    bool isLinear() const override { return false; }
+    bool isLinear() const override;
     //! @}
 
 private:
@@ -59,149 +47,21 @@ private:
     void initializeConcreteProcess(
         NumLib::LocalToGlobalIndexMap const& dof_table,
         MeshLib::Mesh const& mesh,
-        unsigned const integration_order) override
-    {
-        ProcessLib::SmallDeformation::createLocalAssemblers<
-        DisplacementDim, ThermoMechanicsLocalAssembler>(
-        mesh.getElements(), dof_table, _local_assemblers,
-        mesh.isAxiallySymmetric(), integration_order, _process_data);
-
-        // TODO move the two data members somewhere else.
-        // for extrapolation of secondary variables
-        std::vector<MeshLib::MeshSubsets> all_mesh_subsets_single_component;
-        all_mesh_subsets_single_component.emplace_back(
-            _mesh_subset_all_nodes.get());
-        _local_to_global_index_map_single_component.reset(
-            new NumLib::LocalToGlobalIndexMap(
-                std::move(all_mesh_subsets_single_component),
-                // by location order is needed for output
-                NumLib::ComponentOrder::BY_LOCATION));
-
-        Base::_secondary_variables.addSecondaryVariable(
-            "sigma_xx",
-            makeExtrapolator(
-                1, getExtrapolator(), _local_assemblers,
-                &ThermoMechanicsLocalAssemblerInterface::getIntPtSigmaXX));
-
-        Base::_secondary_variables.addSecondaryVariable(
-            "sigma_yy",
-            makeExtrapolator(
-                1, getExtrapolator(), _local_assemblers,
-                &ThermoMechanicsLocalAssemblerInterface::getIntPtSigmaYY));
-
-        Base::_secondary_variables.addSecondaryVariable(
-            "sigma_zz",
-            makeExtrapolator(
-                1, getExtrapolator(), _local_assemblers,
-                &ThermoMechanicsLocalAssemblerInterface::getIntPtSigmaZZ));
-
-        Base::_secondary_variables.addSecondaryVariable(
-            "sigma_xy",
-            makeExtrapolator(
-                1, getExtrapolator(), _local_assemblers,
-                &ThermoMechanicsLocalAssemblerInterface::getIntPtSigmaXY));
-
-        if (DisplacementDim == 3)
-        {
-            Base::_secondary_variables.addSecondaryVariable(
-                "sigma_xz",
-                makeExtrapolator(
-                    1, getExtrapolator(), _local_assemblers,
-                    &ThermoMechanicsLocalAssemblerInterface::getIntPtSigmaXZ));
-
-            Base::_secondary_variables.addSecondaryVariable(
-                "sigma_yz",
-                makeExtrapolator(
-                    1, getExtrapolator(), _local_assemblers,
-                    &ThermoMechanicsLocalAssemblerInterface::getIntPtSigmaYZ));
-        }
-        Base::_secondary_variables.addSecondaryVariable(
-            "epsilon_xx",
-            makeExtrapolator(
-                1, getExtrapolator(), _local_assemblers,
-                &ThermoMechanicsLocalAssemblerInterface::getIntPtEpsilonXX));
-
-        Base::_secondary_variables.addSecondaryVariable(
-            "epsilon_yy",
-            makeExtrapolator(
-                1, getExtrapolator(), _local_assemblers,
-                &ThermoMechanicsLocalAssemblerInterface::getIntPtEpsilonYY));
-
-        Base::_secondary_variables.addSecondaryVariable(
-            "epsilon_zz",
-            makeExtrapolator(
-                1, getExtrapolator(), _local_assemblers,
-                &ThermoMechanicsLocalAssemblerInterface::getIntPtEpsilonZZ));
-
-        Base::_secondary_variables.addSecondaryVariable(
-            "epsilon_xy",
-            makeExtrapolator(
-                1, getExtrapolator(), _local_assemblers,
-                &ThermoMechanicsLocalAssemblerInterface::getIntPtEpsilonXY));
-        if (DisplacementDim == 3)
-        {
-            Base::_secondary_variables.addSecondaryVariable(
-                "epsilon_yz",
-                makeExtrapolator(1, getExtrapolator(), _local_assemblers,
-                                 &ThermoMechanicsLocalAssemblerInterface::
-                                     getIntPtEpsilonYZ));
-
-            Base::_secondary_variables.addSecondaryVariable(
-                "epsilon_xz",
-                makeExtrapolator(1, getExtrapolator(), _local_assemblers,
-                                 &ThermoMechanicsLocalAssemblerInterface::
-                                     getIntPtEpsilonXZ));
-        }
-    }
+        unsigned const integration_order) override;
 
     void assembleConcreteProcess(
         const double t, GlobalVector const& x, GlobalMatrix& M, GlobalMatrix& K,
-        GlobalVector& b) override
-    {
-        DBUG("Assemble ThermoMechanicsProcess.");
-
-        // Call global assembler for each local assembly item.
-        GlobalExecutor::executeMemberDereferenced(
-            _global_assembler, &VectorMatrixAssembler::assemble,
-            _local_assemblers, *_local_to_global_index_map, t, x, M, K, b,
-            _coupling_term);
-    }
+        GlobalVector& b) override;
 
     void assembleWithJacobianConcreteProcess(
         const double t, GlobalVector const& x, GlobalVector const& xdot,
         const double dxdot_dx, const double dx_dx, GlobalMatrix& M,
-        GlobalMatrix& K, GlobalVector& b, GlobalMatrix& Jac) override
-    {
-        DBUG("AssembleJacobian ThermoMechanicsProcess.");
-
-        // Call global assembler for each local assembly item.
-        GlobalExecutor::executeMemberDereferenced(
-            _global_assembler, &VectorMatrixAssembler::assembleWithJacobian,
-            _local_assemblers, *_local_to_global_index_map, t, x, xdot,
-            dxdot_dx, dx_dx, M, K, b, Jac, _coupling_term);
-    }
+        GlobalMatrix& K, GlobalVector& b, GlobalMatrix& Jac) override;
 
     void preTimestepConcreteProcess(GlobalVector const& x, double const t,
-                                    double const dt) override
-    {
-        DBUG("PreTimestep ThermoMechanicsProcess.");
+                                    double const dt) override;
 
-        _process_data.dt = dt;
-        _process_data.t = t;
-
-        GlobalExecutor::executeMemberOnDereferenced(
-            &ThermoMechanicsLocalAssemblerInterface::preTimestep,
-            _local_assemblers, *_local_to_global_index_map, x, t, dt);
-    }
-
-    void postTimestepConcreteProcess(GlobalVector const& x) override
-    {
-        DBUG("PostTimestep ThermoMechanicsProcess.");
-
-        GlobalExecutor::executeMemberOnDereferenced(
-            &ThermoMechanicsLocalAssemblerInterface::postTimestep,
-            _local_assemblers, *_local_to_global_index_map, x);
-    }
+    void postTimestepConcreteProcess(GlobalVector const& x) override;
 
 private:
     std::vector<MeshLib::Node*> _base_nodes;
@@ -214,5 +74,8 @@ private:
         _local_to_global_index_map_single_component;
 };
 
+extern template class ThermoMechanicsProcess<2>;
+extern template class ThermoMechanicsProcess<3>;
+
 }  // namespace ThermoMechanics
 }  // namespace ProcessLib
-- 
GitLab