viennacl_operations.hpp 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. /*
  2. [auto_generated]
  3. boost/numeric/odeint/external/viennacl_operations.hpp
  4. [begin_description]
  5. ViennaCL operations.
  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_EXTERNAL_VIENNACL_VIENNACL_OPERATIONS_HPP_INCLUDED
  14. #define BOOST_NUMERIC_ODEINT_EXTERNAL_VIENNACL_VIENNACL_OPERATIONS_HPP_INCLUDED
  15. #include <viennacl/vector.hpp>
  16. #include <viennacl/generator/custom_operation.hpp>
  17. namespace boost {
  18. namespace numeric {
  19. namespace odeint {
  20. struct viennacl_operations
  21. {
  22. template< class Fac1 = double , class Fac2 = Fac1 >
  23. struct scale_sum2
  24. {
  25. const Fac1 m_alpha1;
  26. const Fac2 m_alpha2;
  27. scale_sum2( Fac1 alpha1 , Fac2 alpha2 )
  28. : m_alpha1( alpha1 ) , m_alpha2( alpha2 )
  29. { }
  30. template< class T1 , class T2 , class T3 >
  31. void operator()( viennacl::vector<T1> &v1 ,
  32. const viennacl::vector<T2> &v2 ,
  33. const viennacl::vector<T3> &v3
  34. ) const
  35. {
  36. using namespace viennacl;
  37. static generator::symbolic_vector <0, T1> sym_v1;
  38. static generator::symbolic_vector <1, T2> sym_v2;
  39. static generator::symbolic_vector <2, T3> sym_v3;
  40. static generator::cpu_symbolic_scalar<3, Fac1> sym_a1;
  41. static generator::cpu_symbolic_scalar<4, Fac2> sym_a2;
  42. static generator::custom_operation op(
  43. sym_v1 = sym_a1 * sym_v2
  44. + sym_a2 * sym_v3
  45. );
  46. ocl::enqueue( op(v1,
  47. const_cast< viennacl::vector<T2>& >(v2),
  48. const_cast< viennacl::vector<T3>& >(v3),
  49. const_cast< Fac1& >(m_alpha1),
  50. const_cast< Fac2& >(m_alpha2)
  51. ) );
  52. }
  53. typedef void result_type;
  54. };
  55. template< class Fac1 = double , class Fac2 = Fac1 , class Fac3 = Fac2 >
  56. struct scale_sum3
  57. {
  58. const Fac1 m_alpha1;
  59. const Fac2 m_alpha2;
  60. const Fac3 m_alpha3;
  61. scale_sum3( Fac1 alpha1 , Fac2 alpha2 , Fac3 alpha3 )
  62. : m_alpha1( alpha1 ) , m_alpha2( alpha2 ) , m_alpha3( alpha3 )
  63. { }
  64. template< class T1 , class T2 , class T3 , class T4 >
  65. void operator()( viennacl::vector<T1> &v1 ,
  66. const viennacl::vector<T2> &v2 ,
  67. const viennacl::vector<T3> &v3 ,
  68. const viennacl::vector<T4> &v4
  69. ) const
  70. {
  71. using namespace viennacl;
  72. static generator::symbolic_vector <0, T1> sym_v1;
  73. static generator::symbolic_vector <1, T2> sym_v2;
  74. static generator::symbolic_vector <2, T3> sym_v3;
  75. static generator::symbolic_vector <3, T4> sym_v4;
  76. static generator::cpu_symbolic_scalar<4, Fac1> sym_a1;
  77. static generator::cpu_symbolic_scalar<5, Fac2> sym_a2;
  78. static generator::cpu_symbolic_scalar<6, Fac3> sym_a3;
  79. static generator::custom_operation op(
  80. sym_v1 = sym_a1 * sym_v2
  81. + sym_a2 * sym_v3
  82. + sym_a3 * sym_v4
  83. );
  84. ocl::enqueue( op(v1,
  85. const_cast< viennacl::vector<T2>& >(v2),
  86. const_cast< viennacl::vector<T3>& >(v3),
  87. const_cast< viennacl::vector<T4>& >(v4),
  88. const_cast< Fac1& >(m_alpha1),
  89. const_cast< Fac2& >(m_alpha2),
  90. const_cast< Fac3& >(m_alpha3)
  91. ) );
  92. }
  93. typedef void result_type;
  94. };
  95. template< class Fac1 = double , class Fac2 = Fac1 , class Fac3 = Fac2 , class Fac4 = Fac3 >
  96. struct scale_sum4
  97. {
  98. const Fac1 m_alpha1;
  99. const Fac2 m_alpha2;
  100. const Fac3 m_alpha3;
  101. const Fac4 m_alpha4;
  102. scale_sum4( Fac1 alpha1 , Fac2 alpha2 , Fac3 alpha3 , Fac4 alpha4 )
  103. : m_alpha1( alpha1 ) , m_alpha2( alpha2 ) , m_alpha3( alpha3 ) , m_alpha4( alpha4 ) { }
  104. template< class T1 , class T2 , class T3 , class T4 , class T5 >
  105. void operator()( viennacl::vector<T1> &v1 ,
  106. const viennacl::vector<T2> &v2 ,
  107. const viennacl::vector<T3> &v3 ,
  108. const viennacl::vector<T4> &v4 ,
  109. const viennacl::vector<T5> &v5
  110. ) const
  111. {
  112. using namespace viennacl;
  113. static generator::symbolic_vector <0, T1> sym_v1;
  114. static generator::symbolic_vector <1, T2> sym_v2;
  115. static generator::symbolic_vector <2, T3> sym_v3;
  116. static generator::symbolic_vector <3, T4> sym_v4;
  117. static generator::symbolic_vector <4, T5> sym_v5;
  118. static generator::cpu_symbolic_scalar<5, Fac1> sym_a1;
  119. static generator::cpu_symbolic_scalar<6, Fac2> sym_a2;
  120. static generator::cpu_symbolic_scalar<7, Fac3> sym_a3;
  121. static generator::cpu_symbolic_scalar<8, Fac4> sym_a4;
  122. static generator::custom_operation op(
  123. sym_v1 = sym_a1 * sym_v2
  124. + sym_a2 * sym_v3
  125. + sym_a3 * sym_v4
  126. + sym_a4 * sym_v5
  127. );
  128. ocl::enqueue( op(v1,
  129. const_cast< viennacl::vector<T2>& >(v2),
  130. const_cast< viennacl::vector<T3>& >(v3),
  131. const_cast< viennacl::vector<T4>& >(v4),
  132. const_cast< viennacl::vector<T5>& >(v5),
  133. const_cast< Fac1& >(m_alpha1),
  134. const_cast< Fac2& >(m_alpha2),
  135. const_cast< Fac3& >(m_alpha3),
  136. const_cast< Fac4& >(m_alpha4)
  137. ) );
  138. }
  139. typedef void result_type;
  140. };
  141. template< class Fac1 = double , class Fac2 = Fac1 , class Fac3 = Fac2 , class Fac4 = Fac3 , class Fac5 = Fac4 >
  142. struct scale_sum5
  143. {
  144. const Fac1 m_alpha1;
  145. const Fac2 m_alpha2;
  146. const Fac3 m_alpha3;
  147. const Fac4 m_alpha4;
  148. const Fac5 m_alpha5;
  149. scale_sum5( Fac1 alpha1 , Fac2 alpha2 , Fac3 alpha3 , Fac4 alpha4 , Fac5 alpha5 )
  150. : m_alpha1( alpha1 ) , m_alpha2( alpha2 ) , m_alpha3( alpha3 ) , m_alpha4( alpha4 ) , m_alpha5( alpha5 ) { }
  151. template< class T1 , class T2 , class T3 , class T4 , class T5 , class T6 >
  152. void operator()( viennacl::vector<T1> &v1 ,
  153. const viennacl::vector<T2> &v2 ,
  154. const viennacl::vector<T3> &v3 ,
  155. const viennacl::vector<T4> &v4 ,
  156. const viennacl::vector<T5> &v5 ,
  157. const viennacl::vector<T6> &v6
  158. ) const
  159. {
  160. using namespace viennacl;
  161. static generator::symbolic_vector < 0, T1> sym_v1;
  162. static generator::symbolic_vector < 1, T2> sym_v2;
  163. static generator::symbolic_vector < 2, T3> sym_v3;
  164. static generator::symbolic_vector < 3, T4> sym_v4;
  165. static generator::symbolic_vector < 4, T5> sym_v5;
  166. static generator::symbolic_vector < 5, T6> sym_v6;
  167. static generator::cpu_symbolic_scalar< 6, Fac1> sym_a1;
  168. static generator::cpu_symbolic_scalar< 7, Fac2> sym_a2;
  169. static generator::cpu_symbolic_scalar< 8, Fac3> sym_a3;
  170. static generator::cpu_symbolic_scalar< 9, Fac4> sym_a4;
  171. static generator::cpu_symbolic_scalar<10, Fac5> sym_a5;
  172. static generator::custom_operation op(
  173. sym_v1 = sym_a1 * sym_v2
  174. + sym_a2 * sym_v3
  175. + sym_a3 * sym_v4
  176. + sym_a4 * sym_v5
  177. + sym_a5 * sym_v6
  178. );
  179. ocl::enqueue( op(v1,
  180. const_cast< viennacl::vector<T2>& >(v2),
  181. const_cast< viennacl::vector<T3>& >(v3),
  182. const_cast< viennacl::vector<T4>& >(v4),
  183. const_cast< viennacl::vector<T5>& >(v5),
  184. const_cast< viennacl::vector<T6>& >(v6),
  185. const_cast< Fac1& >(m_alpha1),
  186. const_cast< Fac2& >(m_alpha2),
  187. const_cast< Fac3& >(m_alpha3),
  188. const_cast< Fac4& >(m_alpha4),
  189. const_cast< Fac5& >(m_alpha5)
  190. ) );
  191. }
  192. typedef void result_type;
  193. };
  194. };
  195. } // odeint
  196. } // numeric
  197. } // boost
  198. #endif // BOOST_NUMERIC_ODEINT_EXTERNAL_VIENNACL_VIENNACL_OPERATIONS_HPP_INCLUDED