From c7d4fbea9f57aae817095b2638514a71395a19c9 Mon Sep 17 00:00:00 2001
From: Timo Koch <timokoch@uio.no>
Date: Mon, 2 Sep 2024 10:29:18 +0200
Subject: [PATCH] [common] Make variables backend work with FieldVector

---
 dumux/common/variablesbackend.hh | 30 ++++++++++++++++++++++++++----
 1 file changed, 26 insertions(+), 4 deletions(-)

diff --git a/dumux/common/variablesbackend.hh b/dumux/common/variablesbackend.hh
index 2f2141b8d7..7654f0aa77 100644
--- a/dumux/common/variablesbackend.hh
+++ b/dumux/common/variablesbackend.hh
@@ -25,6 +25,8 @@
 #include <dune/common/typetraits.hh>
 #include <dune/istl/bvector.hh>
 
+#include <dumux/common/typetraits/isvalid.hh>
+
 // forward declaration
 namespace Dune {
 
@@ -33,6 +35,21 @@ class MultiTypeBlockVector;
 
 } // end namespace Dune
 
+namespace Dumux::Detail::DofBackend {
+
+struct HasResize
+{
+    template<class V>
+    auto operator()(const V& v) -> decltype(std::declval<V>().resize(0))
+    {}
+};
+
+template<class Vector>
+static constexpr auto hasResize()
+{ return decltype( isValid(HasResize())(std::declval<Vector>()) )::value; }
+
+} // end namespace Dumux::Detail::VariablesBackend
+
 namespace Dumux {
 
 /*!
@@ -89,7 +106,12 @@ public:
 
     //! Make a zero-initialized dof vector instance
     static DofVector zeros(SizeType size)
-    { DofVector d; d.resize(size); return d; }
+    {
+        DofVector d;
+        if constexpr (Detail::DofBackend::hasResize<Vector>())
+            d.resize(size);
+        return d;
+    }
 
     //! Perform axpy operation (y += a * x)
     template<class OtherDofVector>
@@ -172,9 +194,9 @@ class VariablesBackend;
  */
 template<class Vars>
 class VariablesBackend<Vars, false>
-: public DofBackend<Vars>
+: public Dumux::DofBackend<Vars>
 {
-    using ParentType = DofBackend<Vars>;
+    using ParentType = Dumux::DofBackend<Vars>;
 
 public:
     using Variables = Vars;
@@ -200,7 +222,7 @@ public:
  */
 template<class Vars>
 class VariablesBackend<Vars, true>
-: public DofBackend<typename Vars::SolutionVector>
+: public Dumux::DofBackend<typename Vars::SolutionVector>
 {
 public:
     using DofVector = typename Vars::SolutionVector;
-- 
GitLab