annotate DEPENDENCIES/generic/include/boost/numeric/odeint/external/viennacl/viennacl_operations.hpp @ 35:86bb97521df4

Update subrepos & merge as appropriate
author Chris Cannam
date Wed, 06 Aug 2014 16:05:55 +0100
parents 2665513ce2d3
children c530137014c0
rev   line source
Chris@16 1 /*
Chris@16 2 [auto_generated]
Chris@16 3 boost/numeric/odeint/external/viennacl_operations.hpp
Chris@16 4
Chris@16 5 [begin_description]
Chris@16 6 ViennaCL operations.
Chris@16 7 [end_description]
Chris@16 8
Chris@16 9 Copyright 2009-2011 Karsten Ahnert
Chris@16 10 Copyright 2009-2011 Mario Mulansky
Chris@16 11
Chris@16 12 Distributed under the Boost Software License, Version 1.0.
Chris@16 13 (See accompanying file LICENSE_1_0.txt or
Chris@16 14 copy at http://www.boost.org/LICENSE_1_0.txt)
Chris@16 15 */
Chris@16 16
Chris@16 17
Chris@16 18 #ifndef BOOST_NUMERIC_ODEINT_EXTERNAL_VIENNACL_VIENNACL_OPERATIONS_HPP_INCLUDED
Chris@16 19 #define BOOST_NUMERIC_ODEINT_EXTERNAL_VIENNACL_VIENNACL_OPERATIONS_HPP_INCLUDED
Chris@16 20
Chris@16 21 #include <viennacl/vector.hpp>
Chris@16 22 #include <viennacl/generator/custom_operation.hpp>
Chris@16 23
Chris@16 24 namespace boost {
Chris@16 25 namespace numeric {
Chris@16 26 namespace odeint {
Chris@16 27
Chris@16 28
Chris@16 29
Chris@16 30 struct viennacl_operations
Chris@16 31 {
Chris@16 32
Chris@16 33 template< class Fac1 = double , class Fac2 = Fac1 >
Chris@16 34 struct scale_sum2
Chris@16 35 {
Chris@16 36 const Fac1 m_alpha1;
Chris@16 37 const Fac2 m_alpha2;
Chris@16 38
Chris@16 39 scale_sum2( Fac1 alpha1 , Fac2 alpha2 )
Chris@16 40 : m_alpha1( alpha1 ) , m_alpha2( alpha2 )
Chris@16 41 { }
Chris@16 42
Chris@16 43 template< class T1 , class T2 , class T3 >
Chris@16 44 void operator()( viennacl::vector<T1> &v1 ,
Chris@16 45 const viennacl::vector<T2> &v2 ,
Chris@16 46 const viennacl::vector<T3> &v3
Chris@16 47 ) const
Chris@16 48 {
Chris@16 49 using namespace viennacl;
Chris@16 50
Chris@16 51 static generator::symbolic_vector <0, T1> sym_v1;
Chris@16 52 static generator::symbolic_vector <1, T2> sym_v2;
Chris@16 53 static generator::symbolic_vector <2, T3> sym_v3;
Chris@16 54 static generator::cpu_symbolic_scalar<3, Fac1> sym_a1;
Chris@16 55 static generator::cpu_symbolic_scalar<4, Fac2> sym_a2;
Chris@16 56
Chris@16 57 static generator::custom_operation op(
Chris@16 58 sym_v1 = sym_a1 * sym_v2
Chris@16 59 + sym_a2 * sym_v3
Chris@16 60 );
Chris@16 61
Chris@16 62 ocl::enqueue( op(v1,
Chris@16 63 const_cast< viennacl::vector<T2>& >(v2),
Chris@16 64 const_cast< viennacl::vector<T3>& >(v3),
Chris@16 65 const_cast< Fac1& >(m_alpha1),
Chris@16 66 const_cast< Fac2& >(m_alpha2)
Chris@16 67 ) );
Chris@16 68 }
Chris@16 69
Chris@16 70 typedef void result_type;
Chris@16 71 };
Chris@16 72
Chris@16 73
Chris@16 74 template< class Fac1 = double , class Fac2 = Fac1 , class Fac3 = Fac2 >
Chris@16 75 struct scale_sum3
Chris@16 76 {
Chris@16 77 const Fac1 m_alpha1;
Chris@16 78 const Fac2 m_alpha2;
Chris@16 79 const Fac3 m_alpha3;
Chris@16 80
Chris@16 81 scale_sum3( Fac1 alpha1 , Fac2 alpha2 , Fac3 alpha3 )
Chris@16 82 : m_alpha1( alpha1 ) , m_alpha2( alpha2 ) , m_alpha3( alpha3 )
Chris@16 83 { }
Chris@16 84
Chris@16 85 template< class T1 , class T2 , class T3 , class T4 >
Chris@16 86 void operator()( viennacl::vector<T1> &v1 ,
Chris@16 87 const viennacl::vector<T2> &v2 ,
Chris@16 88 const viennacl::vector<T3> &v3 ,
Chris@16 89 const viennacl::vector<T4> &v4
Chris@16 90 ) const
Chris@16 91 {
Chris@16 92 using namespace viennacl;
Chris@16 93
Chris@16 94 static generator::symbolic_vector <0, T1> sym_v1;
Chris@16 95 static generator::symbolic_vector <1, T2> sym_v2;
Chris@16 96 static generator::symbolic_vector <2, T3> sym_v3;
Chris@16 97 static generator::symbolic_vector <3, T4> sym_v4;
Chris@16 98 static generator::cpu_symbolic_scalar<4, Fac1> sym_a1;
Chris@16 99 static generator::cpu_symbolic_scalar<5, Fac2> sym_a2;
Chris@16 100 static generator::cpu_symbolic_scalar<6, Fac3> sym_a3;
Chris@16 101
Chris@16 102 static generator::custom_operation op(
Chris@16 103 sym_v1 = sym_a1 * sym_v2
Chris@16 104 + sym_a2 * sym_v3
Chris@16 105 + sym_a3 * sym_v4
Chris@16 106 );
Chris@16 107
Chris@16 108 ocl::enqueue( op(v1,
Chris@16 109 const_cast< viennacl::vector<T2>& >(v2),
Chris@16 110 const_cast< viennacl::vector<T3>& >(v3),
Chris@16 111 const_cast< viennacl::vector<T4>& >(v4),
Chris@16 112 const_cast< Fac1& >(m_alpha1),
Chris@16 113 const_cast< Fac2& >(m_alpha2),
Chris@16 114 const_cast< Fac3& >(m_alpha3)
Chris@16 115 ) );
Chris@16 116 }
Chris@16 117
Chris@16 118 typedef void result_type;
Chris@16 119 };
Chris@16 120
Chris@16 121
Chris@16 122 template< class Fac1 = double , class Fac2 = Fac1 , class Fac3 = Fac2 , class Fac4 = Fac3 >
Chris@16 123 struct scale_sum4
Chris@16 124 {
Chris@16 125 const Fac1 m_alpha1;
Chris@16 126 const Fac2 m_alpha2;
Chris@16 127 const Fac3 m_alpha3;
Chris@16 128 const Fac4 m_alpha4;
Chris@16 129
Chris@16 130 scale_sum4( Fac1 alpha1 , Fac2 alpha2 , Fac3 alpha3 , Fac4 alpha4 )
Chris@16 131 : m_alpha1( alpha1 ) , m_alpha2( alpha2 ) , m_alpha3( alpha3 ) , m_alpha4( alpha4 ) { }
Chris@16 132
Chris@16 133 template< class T1 , class T2 , class T3 , class T4 , class T5 >
Chris@16 134 void operator()( viennacl::vector<T1> &v1 ,
Chris@16 135 const viennacl::vector<T2> &v2 ,
Chris@16 136 const viennacl::vector<T3> &v3 ,
Chris@16 137 const viennacl::vector<T4> &v4 ,
Chris@16 138 const viennacl::vector<T5> &v5
Chris@16 139 ) const
Chris@16 140 {
Chris@16 141 using namespace viennacl;
Chris@16 142
Chris@16 143 static generator::symbolic_vector <0, T1> sym_v1;
Chris@16 144 static generator::symbolic_vector <1, T2> sym_v2;
Chris@16 145 static generator::symbolic_vector <2, T3> sym_v3;
Chris@16 146 static generator::symbolic_vector <3, T4> sym_v4;
Chris@16 147 static generator::symbolic_vector <4, T5> sym_v5;
Chris@16 148 static generator::cpu_symbolic_scalar<5, Fac1> sym_a1;
Chris@16 149 static generator::cpu_symbolic_scalar<6, Fac2> sym_a2;
Chris@16 150 static generator::cpu_symbolic_scalar<7, Fac3> sym_a3;
Chris@16 151 static generator::cpu_symbolic_scalar<8, Fac4> sym_a4;
Chris@16 152
Chris@16 153 static generator::custom_operation op(
Chris@16 154 sym_v1 = sym_a1 * sym_v2
Chris@16 155 + sym_a2 * sym_v3
Chris@16 156 + sym_a3 * sym_v4
Chris@16 157 + sym_a4 * sym_v5
Chris@16 158 );
Chris@16 159
Chris@16 160 ocl::enqueue( op(v1,
Chris@16 161 const_cast< viennacl::vector<T2>& >(v2),
Chris@16 162 const_cast< viennacl::vector<T3>& >(v3),
Chris@16 163 const_cast< viennacl::vector<T4>& >(v4),
Chris@16 164 const_cast< viennacl::vector<T5>& >(v5),
Chris@16 165 const_cast< Fac1& >(m_alpha1),
Chris@16 166 const_cast< Fac2& >(m_alpha2),
Chris@16 167 const_cast< Fac3& >(m_alpha3),
Chris@16 168 const_cast< Fac4& >(m_alpha4)
Chris@16 169 ) );
Chris@16 170 }
Chris@16 171
Chris@16 172 typedef void result_type;
Chris@16 173 };
Chris@16 174
Chris@16 175
Chris@16 176 template< class Fac1 = double , class Fac2 = Fac1 , class Fac3 = Fac2 , class Fac4 = Fac3 , class Fac5 = Fac4 >
Chris@16 177 struct scale_sum5
Chris@16 178 {
Chris@16 179 const Fac1 m_alpha1;
Chris@16 180 const Fac2 m_alpha2;
Chris@16 181 const Fac3 m_alpha3;
Chris@16 182 const Fac4 m_alpha4;
Chris@16 183 const Fac5 m_alpha5;
Chris@16 184
Chris@16 185 scale_sum5( Fac1 alpha1 , Fac2 alpha2 , Fac3 alpha3 , Fac4 alpha4 , Fac5 alpha5 )
Chris@16 186 : m_alpha1( alpha1 ) , m_alpha2( alpha2 ) , m_alpha3( alpha3 ) , m_alpha4( alpha4 ) , m_alpha5( alpha5 ) { }
Chris@16 187
Chris@16 188 template< class T1 , class T2 , class T3 , class T4 , class T5 , class T6 >
Chris@16 189 void operator()( viennacl::vector<T1> &v1 ,
Chris@16 190 const viennacl::vector<T2> &v2 ,
Chris@16 191 const viennacl::vector<T3> &v3 ,
Chris@16 192 const viennacl::vector<T4> &v4 ,
Chris@16 193 const viennacl::vector<T5> &v5 ,
Chris@16 194 const viennacl::vector<T6> &v6
Chris@16 195 ) const
Chris@16 196 {
Chris@16 197 using namespace viennacl;
Chris@16 198
Chris@16 199 static generator::symbolic_vector < 0, T1> sym_v1;
Chris@16 200 static generator::symbolic_vector < 1, T2> sym_v2;
Chris@16 201 static generator::symbolic_vector < 2, T3> sym_v3;
Chris@16 202 static generator::symbolic_vector < 3, T4> sym_v4;
Chris@16 203 static generator::symbolic_vector < 4, T5> sym_v5;
Chris@16 204 static generator::symbolic_vector < 5, T6> sym_v6;
Chris@16 205 static generator::cpu_symbolic_scalar< 6, Fac1> sym_a1;
Chris@16 206 static generator::cpu_symbolic_scalar< 7, Fac2> sym_a2;
Chris@16 207 static generator::cpu_symbolic_scalar< 8, Fac3> sym_a3;
Chris@16 208 static generator::cpu_symbolic_scalar< 9, Fac4> sym_a4;
Chris@16 209 static generator::cpu_symbolic_scalar<10, Fac5> sym_a5;
Chris@16 210
Chris@16 211 static generator::custom_operation op(
Chris@16 212 sym_v1 = sym_a1 * sym_v2
Chris@16 213 + sym_a2 * sym_v3
Chris@16 214 + sym_a3 * sym_v4
Chris@16 215 + sym_a4 * sym_v5
Chris@16 216 + sym_a5 * sym_v6
Chris@16 217 );
Chris@16 218
Chris@16 219 ocl::enqueue( op(v1,
Chris@16 220 const_cast< viennacl::vector<T2>& >(v2),
Chris@16 221 const_cast< viennacl::vector<T3>& >(v3),
Chris@16 222 const_cast< viennacl::vector<T4>& >(v4),
Chris@16 223 const_cast< viennacl::vector<T5>& >(v5),
Chris@16 224 const_cast< viennacl::vector<T6>& >(v6),
Chris@16 225 const_cast< Fac1& >(m_alpha1),
Chris@16 226 const_cast< Fac2& >(m_alpha2),
Chris@16 227 const_cast< Fac3& >(m_alpha3),
Chris@16 228 const_cast< Fac4& >(m_alpha4),
Chris@16 229 const_cast< Fac5& >(m_alpha5)
Chris@16 230 ) );
Chris@16 231 }
Chris@16 232
Chris@16 233 typedef void result_type;
Chris@16 234 };
Chris@16 235
Chris@16 236
Chris@16 237 };
Chris@16 238
Chris@16 239
Chris@16 240 } // odeint
Chris@16 241 } // numeric
Chris@16 242 } // boost
Chris@16 243
Chris@16 244
Chris@16 245 #endif // BOOST_NUMERIC_ODEINT_EXTERNAL_VIENNACL_VIENNACL_OPERATIONS_HPP_INCLUDED