From 531c2ae15aaa8b6980515238598095bedbde7d0c Mon Sep 17 00:00:00 2001
From: Max Kahnt <max.kahnt@fu-berlin.de>
Date: Mon, 25 Sep 2017 11:57:50 +0200
Subject: [PATCH] Import generic vector truncation from dune-solvers.

Use sparse range for iteration to obtain usage on static
data structures for free in addition to former functionality.
---
 dune/matrix-vector/genericvectortools.hh | 19 ++++++++++++++++++-
 1 file changed, 18 insertions(+), 1 deletion(-)

diff --git a/dune/matrix-vector/genericvectortools.hh b/dune/matrix-vector/genericvectortools.hh
index f6bdc2f..f4143f8 100644
--- a/dune/matrix-vector/genericvectortools.hh
+++ b/dune/matrix-vector/genericvectortools.hh
@@ -24,6 +24,11 @@ void writeBinary(std::ostream& s, const Vector& v) {
   Helper<Vector>::writeBinary(s, v);
 }
 
+//! Truncate vector by given bit set
+template <class Vector, class BitVector>
+void truncate(Vector& v, const BitVector& tr) {
+  Helper<Vector>::truncate(v, tr);
+}
 
 template <class Vector>
 struct Helper {
@@ -32,6 +37,12 @@ struct Helper {
       Generic::writeBinary(s, vi);
   }
 
+  template <class BitVector>
+  static void truncate(Vector& v, const BitVector& tr) {
+    sparseRangeFor(v, [&tr](auto&& vi, auto&& i) {
+      Generic::truncate(vi, tr[i]);
+    });
+  }
 };
 
 template <class Field, int n>
@@ -43,10 +54,16 @@ struct Helper<FieldVector<Field, n>> {
       s.write(reinterpret_cast<const char*>(&vi), sizeof(Field));
   }
 
+  template<class BitVector>
+  static void truncate(Vector& v, const BitVector& tr) {
+    for (auto it = v.begin(), end = v.end(); it != end; ++it)
+      if(tr[it.index()])
+        *it = 0;
+  }
+};
 
 } // end namespace Generic
 } // end namespace MatrixVector
 } // end namespace Dune
 
 #endif // DUNE_MATRIX_VECTOR_GENERICVECTORTOOLS_HH
-
-- 
GitLab