Skip to content
Snippets Groups Projects
StaticVector.h 10.1 KiB
Newer Older
  • Learn to ignore specific revisions
  • /***************************************************************************
                              tnlStaticVector.h  -  description
                                 -------------------
        begin                : Feb 10, 2014
        copyright            : (C) 2014 by Tomas Oberhuber
        email                : tomas.oberhuber@fjfi.cvut.cz
     ***************************************************************************/
    
    
    /* See Copyright Notice in tnl/Copyright */
    
    #pragma once
    
    #include <TNL/Arrays/StaticArray.h>
    
    namespace TNL {
    
    template< int Size, typename Real = double >
    
    class tnlStaticVector : public Arrays::tnlStaticArray< Size, Real >
    
    Tomáš Oberhuber's avatar
    Tomáš Oberhuber committed
       typedef tnlStaticVector< Size, Real > ThisType;
    
    Tomáš Oberhuber's avatar
    Tomáš Oberhuber committed
       __cuda_callable__
    
    Tomáš Oberhuber's avatar
    Tomáš Oberhuber committed
       __cuda_callable__
    
       tnlStaticVector( const Real v[ Size ] );
    
       //! This sets all vector components to v
    
    Tomáš Oberhuber's avatar
    Tomáš Oberhuber committed
       __cuda_callable__
    
       tnlStaticVector( const Real& v );
    
       //! Copy constructor
    
    Tomáš Oberhuber's avatar
    Tomáš Oberhuber committed
       __cuda_callable__
    
       tnlStaticVector( const tnlStaticVector< Size, Real >& v );
    
    
       static String getType();
    
    Tomáš Oberhuber's avatar
    Tomáš Oberhuber committed
       __cuda_callable__
    
       tnlStaticVector& operator += ( const tnlStaticVector& v );
    
       //! Subtracting operator
    
    Tomáš Oberhuber's avatar
    Tomáš Oberhuber committed
       __cuda_callable__
    
       tnlStaticVector& operator -= ( const tnlStaticVector& v );
    
       //! Multiplication with number
    
    Tomáš Oberhuber's avatar
    Tomáš Oberhuber committed
       __cuda_callable__
    
       tnlStaticVector& operator *= ( const Real& c );
    
    
    Tomáš Oberhuber's avatar
    Tomáš Oberhuber committed
       //! Addition operator
       __cuda_callable__
    
       tnlStaticVector operator + ( const tnlStaticVector& u ) const;
    
    
    Tomáš Oberhuber's avatar
    Tomáš Oberhuber committed
       //! Subtraction operator
       __cuda_callable__
    
       tnlStaticVector operator - ( const tnlStaticVector& u ) const;
    
       //! Multiplication with number
    
    Tomáš Oberhuber's avatar
    Tomáš Oberhuber committed
       __cuda_callable__
    
       tnlStaticVector operator * ( const Real& c ) const;
    
       //! Scalar product
    
    Tomáš Oberhuber's avatar
    Tomáš Oberhuber committed
       __cuda_callable__
    
       Real operator * ( const tnlStaticVector& u ) const;
    
    
    Tomáš Oberhuber's avatar
    Tomáš Oberhuber committed
       __cuda_callable__
    
       bool operator < ( const tnlStaticVector& v ) const;
    
    
    Tomáš Oberhuber's avatar
    Tomáš Oberhuber committed
       __cuda_callable__
    
       bool operator <= ( const tnlStaticVector& v ) const;
    
    
    Tomáš Oberhuber's avatar
    Tomáš Oberhuber committed
       __cuda_callable__
    
       bool operator > ( const tnlStaticVector& v ) const;
    
    
    Tomáš Oberhuber's avatar
    Tomáš Oberhuber committed
       __cuda_callable__
    
       bool operator >= ( const tnlStaticVector& v ) const;
    
    Tomáš Oberhuber's avatar
    Tomáš Oberhuber committed
    
       template< typename OtherReal >
       __cuda_callable__
    
       operator tnlStaticVector< Size, OtherReal >() const;
     
    
    Tomáš Oberhuber's avatar
    Tomáš Oberhuber committed
       __cuda_callable__
    
    Tomáš Oberhuber's avatar
    Tomáš Oberhuber committed
       ThisType abs() const;
    
    class tnlStaticVector< 1, Real > : public Arrays::tnlStaticArray< 1, Real >
    
    Tomáš Oberhuber's avatar
    Tomáš Oberhuber committed
       typedef tnlStaticVector< 1, Real > ThisType;
    
    Tomáš Oberhuber's avatar
    Tomáš Oberhuber committed
       __cuda_callable__
    
       tnlStaticVector();
    
       //! This sets all vector components to v
    
    Tomáš Oberhuber's avatar
    Tomáš Oberhuber committed
       __cuda_callable__
    
       tnlStaticVector( const Real& v );
    
       //! Copy constructor
    
    Tomáš Oberhuber's avatar
    Tomáš Oberhuber committed
       __cuda_callable__
    
       tnlStaticVector( const tnlStaticVector< 1, Real >& v );
    
    
       static String getType();
    
    Tomáš Oberhuber's avatar
    Tomáš Oberhuber committed
       //! Addition operator
       __cuda_callable__
    
       tnlStaticVector& operator += ( const tnlStaticVector& v );
    
    
    Tomáš Oberhuber's avatar
    Tomáš Oberhuber committed
       //! Subtraction operator
       __cuda_callable__
    
       tnlStaticVector& operator -= ( const tnlStaticVector& v );
    
       //! Multiplication with number
    
    Tomáš Oberhuber's avatar
    Tomáš Oberhuber committed
       __cuda_callable__
    
       tnlStaticVector& operator *= ( const Real& c );
    
    
    Tomáš Oberhuber's avatar
    Tomáš Oberhuber committed
       //! Addition operator
       __cuda_callable__
    
       tnlStaticVector operator + ( const tnlStaticVector& u ) const;
    
    
    Tomáš Oberhuber's avatar
    Tomáš Oberhuber committed
       //! Subtraction operator
       __cuda_callable__
    
       tnlStaticVector operator - ( const tnlStaticVector& u ) const;
    
       //! Multiplication with number
    
    Tomáš Oberhuber's avatar
    Tomáš Oberhuber committed
       __cuda_callable__
    
       tnlStaticVector operator * ( const Real& c ) const;
    
       //! Scalar product
    
    Tomáš Oberhuber's avatar
    Tomáš Oberhuber committed
       __cuda_callable__
    
       Real operator * ( const tnlStaticVector& u ) const;
    
    
    Tomáš Oberhuber's avatar
    Tomáš Oberhuber committed
       __cuda_callable__
    
       bool operator < ( const tnlStaticVector& v ) const;
    
    
    Tomáš Oberhuber's avatar
    Tomáš Oberhuber committed
       __cuda_callable__
    
       bool operator <= ( const tnlStaticVector& v ) const;
    
    
    Tomáš Oberhuber's avatar
    Tomáš Oberhuber committed
       __cuda_callable__
    
       bool operator > ( const tnlStaticVector& v ) const;
    
    
    Tomáš Oberhuber's avatar
    Tomáš Oberhuber committed
       __cuda_callable__
    
       bool operator >= ( const tnlStaticVector& v ) const;
    
    Tomáš Oberhuber's avatar
    Tomáš Oberhuber committed
    
       template< typename OtherReal >
       __cuda_callable__
    
       operator tnlStaticVector< 1, OtherReal >() const;
     
    
    Tomáš Oberhuber's avatar
    Tomáš Oberhuber committed
       __cuda_callable__
    
    Tomáš Oberhuber's avatar
    Tomáš Oberhuber committed
       ThisType abs() const;
    
    class tnlStaticVector< 2, Real > : public Arrays::tnlStaticArray< 2, Real >
    
    Tomáš Oberhuber's avatar
    Tomáš Oberhuber committed
       typedef tnlStaticVector< 2, Real > ThisType;
    
    Tomáš Oberhuber's avatar
    Tomáš Oberhuber committed
       __cuda_callable__
    
    Tomáš Oberhuber's avatar
    Tomáš Oberhuber committed
       __cuda_callable__
    
       tnlStaticVector( const Real v[ 2 ] );
    
       //! This sets all vector components to v
    
    Tomáš Oberhuber's avatar
    Tomáš Oberhuber committed
       __cuda_callable__
    
       tnlStaticVector( const Real& v );
    
    
    Tomáš Oberhuber's avatar
    Tomáš Oberhuber committed
       __cuda_callable__
    
       tnlStaticVector( const Real& v1, const Real& v2 );
    
       //! Copy constructor
    
    Tomáš Oberhuber's avatar
    Tomáš Oberhuber committed
       __cuda_callable__
    
       tnlStaticVector( const tnlStaticVector< 2, Real >& v );
    
    
       static String getType();
    
    Tomáš Oberhuber's avatar
    Tomáš Oberhuber committed
       __cuda_callable__
    
       tnlStaticVector& operator += ( const tnlStaticVector& v );
    
       //! Subtracting operator
    
    Tomáš Oberhuber's avatar
    Tomáš Oberhuber committed
       __cuda_callable__
    
       tnlStaticVector& operator -= ( const tnlStaticVector& v );
    
       //! Multiplication with number
    
    Tomáš Oberhuber's avatar
    Tomáš Oberhuber committed
       __cuda_callable__
    
       tnlStaticVector& operator *= ( const Real& c );
    
       //! Adding operator
    
    Tomáš Oberhuber's avatar
    Tomáš Oberhuber committed
       __cuda_callable__
    
       tnlStaticVector operator + ( const tnlStaticVector& u ) const;
    
       //! Subtracting operator
    
    Tomáš Oberhuber's avatar
    Tomáš Oberhuber committed
       __cuda_callable__
    
       tnlStaticVector operator - ( const tnlStaticVector& u ) const;
    
       //! Multiplication with number
    
    Tomáš Oberhuber's avatar
    Tomáš Oberhuber committed
       __cuda_callable__
    
       tnlStaticVector operator * ( const Real& c ) const;
    
       //! Scalar product
    
    Tomáš Oberhuber's avatar
    Tomáš Oberhuber committed
       __cuda_callable__
    
       Real operator * ( const tnlStaticVector& u ) const;
    
    
    Tomáš Oberhuber's avatar
    Tomáš Oberhuber committed
       __cuda_callable__
    
       bool operator < ( const tnlStaticVector& v ) const;
    
    
    Tomáš Oberhuber's avatar
    Tomáš Oberhuber committed
       __cuda_callable__
    
       bool operator <= ( const tnlStaticVector& v ) const;
    
    
    Tomáš Oberhuber's avatar
    Tomáš Oberhuber committed
       __cuda_callable__
    
       bool operator > ( const tnlStaticVector& v ) const;
    
    
    Tomáš Oberhuber's avatar
    Tomáš Oberhuber committed
       __cuda_callable__
    
       bool operator >= ( const tnlStaticVector& v ) const;
    
    Tomáš Oberhuber's avatar
    Tomáš Oberhuber committed
       template< typename OtherReal >
       __cuda_callable__
    
       operator tnlStaticVector< 2, OtherReal >() const;
     
    
    Tomáš Oberhuber's avatar
    Tomáš Oberhuber committed
       __cuda_callable__
    
    Tomáš Oberhuber's avatar
    Tomáš Oberhuber committed
       ThisType abs() const;
    
    class tnlStaticVector< 3, Real > : public Arrays::tnlStaticArray< 3, Real >
    
    Tomáš Oberhuber's avatar
    Tomáš Oberhuber committed
       typedef tnlStaticVector< 3, Real > ThisType;
    
    Tomáš Oberhuber's avatar
    Tomáš Oberhuber committed
       __cuda_callable__
    
    Tomáš Oberhuber's avatar
    Tomáš Oberhuber committed
       __cuda_callable__
    
       tnlStaticVector( const Real v[ 3 ] );
    
       //! This sets all vector components to v
    
    Tomáš Oberhuber's avatar
    Tomáš Oberhuber committed
       __cuda_callable__
    
       tnlStaticVector( const Real& v );
    
    
    Tomáš Oberhuber's avatar
    Tomáš Oberhuber committed
       __cuda_callable__
    
       tnlStaticVector( const Real& v1, const Real& v2, const Real& v3 );
    
       //! Copy constructor
    
    Tomáš Oberhuber's avatar
    Tomáš Oberhuber committed
       __cuda_callable__
    
       tnlStaticVector( const tnlStaticVector< 3, Real >& v );
    
    
       static String getType();
    
    Tomáš Oberhuber's avatar
    Tomáš Oberhuber committed
       //! Addition operator
       __cuda_callable__
    
       tnlStaticVector& operator += ( const tnlStaticVector& v );
    
    
    Tomáš Oberhuber's avatar
    Tomáš Oberhuber committed
       //! Subtraction operator
       __cuda_callable__
    
       tnlStaticVector& operator -= ( const tnlStaticVector& v );
    
       //! Multiplication with number
    
    Tomáš Oberhuber's avatar
    Tomáš Oberhuber committed
       __cuda_callable__
    
       tnlStaticVector& operator *= ( const Real& c );
    
    
    Tomáš Oberhuber's avatar
    Tomáš Oberhuber committed
       //! Addition operator
       __cuda_callable__
    
       tnlStaticVector operator + ( const tnlStaticVector& u ) const;
    
    
    Tomáš Oberhuber's avatar
    Tomáš Oberhuber committed
       //! Subtraction operator
       __cuda_callable__
    
       tnlStaticVector operator - ( const tnlStaticVector& u ) const;
    
       //! Multiplication with number
    
    Tomáš Oberhuber's avatar
    Tomáš Oberhuber committed
       __cuda_callable__
    
       tnlStaticVector operator * ( const Real& c ) const;
    
       //! Scalar product
    
    Tomáš Oberhuber's avatar
    Tomáš Oberhuber committed
       __cuda_callable__
    
       Real operator * ( const tnlStaticVector& u ) const;
    
    
    Tomáš Oberhuber's avatar
    Tomáš Oberhuber committed
       __cuda_callable__
    
       bool operator < ( const tnlStaticVector& v ) const;
    
    
    Tomáš Oberhuber's avatar
    Tomáš Oberhuber committed
       __cuda_callable__
    
       bool operator <= ( const tnlStaticVector& v ) const;
    
    
    Tomáš Oberhuber's avatar
    Tomáš Oberhuber committed
       __cuda_callable__
    
       bool operator > ( const tnlStaticVector& v ) const;
    
    
    Tomáš Oberhuber's avatar
    Tomáš Oberhuber committed
       __cuda_callable__
    
       bool operator >= ( const tnlStaticVector& v ) const;
    
    Tomáš Oberhuber's avatar
    Tomáš Oberhuber committed
    
       template< typename OtherReal >
       __cuda_callable__
    
       operator tnlStaticVector< 3, OtherReal >() const;
     
    
    Tomáš Oberhuber's avatar
    Tomáš Oberhuber committed
       __cuda_callable__
    
    Tomáš Oberhuber's avatar
    Tomáš Oberhuber committed
       ThisType abs() const;
    
    };
    
    template< int Size, typename Real >
    tnlStaticVector< Size, Real > operator * ( const Real& c, const tnlStaticVector< Size, Real >& u );
    
    
    Tomáš Oberhuber's avatar
    Tomáš Oberhuber committed
    template< int Size, typename Real >
    
    tnlStaticVector< Size, Real > abs( const tnlStaticVector< Size, Real >& u ) { return u.abs(); };
    
    
    } // namespace TNL
    
    #include <TNL/Vectors/StaticVector_impl.h>
    #include <TNL/Vectors/StaticVector1D_impl.h>
    #include <TNL/Vectors/StaticVector2D_impl.h>
    #include <TNL/Vectors/StaticVector3D_impl.h>
    
    
    namespace TNL {
    
    // TODO: move to some other source file
    
    template< typename Real >
    tnlStaticVector< 3, Real > tnlVectorProduct( const tnlStaticVector< 3, Real >& u,
                                                 const tnlStaticVector< 3, Real >& v )
    {
       tnlStaticVector< 3, Real > p;
       p[ 0 ] = u[ 1 ] * v[ 2 ] - u[ 2 ] * v[ 1 ];
       p[ 1 ] = u[ 2 ] * v[ 0 ] - u[ 0 ] * v[ 2 ];
       p[ 2 ] = u[ 0 ] * v[ 1 ] - u[ 1 ] * v[ 0 ];
       return p;
    };
    
    template< typename Real >
    Real tnlScalarProduct( const tnlStaticVector< 2, Real >& u,
                           const tnlStaticVector< 2, Real >& v )
    {
       return u[ 0 ] * v[ 0 ] + u[ 1 ] * v[ 1 ];
    };
    
    template< typename Real >
    Real tnlScalarProduct( const tnlStaticVector< 3, Real >& u,
                           const tnlStaticVector< 3, Real >& v )
    {
       return u[ 0 ] * v[ 0 ] + u[ 1 ] * v[ 1 ] + u[ 2 ] * v[ 2 ];
    };
    
    template< typename Real >
    Real tnlTriangleArea( const tnlStaticVector< 2, Real >& a,
                          const tnlStaticVector< 2, Real >& b,
                          const tnlStaticVector< 2, Real >& c )
    {
       tnlStaticVector< 3, Real > u1, u2;
       u1. x() = b. x() - a. x();
       u1. y() = b. y() - a. y();
       u1. z() = 0.0;
       u2. x() = c. x() - a. x();
       u2. y() = c. y() - a. y();
       u2. z() = 0;
    
       const tnlStaticVector< 3, Real > v = tnlVectorProduct( u1, u2 );
    
       return 0.5 * ::sqrt( tnlScalarProduct( v, v ) );
    
    template< typename Real >
    Real tnlTriangleArea( const tnlStaticVector< 3, Real >& a,
                          const tnlStaticVector< 3, Real >& b,
                          const tnlStaticVector< 3, Real >& c )
    {
       tnlStaticVector< 3, Real > u1, u2;
       u1. x() = b. x() - a. x();
       u1. y() = b. y() - a. y();
       u1. z() = 0.0;
       u2. x() = c. x() - a. x();
       u2. y() = c. y() - a. y();
       u2. z() = 0;
    
       const tnlStaticVector< 3, Real > v = tnlVectorProduct( u1, u2 );
    
       return 0.5 * ::sqrt( tnlScalarProduct( v, v ) );
    
    } // namespace TNL