array_algebra.hpp 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
  1. /*
  2. [auto_generated]
  3. boost/numeric/odeint/algebra/array_algebra.hpp
  4. [begin_description]
  5. Algebra for boost::array. Highly specialized for odeint. Const arguments are introduce to work with odeint.
  6. [end_description]
  7. Copyright 2009-2011 Karsten Ahnert
  8. Copyright 2009-2011 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_ARRAY_ALGEBRA_HPP_INCLUDED
  14. #define BOOST_NUMERIC_ODEINT_ALGEBRA_ARRAY_ALGEBRA_HPP_INCLUDED
  15. #include <boost/array.hpp>
  16. namespace boost {
  17. namespace numeric {
  18. namespace odeint {
  19. struct array_algebra
  20. {
  21. template< typename T , size_t dim , class Op >
  22. static void for_each1( boost::array< T , dim > &s1 , Op op )
  23. {
  24. for( size_t i=0 ; i<dim ; ++i )
  25. op( s1[i] );
  26. }
  27. template< typename T1 , typename T2 , size_t dim , class Op >
  28. static void for_each2( boost::array< T1 , dim > &s1 ,
  29. const boost::array< T2 , dim > &s2 , Op op )
  30. {
  31. for( size_t i=0 ; i<dim ; ++i )
  32. op( s1[i] , s2[i] );
  33. }
  34. template< typename T , size_t dim , class Op >
  35. static void for_each3( boost::array< T , dim > &s1 ,
  36. const boost::array< T , dim > &s2 ,
  37. const boost::array< T , dim > &s3 , Op op )
  38. {
  39. for( size_t i=0 ; i<dim ; ++i )
  40. op( s1[i] , s2[i] , s3[i] );
  41. }
  42. /* different const signature - required for the scale_sum_swap2 operation */
  43. template< typename T , size_t dim , class Op >
  44. static void for_each3( boost::array< T , dim > &s1 ,
  45. boost::array< T , dim > &s2 ,
  46. const boost::array< T , dim > &s3 , Op op )
  47. {
  48. for( size_t i=0 ; i<dim ; ++i )
  49. op( s1[i] , s2[i] , s3[i] );
  50. }
  51. template< typename T , size_t dim , class Op >
  52. static void for_each4( boost::array< T , dim > &s1 ,
  53. const boost::array< T , dim > &s2 ,
  54. const boost::array< T , dim > &s3 ,
  55. const boost::array< T , dim > &s4 , Op op )
  56. {
  57. for( size_t i=0 ; i<dim ; ++i )
  58. op( s1[i] , s2[i] , s3[i] , s4[i] );
  59. }
  60. template< typename T , size_t dim , class Op >
  61. static void for_each5( boost::array< T , dim > &s1 ,
  62. const boost::array< T , dim > &s2 ,
  63. const boost::array< T , dim > &s3 ,
  64. const boost::array< T , dim > &s4 ,
  65. const boost::array< T , dim > &s5 , Op op )
  66. {
  67. for( size_t i=0 ; i<dim ; ++i )
  68. op( s1[i] , s2[i] , s3[i] , s4[i] , s5[i] );
  69. }
  70. template< typename T , size_t dim , class Op >
  71. static void for_each6( boost::array< T , dim > &s1 ,
  72. const boost::array< T , dim > &s2 ,
  73. const boost::array< T , dim > &s3 ,
  74. const boost::array< T , dim > &s4 ,
  75. const boost::array< T , dim > &s5 ,
  76. const boost::array< T , dim > &s6 , Op op )
  77. {
  78. for( size_t i=0 ; i<dim ; ++i )
  79. op( s1[i] , s2[i] , s3[i] , s4[i] , s5[i] , s6[i] );
  80. }
  81. template< typename T , size_t dim , class Op >
  82. static void for_each7( boost::array< T , dim > &s1 ,
  83. const boost::array< T , dim > &s2 ,
  84. const boost::array< T , dim > &s3 ,
  85. const boost::array< T , dim > &s4 ,
  86. const boost::array< T , dim > &s5 ,
  87. const boost::array< T , dim > &s6 ,
  88. const boost::array< T , dim > &s7 , Op op )
  89. {
  90. for( size_t i=0 ; i<dim ; ++i )
  91. op( s1[i] , s2[i] , s3[i] , s4[i] , s5[i] , s6[i] , s7[i] );
  92. }
  93. template< typename T , size_t dim , class Op >
  94. static void for_each8( boost::array< T , dim > &s1 ,
  95. const boost::array< T , dim > &s2 ,
  96. const boost::array< T , dim > &s3 ,
  97. const boost::array< T , dim > &s4 ,
  98. const boost::array< T , dim > &s5 ,
  99. const boost::array< T , dim > &s6 ,
  100. const boost::array< T , dim > &s7 ,
  101. const boost::array< T , dim > &s8 , Op op )
  102. {
  103. for( size_t i=0 ; i<dim ; ++i )
  104. op( s1[i] , s2[i] , s3[i] , s4[i] , s5[i] , s6[i] , s7[i] , s8[i] );
  105. }
  106. template< typename T , size_t dim , class Op >
  107. static void for_each9( boost::array< T , dim > &s1 ,
  108. const boost::array< T , dim > &s2 ,
  109. const boost::array< T , dim > &s3 ,
  110. const boost::array< T , dim > &s4 ,
  111. const boost::array< T , dim > &s5 ,
  112. const boost::array< T , dim > &s6 ,
  113. const boost::array< T , dim > &s7 ,
  114. const boost::array< T , dim > &s8 ,
  115. const boost::array< T , dim > &s9 , Op op )
  116. {
  117. for( size_t i=0 ; i<dim ; ++i )
  118. op( s1[i] , s2[i] , s3[i] , s4[i] , s5[i] , s6[i] , s7[i] , s8[i] , s9[i] );
  119. }
  120. template< typename T , size_t dim , class Op >
  121. static void for_each10( boost::array< T , dim > &s1 ,
  122. const boost::array< T , dim > &s2 ,
  123. const boost::array< T , dim > &s3 ,
  124. const boost::array< T , dim > &s4 ,
  125. const boost::array< T , dim > &s5 ,
  126. const boost::array< T , dim > &s6 ,
  127. const boost::array< T , dim > &s7 ,
  128. const boost::array< T , dim > &s8 ,
  129. const boost::array< T , dim > &s9 ,
  130. const boost::array< T , dim > &s10 , Op op )
  131. {
  132. for( size_t i=0 ; i<dim ; ++i )
  133. op( s1[i] , s2[i] , s3[i] , s4[i] , s5[i] , s6[i] , s7[i] , s8[i] , s9[i] , s10[i] );
  134. }
  135. template< typename T , size_t dim , class Op >
  136. static void for_each11( boost::array< T , dim > &s1 ,
  137. const boost::array< T , dim > &s2 ,
  138. const boost::array< T , dim > &s3 ,
  139. const boost::array< T , dim > &s4 ,
  140. const boost::array< T , dim > &s5 ,
  141. const boost::array< T , dim > &s6 ,
  142. const boost::array< T , dim > &s7 ,
  143. const boost::array< T , dim > &s8 ,
  144. const boost::array< T , dim > &s9 ,
  145. const boost::array< T , dim > &s10 ,
  146. const boost::array< T , dim > &s11 , Op op )
  147. {
  148. for( size_t i=0 ; i<dim ; ++i )
  149. op( s1[i] , s2[i] , s3[i] , s4[i] , s5[i] , s6[i] , s7[i] , s8[i] , s9[i] , s10[i] , s11[i] );
  150. }
  151. template< typename T , size_t dim , class Op >
  152. static void for_each12( boost::array< T , dim > &s1 ,
  153. const boost::array< T , dim > &s2 ,
  154. const boost::array< T , dim > &s3 ,
  155. const boost::array< T , dim > &s4 ,
  156. const boost::array< T , dim > &s5 ,
  157. const boost::array< T , dim > &s6 ,
  158. const boost::array< T , dim > &s7 ,
  159. const boost::array< T , dim > &s8 ,
  160. const boost::array< T , dim > &s9 ,
  161. const boost::array< T , dim > &s10 ,
  162. const boost::array< T , dim > &s11 ,
  163. const boost::array< T , dim > &s12 , Op op )
  164. {
  165. for( size_t i=0 ; i<dim ; ++i )
  166. op( s1[i] , s2[i] , s3[i] , s4[i] , s5[i] , s6[i] , s7[i] , s8[i] , s9[i] , s10[i] , s11[i] , s12[i] );
  167. }
  168. template< typename T , size_t dim , class Op >
  169. static void for_each13( boost::array< T , dim > &s1 ,
  170. const boost::array< T , dim > &s2 ,
  171. const boost::array< T , dim > &s3 ,
  172. const boost::array< T , dim > &s4 ,
  173. const boost::array< T , dim > &s5 ,
  174. const boost::array< T , dim > &s6 ,
  175. const boost::array< T , dim > &s7 ,
  176. const boost::array< T , dim > &s8 ,
  177. const boost::array< T , dim > &s9 ,
  178. const boost::array< T , dim > &s10 ,
  179. const boost::array< T , dim > &s11 ,
  180. const boost::array< T , dim > &s12 ,
  181. const boost::array< T , dim > &s13 , Op op )
  182. {
  183. for( size_t i=0 ; i<dim ; ++i )
  184. op( s1[i] , s2[i] , s3[i] , s4[i] , s5[i] , s6[i] , s7[i] , s8[i] , s9[i] , s10[i] , s11[i] , s12[i] , s13[i] );
  185. }
  186. template< typename T , size_t dim , class Op >
  187. static void for_each14( boost::array< T , dim > &s1 ,
  188. const boost::array< T , dim > &s2 ,
  189. const boost::array< T , dim > &s3 ,
  190. const boost::array< T , dim > &s4 ,
  191. const boost::array< T , dim > &s5 ,
  192. const boost::array< T , dim > &s6 ,
  193. const boost::array< T , dim > &s7 ,
  194. const boost::array< T , dim > &s8 ,
  195. const boost::array< T , dim > &s9 ,
  196. const boost::array< T , dim > &s10 ,
  197. const boost::array< T , dim > &s11 ,
  198. const boost::array< T , dim > &s12 ,
  199. const boost::array< T , dim > &s13 ,
  200. const boost::array< T , dim > &s14 , Op op )
  201. {
  202. for( size_t i=0 ; i<dim ; ++i )
  203. op( s1[i] , s2[i] , s3[i] , s4[i] , s5[i] , s6[i] , s7[i] , s8[i] , s9[i] , s10[i] , s11[i] , s12[i] , s13[i] , s14[i] );
  204. }
  205. template< typename T , size_t dim , class Op >
  206. static void for_each15( boost::array< T , dim > &s1 ,
  207. const boost::array< T , dim > &s2 ,
  208. const boost::array< T , dim > &s3 ,
  209. const boost::array< T , dim > &s4 ,
  210. const boost::array< T , dim > &s5 ,
  211. const boost::array< T , dim > &s6 ,
  212. const boost::array< T , dim > &s7 ,
  213. const boost::array< T , dim > &s8 ,
  214. const boost::array< T , dim > &s9 ,
  215. const boost::array< T , dim > &s10 ,
  216. const boost::array< T , dim > &s11 ,
  217. const boost::array< T , dim > &s12 ,
  218. const boost::array< T , dim > &s13 ,
  219. const boost::array< T , dim > &s14 ,
  220. const boost::array< T , dim > &s15 , Op op )
  221. {
  222. for( size_t i=0 ; i<dim ; ++i )
  223. op( s1[i] , s2[i] , s3[i] , s4[i] , s5[i] , s6[i] , s7[i] , s8[i] , s9[i] , s10[i] , s11[i] , s12[i] , s13[i] , s14[i] , s15[i] );
  224. }
  225. template< class Value , class T , size_t dim , class Red >
  226. static Value reduce( const boost::array< T , dim > &s , Red red , Value init)
  227. {
  228. for( size_t i=0 ; i<dim ; ++i )
  229. init = red( init , s[i] );
  230. return init;
  231. }
  232. };
  233. }
  234. }
  235. }
  236. #endif // BOOST_NUMERIC_ODEINT_ALGEBRA_ARRAY_ALGEBRA_HPP_INCLUDED