mirror of
https://github.com/boostorg/odeint.git
synced 2026-01-19 04:22:12 +00:00
178 lines
3.7 KiB
C++
178 lines
3.7 KiB
C++
/* 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
|