From 8b1205e1c6bbf8bb819a250e698531c81977197d Mon Sep 17 00:00:00 2001
From: Kilian Weishaupt <kilian.weishaupt@iws.uni-stuttgart.de>
Date: Wed, 22 Aug 2018 10:34:16 +0200
Subject: [PATCH] [md][privarSwitchNewtonSolver] Fix for clang

* use Dune::Hybrid::elementAt() instead of std::get<>()
---
 dumux/multidomain/privarswitchnewtonsolver.hh | 22 +++++++++----------
 1 file changed, 10 insertions(+), 12 deletions(-)

diff --git a/dumux/multidomain/privarswitchnewtonsolver.hh b/dumux/multidomain/privarswitchnewtonsolver.hh
index 769307df07..e39477a151 100644
--- a/dumux/multidomain/privarswitchnewtonsolver.hh
+++ b/dumux/multidomain/privarswitchnewtonsolver.hh
@@ -48,12 +48,9 @@ class MultiDomainPriVarSwitchNewtonSolver : public MultiDomainNewtonSolver<Assem
     using ParentType = MultiDomainNewtonSolver<Assembler, LinearSolver, CouplingManager, Reassembler, Comm>;
     using SolutionVector = typename Assembler::ResidualType;
 
-    using DomainIds = std::make_index_sequence<Assembler::Traits::numSubDomains>;
-
-    template<std::size_t id>
-    using PrivarSwitchPtr = std::unique_ptr<std::tuple_element_t<id, PrivarSwitchTypeTuple>>;
-
-    using PriVarSwitchPtrTuple = typename makeFromIndexedType<std::tuple, PrivarSwitchPtr, DomainIds>::type;
+    template<std::size_t i> using PriVarSwitch = std::tuple_element_t<i, PrivarSwitchTypeTuple>;
+    template<std::size_t i> using PrivarSwitchPtr = std::unique_ptr<PriVarSwitch<i>>;
+    using PriVarSwitchPtrTuple = typename Assembler::Traits::template MakeTuple<PrivarSwitchPtr>;
 
 public:
     using ParentType::ParentType;
@@ -83,9 +80,10 @@ public:
         switchedInLastIteration_.fill(false);
 
         using namespace Dune::Hybrid;
-        forEach(DomainIds{}, [&](auto&& id)
+        forEach(std::make_index_sequence<Assembler::Traits::numSubDomains>{}, [&](auto&& id)
         {
-            std::get<id>(priVarSwitches_) = std::make_unique<std::tuple_element_t<id, PrivarSwitchTypeTuple>>(u[id].size());
+            using PVSwitch = PriVarSwitch<std::decay_t<decltype(id)>::value>;
+            elementAt(priVarSwitches_, id) = std::make_unique<PVSwitch>(u[id].size());
         });
     }
 
@@ -106,12 +104,12 @@ public:
         auto& assembler = this->assembler();
 
         using namespace Dune::Hybrid;
-        forEach(DomainIds{}, [&](auto&& id)
+        forEach(std::make_index_sequence<Assembler::Traits::numSubDomains>{}, [&](auto&& id)
         {
             const auto& fvGridGeometry = assembler.fvGridGeometry(id);
             const auto& problem = assembler.problem(id);
             auto& gridVariables = assembler.gridVariables(id);
-            auto& priVarSwitch = std::get<id>(priVarSwitches_);
+            auto& priVarSwitch = elementAt(priVarSwitches_, id);
 
             // invoke the primary variable switch
             switchedInLastIteration_[id] = priVarSwitch->update(uCurrentIter[id], gridVariables,
@@ -144,9 +142,9 @@ public:
 
         // free some memory
         using namespace Dune::Hybrid;
-        forEach(DomainIds{}, [&](auto&& id)
+        forEach(std::make_index_sequence<Assembler::Traits::numSubDomains>{}, [&](auto&& id)
         {
-            std::get<id>(priVarSwitches_).release();
+            elementAt(priVarSwitches_, id).release();
         });
     }
 
-- 
GitLab