diff --git a/dumux/common/reservedblockvector.hh b/dumux/common/reservedblockvector.hh new file mode 100644 index 0000000000000000000000000000000000000000..277cb10994b0a8972dfffde73fdbc3f58a5a071a --- /dev/null +++ b/dumux/common/reservedblockvector.hh @@ -0,0 +1,96 @@ +// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- +// vi: set et ts=4 sw=4 sts=4: +/***************************************************************************** + * See the file COPYING for full copying permissions. * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see <http://www.gnu.org/licenses/>. * + *****************************************************************************/ +/*! + * \file + * \ingroup Common + * \brief A arithmetic block vector type based on DUNE's reserved vector + */ +#ifndef DUMUX_RESERVED_BLOCK_VECTOR_HH +#define DUMUX_RESERVED_BLOCK_VECTOR_HH + +#include <algorithm> +#include <dune/common/reservedvector.hh> + +namespace Dumux { + +template<class BlockType, int capacity> +class ReservedBlockVector : public Dune::ReservedVector<BlockType, capacity> +{ + using Base = Dune::ReservedVector<BlockType, capacity>; +public: + + using size_type = typename Base::size_type; + using value_type = BlockType; + + using Base::Base; + + explicit ReservedBlockVector() : Base() {} + explicit ReservedBlockVector(size_type size) : Base() { this->resize(size); } + + ReservedBlockVector(const ReservedBlockVector&) = default; + ReservedBlockVector(ReservedBlockVector&&) = default; + + ReservedBlockVector& operator= (const ReservedBlockVector&) = default; + ReservedBlockVector& operator= (ReservedBlockVector&&) = default; + + ~ReservedBlockVector() = default; + + //! assigment from scalar + ReservedBlockVector& operator= (const typename BlockType::field_type& v) + { + std::fill(this->begin(), this->end(), v); + return *this; + } + + //! vector space addition + ReservedBlockVector& operator+= (const ReservedBlockVector& other) + { + for (size_type i = 0; i < this->size(); ++i) + (*this)[i] += other[i]; + return *this; + } + + //! vector space subtraction + ReservedBlockVector& operator-= (const ReservedBlockVector& other) + { + for (size_type i = 0; i < this->size(); ++i) + (*this)[i] -= other[i]; + return *this; + } + + //! division by scalar + ReservedBlockVector& operator/= (const typename BlockType::field_type& v) + { + for (size_type i = 0; i < this->size(); ++i) + (*this)[i] /= v; + return *this; + } + + //! multiplication by scalar + ReservedBlockVector& operator*= (const typename BlockType::field_type& v) + { + for (size_type i = 0; i < this->size(); ++i) + (*this)[i] *= v; + return *this; + } +}; + +} // end namespace Dumux + +#endif