From 0e1de58d9960ec7d5082166d93fa291e4499fd74 Mon Sep 17 00:00:00 2001
From: Christoph Lehmann <christoph.lehmann@ufz.de>
Date: Tue, 5 Jul 2016 11:50:43 +0200
Subject: [PATCH] [PL] adapted to extrapolator

---
 ProcessLib/SecondaryVariable.h | 60 ++++++++++++++++++----------------
 1 file changed, 31 insertions(+), 29 deletions(-)

diff --git a/ProcessLib/SecondaryVariable.h b/ProcessLib/SecondaryVariable.h
index bf99e2e4c3f..bf8c23dc0bc 100644
--- a/ProcessLib/SecondaryVariable.h
+++ b/ProcessLib/SecondaryVariable.h
@@ -13,8 +13,12 @@
 #include "BaseLib/ConfigTree.h"
 #include "BaseLib/uniqueInsert.h"
 #include "NumLib/Extrapolation/Extrapolator.h"
+#include "NumLib/Extrapolation/ExtrapolatableElementCollection.h"
 
-namespace NumLib { class LocalToGlobalIndexMap; }
+namespace NumLib
+{
+class LocalToGlobalIndexMap;
+}
 
 namespace ProcessLib
 {
@@ -159,41 +163,39 @@ private:
 
 //! Creates an object that computes a secondary variable via extrapolation
 //! of integration point values.
-template<typename PropertyEnum, typename LocalAssembler>
-SecondaryVariableFunctions
-makeExtrapolator(PropertyEnum const property,
-                 NumLib::Extrapolator<PropertyEnum, LocalAssembler>&
-                 extrapolator,
-                 typename NumLib::Extrapolator<PropertyEnum,
-                     LocalAssembler>::LocalAssemblers const& local_assemblers)
+template <typename LocalAssemblerCollection,
+          typename IntegrationPointValuesMethod>
+SecondaryVariableFunctions makeExtrapolator(
+    NumLib::Extrapolator& extrapolator,
+    LocalAssemblerCollection const& local_assemblers,
+    IntegrationPointValuesMethod integration_point_values_method)
 {
-    static_assert(std::is_base_of<
-         NumLib::Extrapolatable<PropertyEnum>, LocalAssembler>::value,
-        "The passed local assembler type (i.e. the local assembler interface) must"
-        " derive from NumLib::Extrapolatable<>.");
-
-    auto const eval_field = [property, &extrapolator, &local_assemblers](
-            GlobalVector const& /*x*/,
-            NumLib::LocalToGlobalIndexMap const& /*dof_table*/,
-            std::unique_ptr<GlobalVector>& /*result_cache*/
-            ) -> GlobalVector const&
-    {
-        extrapolator.extrapolate(local_assemblers, property);
+    auto const eval_field = [&extrapolator, &local_assemblers,
+                             integration_point_values_method](
+        GlobalVector const& /*x*/,
+        NumLib::LocalToGlobalIndexMap const& /*dof_table*/,
+        std::unique_ptr<GlobalVector> & /*result_cache*/
+        ) -> GlobalVector const& {
+        auto const extrapolatables = NumLib::makeExtrapolatable(
+            local_assemblers, integration_point_values_method);
+        extrapolator.extrapolate(extrapolatables);
         return extrapolator.getNodalValues();
     };
 
-    auto const eval_residuals = [property, &extrapolator, &local_assemblers](
-            GlobalVector const& /*x*/,
-            NumLib::LocalToGlobalIndexMap const& /*dof_table*/,
-            std::unique_ptr<GlobalVector>& /*result_cache*/
-            ) -> GlobalVector const&
-    {
-        extrapolator.calculateResiduals(local_assemblers, property);
+    auto const eval_residuals = [&extrapolator, &local_assemblers,
+                                 integration_point_values_method](
+        GlobalVector const& /*x*/,
+        NumLib::LocalToGlobalIndexMap const& /*dof_table*/,
+        std::unique_ptr<GlobalVector> & /*result_cache*/
+        ) -> GlobalVector const& {
+        auto const extrapolatables = NumLib::makeExtrapolatable(
+            local_assemblers, integration_point_values_method);
+        extrapolator.calculateResiduals(extrapolatables);
         return extrapolator.getElementResiduals();
     };
-    return { eval_field, eval_residuals };
+    return {eval_field, eval_residuals};
 }
 
-} // namespace ProcessLib
+}  // namespace ProcessLib
 
 #endif // PROCESSLIB_SECONDARY_VARIABLE_H
-- 
GitLab