Chris@16: /* Chris@16: [auto_generated] Chris@16: boost/numeric/odeint/external/viennacl_operations.hpp Chris@16: Chris@16: [begin_description] Chris@16: ViennaCL operations. Chris@16: [end_description] Chris@16: Chris@101: Copyright 2012 Denis Demidov Chris@101: Copyright 2012 Karsten Ahnert Chris@101: Copyright 2012 Mario Mulansky Chris@16: Chris@16: Distributed under the Boost Software License, Version 1.0. Chris@16: (See accompanying file LICENSE_1_0.txt or Chris@16: copy at http://www.boost.org/LICENSE_1_0.txt) Chris@16: */ Chris@16: Chris@16: Chris@16: #ifndef BOOST_NUMERIC_ODEINT_EXTERNAL_VIENNACL_VIENNACL_OPERATIONS_HPP_INCLUDED Chris@16: #define BOOST_NUMERIC_ODEINT_EXTERNAL_VIENNACL_VIENNACL_OPERATIONS_HPP_INCLUDED Chris@16: Chris@16: #include Chris@101: Chris@101: #ifdef VIENNACL_WITH_OPENCL Chris@101: # include Chris@101: #endif Chris@16: Chris@16: namespace boost { Chris@16: namespace numeric { Chris@16: namespace odeint { Chris@16: Chris@16: Chris@101: #ifdef VIENNACL_WITH_OPENCL Chris@16: struct viennacl_operations Chris@16: { Chris@16: Chris@16: template< class Fac1 = double , class Fac2 = Fac1 > Chris@16: struct scale_sum2 Chris@16: { Chris@16: const Fac1 m_alpha1; Chris@16: const Fac2 m_alpha2; Chris@16: Chris@16: scale_sum2( Fac1 alpha1 , Fac2 alpha2 ) Chris@16: : m_alpha1( alpha1 ) , m_alpha2( alpha2 ) Chris@16: { } Chris@16: Chris@16: template< class T1 , class T2 , class T3 > Chris@16: void operator()( viennacl::vector &v1 , Chris@16: const viennacl::vector &v2 , Chris@16: const viennacl::vector &v3 Chris@16: ) const Chris@16: { Chris@16: using namespace viennacl; Chris@16: Chris@16: static generator::symbolic_vector <0, T1> sym_v1; Chris@16: static generator::symbolic_vector <1, T2> sym_v2; Chris@16: static generator::symbolic_vector <2, T3> sym_v3; Chris@16: static generator::cpu_symbolic_scalar<3, Fac1> sym_a1; Chris@16: static generator::cpu_symbolic_scalar<4, Fac2> sym_a2; Chris@16: Chris@16: static generator::custom_operation op( Chris@16: sym_v1 = sym_a1 * sym_v2 Chris@101: + sym_a2 * sym_v3, Chris@101: "scale_sum2" Chris@16: ); Chris@16: Chris@101: ocl::enqueue( op(v1, v2, v3, m_alpha1, m_alpha2) ); Chris@16: } Chris@16: Chris@16: typedef void result_type; Chris@16: }; Chris@16: Chris@16: Chris@16: template< class Fac1 = double , class Fac2 = Fac1 , class Fac3 = Fac2 > Chris@16: struct scale_sum3 Chris@16: { Chris@16: const Fac1 m_alpha1; Chris@16: const Fac2 m_alpha2; Chris@16: const Fac3 m_alpha3; Chris@16: Chris@16: scale_sum3( Fac1 alpha1 , Fac2 alpha2 , Fac3 alpha3 ) Chris@16: : m_alpha1( alpha1 ) , m_alpha2( alpha2 ) , m_alpha3( alpha3 ) Chris@16: { } Chris@16: Chris@16: template< class T1 , class T2 , class T3 , class T4 > Chris@16: void operator()( viennacl::vector &v1 , Chris@16: const viennacl::vector &v2 , Chris@16: const viennacl::vector &v3 , Chris@16: const viennacl::vector &v4 Chris@16: ) const Chris@16: { Chris@16: using namespace viennacl; Chris@16: Chris@16: static generator::symbolic_vector <0, T1> sym_v1; Chris@16: static generator::symbolic_vector <1, T2> sym_v2; Chris@16: static generator::symbolic_vector <2, T3> sym_v3; Chris@16: static generator::symbolic_vector <3, T4> sym_v4; Chris@16: static generator::cpu_symbolic_scalar<4, Fac1> sym_a1; Chris@16: static generator::cpu_symbolic_scalar<5, Fac2> sym_a2; Chris@16: static generator::cpu_symbolic_scalar<6, Fac3> sym_a3; Chris@16: Chris@16: static generator::custom_operation op( Chris@16: sym_v1 = sym_a1 * sym_v2 Chris@16: + sym_a2 * sym_v3 Chris@101: + sym_a3 * sym_v4, Chris@101: "scale_sum3" Chris@16: ); Chris@16: Chris@101: ocl::enqueue( op(v1, v2, v3, v4, m_alpha1, m_alpha2, m_alpha3) ); Chris@16: } Chris@16: Chris@16: typedef void result_type; Chris@16: }; Chris@16: Chris@16: Chris@16: template< class Fac1 = double , class Fac2 = Fac1 , class Fac3 = Fac2 , class Fac4 = Fac3 > Chris@16: struct scale_sum4 Chris@16: { Chris@16: const Fac1 m_alpha1; Chris@16: const Fac2 m_alpha2; Chris@16: const Fac3 m_alpha3; Chris@16: const Fac4 m_alpha4; Chris@16: Chris@16: scale_sum4( Fac1 alpha1 , Fac2 alpha2 , Fac3 alpha3 , Fac4 alpha4 ) Chris@16: : m_alpha1( alpha1 ) , m_alpha2( alpha2 ) , m_alpha3( alpha3 ) , m_alpha4( alpha4 ) { } Chris@16: Chris@16: template< class T1 , class T2 , class T3 , class T4 , class T5 > Chris@16: void operator()( viennacl::vector &v1 , Chris@16: const viennacl::vector &v2 , Chris@16: const viennacl::vector &v3 , Chris@16: const viennacl::vector &v4 , Chris@16: const viennacl::vector &v5 Chris@16: ) const Chris@16: { Chris@16: using namespace viennacl; Chris@16: Chris@16: static generator::symbolic_vector <0, T1> sym_v1; Chris@16: static generator::symbolic_vector <1, T2> sym_v2; Chris@16: static generator::symbolic_vector <2, T3> sym_v3; Chris@16: static generator::symbolic_vector <3, T4> sym_v4; Chris@16: static generator::symbolic_vector <4, T5> sym_v5; Chris@16: static generator::cpu_symbolic_scalar<5, Fac1> sym_a1; Chris@16: static generator::cpu_symbolic_scalar<6, Fac2> sym_a2; Chris@16: static generator::cpu_symbolic_scalar<7, Fac3> sym_a3; Chris@16: static generator::cpu_symbolic_scalar<8, Fac4> sym_a4; Chris@16: Chris@16: static generator::custom_operation op( Chris@16: sym_v1 = sym_a1 * sym_v2 Chris@16: + sym_a2 * sym_v3 Chris@16: + sym_a3 * sym_v4 Chris@101: + sym_a4 * sym_v5, Chris@101: "scale_sum4" Chris@16: ); Chris@16: Chris@101: ocl::enqueue( op(v1, v2, v3, v4, v5, Chris@101: m_alpha1, m_alpha2, m_alpha3, m_alpha4) ); Chris@16: } Chris@16: Chris@16: typedef void result_type; Chris@16: }; Chris@16: Chris@16: Chris@16: template< class Fac1 = double , class Fac2 = Fac1 , class Fac3 = Fac2 , class Fac4 = Fac3 , class Fac5 = Fac4 > Chris@16: struct scale_sum5 Chris@16: { Chris@16: const Fac1 m_alpha1; Chris@16: const Fac2 m_alpha2; Chris@16: const Fac3 m_alpha3; Chris@16: const Fac4 m_alpha4; Chris@16: const Fac5 m_alpha5; Chris@16: Chris@16: scale_sum5( Fac1 alpha1 , Fac2 alpha2 , Fac3 alpha3 , Fac4 alpha4 , Fac5 alpha5 ) Chris@16: : m_alpha1( alpha1 ) , m_alpha2( alpha2 ) , m_alpha3( alpha3 ) , m_alpha4( alpha4 ) , m_alpha5( alpha5 ) { } Chris@16: Chris@16: template< class T1 , class T2 , class T3 , class T4 , class T5 , class T6 > Chris@16: void operator()( viennacl::vector &v1 , Chris@16: const viennacl::vector &v2 , Chris@16: const viennacl::vector &v3 , Chris@16: const viennacl::vector &v4 , Chris@16: const viennacl::vector &v5 , Chris@16: const viennacl::vector &v6 Chris@16: ) const Chris@16: { Chris@16: using namespace viennacl; Chris@16: Chris@16: static generator::symbolic_vector < 0, T1> sym_v1; Chris@16: static generator::symbolic_vector < 1, T2> sym_v2; Chris@16: static generator::symbolic_vector < 2, T3> sym_v3; Chris@16: static generator::symbolic_vector < 3, T4> sym_v4; Chris@16: static generator::symbolic_vector < 4, T5> sym_v5; Chris@16: static generator::symbolic_vector < 5, T6> sym_v6; Chris@16: static generator::cpu_symbolic_scalar< 6, Fac1> sym_a1; Chris@16: static generator::cpu_symbolic_scalar< 7, Fac2> sym_a2; Chris@16: static generator::cpu_symbolic_scalar< 8, Fac3> sym_a3; Chris@16: static generator::cpu_symbolic_scalar< 9, Fac4> sym_a4; Chris@16: static generator::cpu_symbolic_scalar<10, Fac5> sym_a5; Chris@16: Chris@16: static generator::custom_operation op( Chris@16: sym_v1 = sym_a1 * sym_v2 Chris@16: + sym_a2 * sym_v3 Chris@16: + sym_a3 * sym_v4 Chris@16: + sym_a4 * sym_v5 Chris@101: + sym_a5 * sym_v6, Chris@101: "scale_sum5" Chris@16: ); Chris@16: Chris@101: ocl::enqueue( op(v1, v2, v3, v4, v5, v6, Chris@101: m_alpha1, m_alpha2, m_alpha3, m_alpha4, m_alpha5) ); Chris@16: } Chris@16: Chris@16: typedef void result_type; Chris@16: }; Chris@16: Chris@16: Chris@16: }; Chris@101: #else Chris@101: struct viennacl_operations : public default_operations {}; Chris@101: #endif Chris@16: Chris@16: Chris@16: } // odeint Chris@16: } // numeric Chris@16: } // boost Chris@16: Chris@16: Chris@16: #endif // BOOST_NUMERIC_ODEINT_EXTERNAL_VIENNACL_VIENNACL_OPERATIONS_HPP_INCLUDED