blob: 08875110820398745ca43da656a5f659bd93cf4d [file] [log] [blame]
/* Boost libs/numeric/odeint/examples/point_type.hpp
Copyright 2010-2012 Karsten Ahnert
Copyright 2011 Mario Mulansky
solar system example for Hamiltonian stepper
Distributed under the Boost Software License, Version 1.0.
(See accompanying file LICENSE_1_0.txt or
copy at http://www.boost.org/LICENSE_1_0.txt)
*/
#ifndef POINT_TYPE_HPP_INCLUDED
#define POINT_TYPE_HPP_INCLUDED
#include <boost/operators.hpp>
#include <ostream>
//[ point_type
/*the point type */
template< class T , size_t Dim >
class point :
boost::additive1< point< T , Dim > ,
boost::additive2< point< T , Dim > , T ,
boost::multiplicative2< point< T , Dim > , T
> > >
{
public:
const static size_t dim = Dim;
typedef T value_type;
typedef point< value_type , dim > point_type;
// ...
// constructors
//<-
point( void )
{
for( size_t i=0 ; i<dim ; ++i ) m_val[i] = 0.0;
}
point( value_type val )
{
for( size_t i=0 ; i<dim ; ++i ) m_val[i] = val;
}
point( value_type x , value_type y , value_type z = 0.0 )
{
if( dim > 0 ) m_val[0] = x;
if( dim > 1 ) m_val[1] = y;
if( dim > 2 ) m_val[2] = z;
}
//->
// ...
// operators
//<-
T operator[]( size_t i ) const { return m_val[i]; }
T& operator[]( size_t i ) { return m_val[i]; }
point_type& operator+=( const point_type& p )
{
for( size_t i=0 ; i<dim ; ++i )
m_val[i] += p[i];
return *this;
}
point_type& operator-=( const point_type& p )
{
for( size_t i=0 ; i<dim ; ++i )
m_val[i] -= p[i];
return *this;
}
point_type& operator+=( const value_type& val )
{
for( size_t i=0 ; i<dim ; ++i )
m_val[i] += val;
return *this;
}
point_type& operator-=( const value_type& val )
{
for( size_t i=0 ; i<dim ; ++i )
m_val[i] -= val;
return *this;
}
point_type& operator*=( const value_type &val )
{
for( size_t i=0 ; i<dim ; ++i )
m_val[i] *= val;
return *this;
}
point_type& operator/=( const value_type &val )
{
for( size_t i=0 ; i<dim ; ++i )
m_val[i] /= val;
return *this;
}
//->
private:
T m_val[dim];
};
//...
// more operators
//]
//
// the - operator
//
template< class T , size_t Dim >
point< T , Dim > operator-( const point< T , Dim > &p )
{
point< T , Dim > tmp;
for( size_t i=0 ; i<Dim ; ++i ) tmp[i] = -p[i];
return tmp;
}
//
// scalar product
//
template< class T , size_t Dim >
T scalar_prod( const point< T , Dim > &p1 , const point< T , Dim > &p2 )
{
T tmp = 0.0;
for( size_t i=0 ; i<Dim ; ++i ) tmp += p1[i] * p2[i];
return tmp;
}
//
// norm
//
template< class T , size_t Dim >
T norm( const point< T , Dim > &p1 )
{
return scalar_prod( p1 , p1 );
}
//
// absolute value
//
template< class T , size_t Dim >
T abs( const point< T , Dim > &p1 )
{
return sqrt( norm( p1 ) );
}
//
// output operator
//
template< class T , size_t Dim >
std::ostream& operator<<( std::ostream &out , const point< T , Dim > &p )
{
if( Dim > 0 ) out << p[0];
for( size_t i=1 ; i<Dim ; ++i ) out << " " << p[i];
return out;
}
#endif //POINT_TYPE_HPP_INCLUDED