vector_space_algebra.hpp 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. /*
  2. [auto_generated]
  3. boost/numeric/odeint/algebra/vector_space_algebra.hpp
  4. [begin_description]
  5. An algebra for types which have vector space semantics, hence types on which the operators +,-,* are well defined.
  6. [end_description]
  7. Copyright 2010-2012 Karsten Ahnert
  8. Copyright 2010-2013 Mario Mulansky
  9. Distributed under the Boost Software License, Version 1.0.
  10. (See accompanying file LICENSE_1_0.txt or
  11. copy at http://www.boost.org/LICENSE_1_0.txt)
  12. */
  13. #ifndef BOOST_NUMERIC_ODEINT_ALGEBRA_VECTOR_SPACE_ALGEBRA_HPP_INCLUDED
  14. #define BOOST_NUMERIC_ODEINT_ALGEBRA_VECTOR_SPACE_ALGEBRA_HPP_INCLUDED
  15. #include <complex>
  16. #include <boost/type_traits/remove_reference.hpp>
  17. namespace boost {
  18. namespace numeric {
  19. namespace odeint {
  20. /*
  21. * This class template has to be overload in order to call vector_space_algebra::norm_inf
  22. */
  23. template< class State, class Enabler = void > struct vector_space_norm_inf;
  24. /*
  25. * Example: instantiation for sole doubles and complex
  26. */
  27. template<>
  28. struct vector_space_norm_inf< double >
  29. {
  30. typedef double result_type;
  31. double operator()( double x ) const
  32. {
  33. using std::abs;
  34. return abs(x);
  35. }
  36. };
  37. template<>
  38. struct vector_space_norm_inf< float >
  39. {
  40. typedef float result_type;
  41. result_type operator()( float x ) const
  42. {
  43. using std::abs;
  44. return abs(x);
  45. }
  46. };
  47. template< typename T >
  48. struct vector_space_norm_inf< std::complex<T> >
  49. {
  50. typedef T result_type;
  51. result_type operator()( std::complex<T> x ) const
  52. {
  53. using std::abs;
  54. return abs( x );
  55. }
  56. };
  57. struct vector_space_algebra
  58. {
  59. template< class S1 , class Op >
  60. static void for_each1( S1 &s1 , Op op )
  61. {
  62. // ToDo : build checks, that the +-*/ operators are well defined
  63. op( s1 );
  64. }
  65. template< class S1 , class S2 , class Op >
  66. static void for_each2( S1 &s1 , S2 &s2 , Op op )
  67. {
  68. op( s1 , s2 );
  69. }
  70. template< class S1 , class S2 , class S3 , class Op >
  71. static void for_each3( S1 &s1 , S2 &s2 , S3 &s3 , Op op )
  72. {
  73. op( s1 , s2 , s3 );
  74. }
  75. template< class S1 , class S2 , class S3 , class S4 , class Op >
  76. static void for_each4( S1 &s1 , S2 &s2 , S3 &s3 , S4 &s4 , Op op )
  77. {
  78. op( s1 , s2 , s3 , s4 );
  79. }
  80. template< class S1 , class S2 , class S3 , class S4 , class S5 , class Op >
  81. static void for_each5( S1 &s1 , S2 &s2 , S3 &s3 , S4 &s4 , S5 &s5 , Op op )
  82. {
  83. op( s1 , s2 , s3 , s4 , s5 );
  84. }
  85. template< class S1 , class S2 , class S3 , class S4 , class S5 , class S6 , class Op >
  86. static void for_each6( S1 &s1 , S2 &s2 , S3 &s3 , S4 &s4 , S5 &s5 , S6 &s6 , Op op )
  87. {
  88. op( s1 , s2 , s3 , s4 , s5 , s6 );
  89. }
  90. template< class S1 , class S2 , class S3 , class S4 , class S5 , class S6 ,class S7 , class Op >
  91. static void for_each7( S1 &s1 , S2 &s2 , S3 &s3 , S4 &s4 , S5 &s5 , S6 &s6 , S7 &s7 , Op op )
  92. {
  93. op( s1 , s2 , s3 , s4 , s5 , s6 , s7 );
  94. }
  95. template< class S1 , class S2 , class S3 , class S4 , class S5 , class S6 ,class S7 , class S8 , class Op >
  96. static void for_each8( S1 &s1 , S2 &s2 , S3 &s3 , S4 &s4 , S5 &s5 , S6 &s6 , S7 &s7 , S8 &s8 , Op op )
  97. {
  98. op( s1 , s2 , s3 , s4 , s5 , s6 , s7 , s8 );
  99. }
  100. template< class S1 , class S2 , class S3 , class S4 , class S5 , class S6 ,class S7 , class S8 , class S9 , class Op >
  101. static void for_each9( S1 &s1 , S2 &s2 , S3 &s3 , S4 &s4 , S5 &s5 , S6 &s6 , S7 &s7 , S8 &s8 , S9 &s9 , Op op )
  102. {
  103. op( s1 , s2 , s3 , s4 , s5 , s6 , s7 , s8 , s9 );
  104. }
  105. template< class S1 , class S2 , class S3 , class S4 , class S5 , class S6 ,class S7 , class S8 , class S9 , class S10 , class Op >
  106. static void for_each10( S1 &s1 , S2 &s2 , S3 &s3 , S4 &s4 , S5 &s5 , S6 &s6 , S7 &s7 , S8 &s8 , S9 &s9 , S10 &s10 , Op op )
  107. {
  108. op( s1 , s2 , s3 , s4 , s5 , s6 , s7 , s8 , s9 , s10 );
  109. }
  110. template< class S1 , class S2 , class S3 , class S4 , class S5 , class S6 ,class S7 , class S8 , class S9 , class S10 , class S11 , class Op >
  111. static void for_each11( S1 &s1 , S2 &s2 , S3 &s3 , S4 &s4 , S5 &s5 , S6 &s6 , S7 &s7 , S8 &s8 , S9 &s9 , S10 &s10 , S11 &s11 , Op op )
  112. {
  113. op( s1 , s2 , s3 , s4 , s5 , s6 , s7 , s8 , s9 , s10 , s11 );
  114. }
  115. template< class S1 , class S2 , class S3 , class S4 , class S5 , class S6 ,class S7 , class S8 , class S9 , class S10 , class S11 , class S12 , class Op >
  116. static void for_each12( S1 &s1 , S2 &s2 , S3 &s3 , S4 &s4 , S5 &s5 , S6 &s6 , S7 &s7 , S8 &s8 , S9 &s9 , S10 &s10 , S11 &s11 , S12 &s12 , Op op )
  117. {
  118. op( s1 , s2 , s3 , s4 , s5 , s6 , s7 , s8 , s9 , s10 , s11 , s12 );
  119. }
  120. template< class S1 , class S2 , class S3 , class S4 , class S5 , class S6 ,class S7 , class S8 , class S9 , class S10 , class S11 , class S12 , class S13 , class Op >
  121. static void for_each13( S1 &s1 , S2 &s2 , S3 &s3 , S4 &s4 , S5 &s5 , S6 &s6 , S7 &s7 , S8 &s8 , S9 &s9 , S10 &s10 , S11 &s11 , S12 &s12 , S13 &s13 , Op op )
  122. {
  123. op( s1 , s2 , s3 , s4 , s5 , s6 , s7 , s8 , s9 , s10 , s11 , s12 , s13 );
  124. }
  125. template< class S1 , class S2 , class S3 , class S4 , class S5 , class S6 ,class S7 , class S8 , class S9 , class S10 , class S11 , class S12 , class S13 , class S14 , class Op >
  126. static void for_each14( S1 &s1 , S2 &s2 , S3 &s3 , S4 &s4 , S5 &s5 , S6 &s6 , S7 &s7 , S8 &s8 , S9 &s9 , S10 &s10 , S11 &s11 , S12 &s12 , S13 &s13 , S14 &s14 , Op op )
  127. {
  128. op( s1 , s2 , s3 , s4 , s5 , s6 , s7 , s8 , s9 , s10 , s11 , s12 , s13 , s14 );
  129. }
  130. template< class S1 , class S2 , class S3 , class S4 , class S5 , class S6 ,class S7 , class S8 , class S9 , class S10 , class S11 , class S12 , class S13 , class S14 , class S15 , class Op >
  131. static void for_each15( S1 &s1 , S2 &s2 , S3 &s3 , S4 &s4 , S5 &s5 , S6 &s6 , S7 &s7 , S8 &s8 , S9 &s9 , S10 &s10 , S11 &s11 , S12 &s12 , S13 &s13 , S14 &s14 , S15 &s15 , Op op )
  132. {
  133. op( s1 , s2 , s3 , s4 , s5 , s6 , s7 , s8 , s9 , s10 , s11 , s12 , s13 , s14 , s15 );
  134. }
  135. template< class S >
  136. static typename boost::numeric::odeint::vector_space_norm_inf< S >::result_type norm_inf( const S &s )
  137. {
  138. boost::numeric::odeint::vector_space_norm_inf< S > n;
  139. return n( s );
  140. }
  141. };
  142. } // odeint
  143. } // numeric
  144. } // boost
  145. #endif // BOOST_NUMERIC_ODEINT_ALGEBRA_VECTOR_SPACE_ALGEBRA_HPP_INCLUDED