Skip to content
Snippets Groups Projects
skewmatrix.hh 1.93 KiB
Newer Older
  • Learn to ignore specific revisions
  • #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_;
        
    };