From a9111fbc057f20b65e5ee0444f7a68c9d41681b2 Mon Sep 17 00:00:00 2001
From: Christoph Lehmann <christoph.lehmann@ufz.de>
Date: Mon, 17 Jul 2017 15:47:35 +0200
Subject: [PATCH] [PL] num_components moved to other class

---
 ProcessLib/CachedSecondaryVariable.cpp |  6 ++--
 ProcessLib/Process.cpp                 | 16 +++++------
 ProcessLib/ProcessOutput.cpp           |  8 +++---
 ProcessLib/SecondaryVariable.cpp       |  9 +++---
 ProcessLib/SecondaryVariable.h         | 39 +++++++++++++++-----------
 5 files changed, 40 insertions(+), 38 deletions(-)

diff --git a/ProcessLib/CachedSecondaryVariable.cpp b/ProcessLib/CachedSecondaryVariable.cpp
index 9627506a13f..052405d37cc 100644
--- a/ProcessLib/CachedSecondaryVariable.cpp
+++ b/ProcessLib/CachedSecondaryVariable.cpp
@@ -36,10 +36,10 @@ SecondaryVariableFunctions CachedSecondaryVariable::getExtrapolator()
         NumLib::LocalToGlobalIndexMap const& dof_table,
         std::unique_ptr<GlobalVector> & /*result_cache*/
         ) -> GlobalVector const& {
-        _extrapolator.calculateResiduals(*_extrapolatables, x, dof_table);
+        _extrapolator.calculateResiduals(1, *_extrapolatables, x, dof_table);
         return _extrapolator.getElementResiduals();
     };
-    return {BaseLib::easyBind(&CachedSecondaryVariable::evalField, this),
+    return {1, BaseLib::easyBind(&CachedSecondaryVariable::evalField, this),
             eval_residuals};
 }
 
@@ -63,7 +63,7 @@ GlobalVector const& CachedSecondaryVariable::evalFieldNoArgs() const
     }
     DBUG("Recomputing %s.", _internal_variable_name.c_str());
     _extrapolator.extrapolate(
-        *_extrapolatables, *_current_solution, *_dof_table);
+        1, *_extrapolatables, *_current_solution, *_dof_table);
     auto const& nodal_values = _extrapolator.getNodalValues();
     MathLib::LinAlg::copy(nodal_values, _cached_nodal_values);
     _needs_recomputation = false;
diff --git a/ProcessLib/Process.cpp b/ProcessLib/Process.cpp
index 25e265394bb..1c78b4e2c65 100644
--- a/ProcessLib/Process.cpp
+++ b/ProcessLib/Process.cpp
@@ -217,16 +217,14 @@ void Process::finishNamedFunctionsInitialization()
     for (auto const& named_function :
          _named_function_caller.getNamedFunctions()) {
         auto const& name = named_function.getName();
-        // secondary variables generated from named functions have the prefix
-        // "fct_".
         _secondary_variables.addSecondaryVariable(
-            "fct_" + name, 1,
-            {BaseLib::easyBind(
-                 &GlobalVectorFromNamedFunction::call,
-                 GlobalVectorFromNamedFunction(
-                     _named_function_caller.getSpecificFunctionCaller(name), _mesh,
-                     getSingleComponentDOFTable(),
-                     _secondary_variable_context)),
+            name,
+            {1, BaseLib::easyBind(
+                    &GlobalVectorFromNamedFunction::call,
+                    GlobalVectorFromNamedFunction(
+                        _named_function_caller.getSpecificFunctionCaller(name),
+                        _mesh, getSingleComponentDOFTable(),
+                        _secondary_variable_context)),
              nullptr});
     }
 }
