Newer
Older
#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,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> 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_;
};