diff --git a/dune/matrix-vector/genericvectortools.hh b/dune/matrix-vector/genericvectortools.hh index f6bdc2fed1ddf5f013d2379959f15dc5464116e6..f4143f871a1b5fbf4368fa842e1d9c6689611842 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 -