diff --git a/ProcessLib/ProcessOutput.cpp b/ProcessLib/ProcessOutput.cpp
index 7f90dcacb11..c559372819c 100644
--- a/ProcessLib/ProcessOutput.cpp
+++ b/ProcessLib/ProcessOutput.cpp
@@ -120,9 +120,8 @@ void doProcessOutput(std::string const& file_name,
     // the following section is for the output of secondary variables
 
     auto add_secondary_var = [&](SecondaryVariable const& var,
-                             std::string const& output_name)
-    {
-        assert(var.n_components == 1); // TODO implement other cases
+                                 std::string const& output_name) {
+        assert(var.fcts.num_components == 1);  // TODO implement other cases
 
         {
             DBUG("  secondary variable %s", output_name.c_str());
@@ -135,7 +134,8 @@ void doProcessOutput(std::string const& file_name,
                     var.fcts.eval_field(x, dof_table, result_cache);
 
             // Copy result
-            for (GlobalIndexType i = 0; i < nodal_values.size(); ++i) {
+            for (GlobalIndexType i = 0; i < nodal_values.size(); ++i)
+            {
                 assert(!std::isnan(nodal_values[i]));
                 (*result)[i] = nodal_values[i];
             }
diff --git a/ProcessLib/SecondaryVariable.cpp b/ProcessLib/SecondaryVariable.cpp
index d25ef203220..ccbca39e5bc 100644
--- a/ProcessLib/SecondaryVariable.cpp
+++ b/ProcessLib/SecondaryVariable.cpp
@@ -25,16 +25,15 @@ void SecondaryVariableCollection::addNameMapping(std::string const& internal_nam
 }
 
 void SecondaryVariableCollection::addSecondaryVariable(
-    std::string const& internal_name,
-    const unsigned num_components,
-    SecondaryVariableFunctions&& fcts)
+    std::string const& internal_name, SecondaryVariableFunctions&& fcts)
 {
     if (!_configured_secondary_variables
              .emplace(std::make_pair(
                  internal_name,
                  SecondaryVariable{internal_name /* TODO change */,
-                                   num_components, std::move(fcts)}))
-             .second) {
+                                   std::move(fcts)}))
+             .second)
+    {
         OGS_FATAL(
             "The secondary variable with internal name `%s' has already been "
             "set up.",
diff --git a/ProcessLib/SecondaryVariable.h b/ProcessLib/SecondaryVariable.h
index 0fb68a55dc9..99b7681352e 100644
--- a/ProcessLib/SecondaryVariable.h
+++ b/ProcessLib/SecondaryVariable.h
@@ -43,10 +43,12 @@ struct SecondaryVariableFunctions final
 
     SecondaryVariableFunctions() = default;
 
-    template<typename F1, typename F2>
-    SecondaryVariableFunctions(F1&& eval_field_, F2&& eval_residuals_)
-        : eval_field(std::forward<F1>(eval_field_))
-        , eval_residuals(std::forward<F2>(eval_residuals_))
+    template <typename F1, typename F2>
+    SecondaryVariableFunctions(const unsigned num_components_, F1&& eval_field_,
+                               F2&& eval_residuals_)
+        : num_components(num_components_),
+          eval_field(std::forward<F1>(eval_field_)),
+          eval_residuals(std::forward<F2>(eval_residuals_))
     {
         // Used to detect nasty implicit conversions.
         static_assert(std::is_same<GlobalVector const&,
@@ -66,9 +68,11 @@ struct SecondaryVariableFunctions final
             " to a GlobalVector");
     }
 
-    template<typename F1>
-    SecondaryVariableFunctions(F1&& eval_field_, std::nullptr_t)
-        : eval_field(std::forward<F1>(eval_field_))
+    template <typename F1>
+    SecondaryVariableFunctions(const unsigned num_components_, F1&& eval_field_,
+                               std::nullptr_t)
+        : num_components(num_components_),
+          eval_field(std::forward<F1>(eval_field_))
     {
         // Used to detect nasty implicit conversions.
         static_assert(std::is_same<GlobalVector const&,
@@ -80,15 +84,15 @@ struct SecondaryVariableFunctions final
             " to a GlobalVector");
     }
 
-    Function eval_field;
-    Function eval_residuals;
+    const unsigned num_components;  //!< Number of components of the variable.
+    Function const eval_field;
+    Function const eval_residuals;
 };
 
 //! Stores information about a specific secondary variable
 struct SecondaryVariable final
 {
     std::string const name;      //!< Name of the variable; used, e.g., for output.
-    const unsigned n_components; //!< Number of components of the variable.
 
     //! Functions used for computing the secondary variable.
     SecondaryVariableFunctions fcts;
@@ -106,7 +110,6 @@ public:
      *
      * \param internal_name the tag in the project file associated with this
      * secondary variable.
-     * \param num_components the variable's number of components.
      * \param fcts functions that compute the variable.
      *
      * \note
@@ -115,7 +118,6 @@ public:
      * All other variables are silently ignored.
      */
     void addSecondaryVariable(std::string const& internal_name,
-                              const unsigned num_components,
                               SecondaryVariableFunctions&& fcts);
 
     //! Returns the secondary variable with the given external name.
@@ -147,13 +149,14 @@ private:
  */
 template <typename LocalAssemblerCollection>
 SecondaryVariableFunctions makeExtrapolator(
+    const unsigned num_components,
     NumLib::Extrapolator& extrapolator,
     LocalAssemblerCollection const& local_assemblers,
     typename NumLib::ExtrapolatableLocalAssemblerCollection<
         LocalAssemblerCollection>::IntegrationPointValuesMethod
         integration_point_values_method)
 {
-    auto const eval_field = [&extrapolator, &local_assemblers,
+    auto const eval_field = [num_components, &extrapolator, &local_assemblers,
                              integration_point_values_method](
         GlobalVector const& x,
         NumLib::LocalToGlobalIndexMap const& dof_table,
@@ -161,11 +164,12 @@ SecondaryVariableFunctions makeExtrapolator(
         ) -> GlobalVector const& {
         auto const extrapolatables = NumLib::makeExtrapolatable(
             local_assemblers, integration_point_values_method);
-        extrapolator.extrapolate(extrapolatables, x, dof_table);
+        extrapolator.extrapolate(num_components, extrapolatables, x, dof_table);
         return extrapolator.getNodalValues();
     };
 
-    auto const eval_residuals = [&extrapolator, &local_assemblers,
+    auto const eval_residuals = [num_components, &extrapolator,
+                                 &local_assemblers,
                                  integration_point_values_method](
         GlobalVector const& x,
         NumLib::LocalToGlobalIndexMap const& dof_table,
@@ -173,10 +177,11 @@ SecondaryVariableFunctions makeExtrapolator(
         ) -> GlobalVector const& {
         auto const extrapolatables = NumLib::makeExtrapolatable(
             local_assemblers, integration_point_values_method);
-        extrapolator.calculateResiduals(extrapolatables, x, dof_table);
+        extrapolator.calculateResiduals(num_components, extrapolatables, x,
+                                        dof_table);
         return extrapolator.getElementResiduals();
     };
-    return {eval_field, eval_residuals};
+    return {num_components, eval_field, eval_residuals};
 }
 
 }  // namespace ProcessLib
-- 
GitLab