#ifndef DUNE_SKEW_MATRIX_HH #define DUNE_SKEW_MATRIX_HH /** \brief Static dense skew-symmetric matrix */ template <class T, int N> class SkewMatrix {}; /** \brief Static dense skew-symmetric 3x3 matrix */ template <class T> class SkewMatrix<T,3> { public: /** \brief Default constructor -- does nothing */ SkewMatrix() {} /** \brief Constructor from an axial vector */ explicit SkewMatrix(const Dune::FieldVector<T,3>& v) : data_(v) {} /** \brief Constructor from a general matrix */ explicit SkewMatrix(const Dune::FieldMatrix<T,3,3>& m) { data_ = {m[2][1], m[0][2], m[1][0]}; } SkewMatrix(T v) : data_(v) {} SkewMatrix<T,3>& operator*=(const T& a) { data_ *= a; return *this; } Dune::FieldVector<T,3>& axial() { return data_; } const Dune::FieldVector<T,3>& axial() const { return data_; } typedef typename Dune::FieldVector<T,3>::Iterator Iterator; //! begin iterator Iterator begin () { return Iterator(data_,0); } //! end iterator Iterator end () { return Iterator(data_,3); } typedef typename Dune::FieldVector<T,3>::ConstIterator ConstIterator; //! begin iterator ConstIterator begin () const { return ConstIterator(data_,0); } //! end iterator ConstIterator end () const { return ConstIterator(data_,3); } /** \brief Embed the skew-symmetric matrix in R^3x3 */ Dune::FieldMatrix<T,3,3> toMatrix() const { Dune::FieldMatrix<T,3,3> mat; mat = 0; mat[0][1] = -data_[2]; mat[1][0] = data_[2]; mat[0][2] = data_[1]; mat[2][0] = -data_[1]; mat[1][2] = -data_[0]; mat[2][1] = data_[0]; return mat; } private: // we store the axial vector Dune::FieldVector<T,3> data_; }; #endif