3 boost/numeric/odeint/external/thrust/thrust_operations.hpp
6 Operations of thrust zipped iterators. Is the counterpart of the thrust_algebra.
9 Copyright 2010-2013 Mario Mulansky
10 Copyright 2010-2012 Karsten Ahnert
12 Distributed under the Boost Software License, Version 1.0.
13 (See accompanying file LICENSE_1_0.txt or
14 copy at http://www.boost.org/LICENSE_1_0.txt)
18 #ifndef BOOST_NUMERIC_ODEINT_EXTERNAL_THRUST_THRUST_OPERATIONS_HPP_INCLUDED
19 #define BOOST_NUMERIC_ODEINT_EXTERNAL_THRUST_THRUST_OPERATIONS_HPP_INCLUDED
25 #include <thrust/tuple.h>
26 #include <thrust/iterator/zip_iterator.h>
28 /**ToDo extend to scale_sum13 for rk78 */
30 struct thrust_operations
32 template< class Fac1 = double , class Fac2 = Fac1 >
38 scale_sum2( const Fac1 alpha1 , const Fac2 alpha2 )
39 : m_alpha1( alpha1 ) , m_alpha2( alpha2 ) { }
41 template< class Tuple >
43 void operator()( Tuple t ) const
45 thrust::get<0>(t) = m_alpha1 * thrust::get<1>(t) + m_alpha2 * thrust::get<2>(t);
49 template< class Fac1 = double , class Fac2 = Fac1 >
50 struct scale_sum_swap2
55 scale_sum_swap2( const Fac1 alpha1 , const Fac2 alpha2 )
56 : m_alpha1( alpha1 ) , m_alpha2( alpha2 ) { }
58 template< class Tuple >
60 void operator()( Tuple t ) const
62 typename thrust::tuple_element<0,Tuple>::type tmp = thrust::get<0>(t);
63 thrust::get<0>(t) = m_alpha1 * thrust::get<1>(t) + m_alpha2 * thrust::get<2>(t);
64 thrust::get<1>(t) = tmp;
68 template< class Fac1 = double , class Fac2 = Fac1 , class Fac3 = Fac2 >
75 scale_sum3( const Fac1 alpha1 , const Fac2 alpha2 , const Fac3 alpha3 )
76 : m_alpha1( alpha1 ) , m_alpha2( alpha2 ) , m_alpha3( alpha3 ) { }
78 template< class Tuple >
80 void operator()( Tuple t ) const
82 thrust::get<0>(t) = m_alpha1 * thrust::get<1>(t) +
83 m_alpha2 * thrust::get<2>(t) +
84 m_alpha3 * thrust::get<3>(t);
89 template< class Fac1 = double , class Fac2 = Fac1 , class Fac3 = Fac2 , class Fac4 = Fac3 >
97 scale_sum4( const Fac1 alpha1 , const Fac2 alpha2 , const Fac3 alpha3 , const Fac4 alpha4 )
98 : m_alpha1( alpha1 ) , m_alpha2( alpha2 ) , m_alpha3( alpha3 ) , m_alpha4( alpha4 ){ }
100 template< class Tuple >
102 void operator()( Tuple t ) const
104 thrust::get<0>(t) = m_alpha1 * thrust::get<1>(t) +
105 m_alpha2 * thrust::get<2>(t) +
106 m_alpha3 * thrust::get<3>(t) +
107 m_alpha4 * thrust::get<4>(t);
112 template< class Fac1 = double , class Fac2 = Fac1 , class Fac3 = Fac2 ,
113 class Fac4 = Fac3 , class Fac5 = Fac4 >
122 scale_sum5( const Fac1 alpha1 , const Fac2 alpha2 , const Fac3 alpha3 ,
123 const Fac4 alpha4 , const Fac5 alpha5 )
124 : m_alpha1( alpha1 ) , m_alpha2( alpha2 ) , m_alpha3( alpha3 ) ,
125 m_alpha4( alpha4 ) , m_alpha5( alpha5 ) { }
127 template< class Tuple >
129 void operator()( Tuple t ) const
131 thrust::get<0>(t) = m_alpha1 * thrust::get<1>(t) +
132 m_alpha2 * thrust::get<2>(t) +
133 m_alpha3 * thrust::get<3>(t) +
134 m_alpha4 * thrust::get<4>(t) +
135 m_alpha5 * thrust::get<5>(t);
140 template< class Fac1 = double , class Fac2 = Fac1 , class Fac3 = Fac2 ,
141 class Fac4 = Fac3 , class Fac5 = Fac4 , class Fac6 = Fac5 >
151 scale_sum6( const Fac1 alpha1 , const Fac2 alpha2 , const Fac3 alpha3 ,
152 const Fac4 alpha4 , const Fac5 alpha5 , const Fac6 alpha6 )
153 : m_alpha1( alpha1 ) , m_alpha2( alpha2 ) , m_alpha3( alpha3 ) ,
154 m_alpha4( alpha4 ) , m_alpha5( alpha5 ) , m_alpha6( alpha6 ) { }
156 template< class Tuple >
158 void operator()( Tuple t ) const
160 thrust::get<0>(t) = m_alpha1 * thrust::get<1>(t) +
161 m_alpha2 * thrust::get<2>(t) +
162 m_alpha3 * thrust::get<3>(t) +
163 m_alpha4 * thrust::get<4>(t) +
164 m_alpha5 * thrust::get<5>(t) +
165 m_alpha6 * thrust::get<6>(t);
170 template< class Fac1 = double , class Fac2 = Fac1 , class Fac3 = Fac2 , class Fac4 = Fac3 ,
171 class Fac5 = Fac4 , class Fac6 = Fac5 , class Fac7 = Fac6 >
182 scale_sum7( const Fac1 alpha1 , const Fac2 alpha2 , const Fac3 alpha3 ,
183 const Fac4 alpha4 , const Fac5 alpha5 , const Fac6 alpha6 , const Fac7 alpha7 )
184 : m_alpha1( alpha1 ) , m_alpha2( alpha2 ) , m_alpha3( alpha3 ) ,
185 m_alpha4( alpha4 ) , m_alpha5( alpha5 ) , m_alpha6( alpha6 ) , m_alpha7( alpha7 ) { }
187 template< class Tuple >
189 void operator()( Tuple t ) const
191 thrust::get<0>(t) = m_alpha1 * thrust::get<1>(t) +
192 m_alpha2 * thrust::get<2>(t) +
193 m_alpha3 * thrust::get<3>(t) +
194 m_alpha4 * thrust::get<4>(t) +
195 m_alpha5 * thrust::get<5>(t) +
196 m_alpha6 * thrust::get<6>(t) +
197 m_alpha7 * thrust::get<7>(t) ;
204 template< class Fac1 = double >
207 const Fac1 m_eps_abs , m_eps_rel , m_a_x , m_a_dxdt;
209 rel_error( const Fac1 eps_abs , const Fac1 eps_rel , const Fac1 a_x , const Fac1 a_dxdt )
210 : m_eps_abs( eps_abs ) , m_eps_rel( eps_rel ) , m_a_x( a_x ) , m_a_dxdt( a_dxdt ) { }
213 template< class Tuple >
215 void operator()( Tuple t ) const
218 thrust::get< 0 >( t ) = abs( thrust::get< 0 >( t ) ) /
219 ( m_eps_abs + m_eps_rel * ( m_a_x * abs( thrust::get< 1 >( t ) + m_a_dxdt * abs( thrust::get< 2 >( t ) ) ) ) );
222 typedef void result_type;
233 #endif // BOOST_NUMERIC_ODEINT_EXTERNAL_THRUST_THRUST_OPERATIONS_HPP_INCLUDED