point_type.hpp 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. /* Boost libs/numeric/odeint/examples/point_type.hpp
  2. Copyright 2010-2012 Karsten Ahnert
  3. Copyright 2011 Mario Mulansky
  4. solar system example for Hamiltonian stepper
  5. Distributed under the Boost Software License, Version 1.0.
  6. (See accompanying file LICENSE_1_0.txt or
  7. copy at http://www.boost.org/LICENSE_1_0.txt)
  8. */
  9. #ifndef POINT_TYPE_HPP_INCLUDED
  10. #define POINT_TYPE_HPP_INCLUDED
  11. #include <boost/operators.hpp>
  12. #include <ostream>
  13. //[ point_type
  14. /*the point type */
  15. template< class T , size_t Dim >
  16. class point :
  17. boost::additive1< point< T , Dim > ,
  18. boost::additive2< point< T , Dim > , T ,
  19. boost::multiplicative2< point< T , Dim > , T
  20. > > >
  21. {
  22. public:
  23. const static size_t dim = Dim;
  24. typedef T value_type;
  25. typedef point< value_type , dim > point_type;
  26. // ...
  27. // constructors
  28. //<-
  29. point( void )
  30. {
  31. for( size_t i=0 ; i<dim ; ++i ) m_val[i] = 0.0;
  32. }
  33. point( value_type val )
  34. {
  35. for( size_t i=0 ; i<dim ; ++i ) m_val[i] = val;
  36. }
  37. point( value_type x , value_type y , value_type z = 0.0 )
  38. {
  39. if( dim > 0 ) m_val[0] = x;
  40. if( dim > 1 ) m_val[1] = y;
  41. if( dim > 2 ) m_val[2] = z;
  42. }
  43. //->
  44. // ...
  45. // operators
  46. //<-
  47. T operator[]( size_t i ) const { return m_val[i]; }
  48. T& operator[]( size_t i ) { return m_val[i]; }
  49. point_type& operator+=( const point_type& p )
  50. {
  51. for( size_t i=0 ; i<dim ; ++i )
  52. m_val[i] += p[i];
  53. return *this;
  54. }
  55. point_type& operator-=( const point_type& p )
  56. {
  57. for( size_t i=0 ; i<dim ; ++i )
  58. m_val[i] -= p[i];
  59. return *this;
  60. }
  61. point_type& operator+=( const value_type& val )
  62. {
  63. for( size_t i=0 ; i<dim ; ++i )
  64. m_val[i] += val;
  65. return *this;
  66. }
  67. point_type& operator-=( const value_type& val )
  68. {
  69. for( size_t i=0 ; i<dim ; ++i )
  70. m_val[i] -= val;
  71. return *this;
  72. }
  73. point_type& operator*=( const value_type &val )
  74. {
  75. for( size_t i=0 ; i<dim ; ++i )
  76. m_val[i] *= val;
  77. return *this;
  78. }
  79. point_type& operator/=( const value_type &val )
  80. {
  81. for( size_t i=0 ; i<dim ; ++i )
  82. m_val[i] /= val;
  83. return *this;
  84. }
  85. //->
  86. private:
  87. T m_val[dim];
  88. };
  89. //...
  90. // more operators
  91. //]
  92. //
  93. // the - operator
  94. //
  95. template< class T , size_t Dim >
  96. point< T , Dim > operator-( const point< T , Dim > &p )
  97. {
  98. point< T , Dim > tmp;
  99. for( size_t i=0 ; i<Dim ; ++i ) tmp[i] = -p[i];
  100. return tmp;
  101. }
  102. //
  103. // scalar product
  104. //
  105. template< class T , size_t Dim >
  106. T scalar_prod( const point< T , Dim > &p1 , const point< T , Dim > &p2 )
  107. {
  108. T tmp = 0.0;
  109. for( size_t i=0 ; i<Dim ; ++i ) tmp += p1[i] * p2[i];
  110. return tmp;
  111. }
  112. //
  113. // norm
  114. //
  115. template< class T , size_t Dim >
  116. T norm( const point< T , Dim > &p1 )
  117. {
  118. return scalar_prod( p1 , p1 );
  119. }
  120. //
  121. // absolute value
  122. //
  123. template< class T , size_t Dim >
  124. T abs( const point< T , Dim > &p1 )
  125. {
  126. return sqrt( norm( p1 ) );
  127. }
  128. //
  129. // output operator
  130. //
  131. template< class T , size_t Dim >
  132. std::ostream& operator<<( std::ostream &out , const point< T , Dim > &p )
  133. {
  134. if( Dim > 0 ) out << p[0];
  135. for( size_t i=1 ; i<Dim ; ++i ) out << " " << p[i];
  136. return out;
  137. }
  138. #endif //POINT_TYPE_HPP_INCLUDED