Chris@16
|
1 /*
|
Chris@16
|
2 [auto_generated]
|
Chris@16
|
3 boost/numeric/odeint/external/thrust/thrust_operations.hpp
|
Chris@16
|
4
|
Chris@16
|
5 [begin_description]
|
Chris@16
|
6 Operations of thrust zipped iterators. Is the counterpart of the thrust_algebra.
|
Chris@16
|
7 [end_description]
|
Chris@16
|
8
|
Chris@101
|
9 Copyright 2010-2013 Mario Mulansky
|
Chris@101
|
10 Copyright 2010-2012 Karsten Ahnert
|
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_THRUST_THRUST_OPERATIONS_HPP_INCLUDED
|
Chris@16
|
19 #define BOOST_NUMERIC_ODEINT_EXTERNAL_THRUST_THRUST_OPERATIONS_HPP_INCLUDED
|
Chris@16
|
20
|
Chris@16
|
21 namespace boost {
|
Chris@16
|
22 namespace numeric {
|
Chris@16
|
23 namespace odeint {
|
Chris@16
|
24
|
Chris@16
|
25 #include <thrust/tuple.h>
|
Chris@16
|
26 #include <thrust/iterator/zip_iterator.h>
|
Chris@16
|
27
|
Chris@16
|
28 /**ToDo extend to scale_sum13 for rk78 */
|
Chris@16
|
29
|
Chris@16
|
30 struct thrust_operations
|
Chris@16
|
31 {
|
Chris@16
|
32 template< class Fac1 = double , class Fac2 = Fac1 >
|
Chris@16
|
33 struct scale_sum2
|
Chris@16
|
34 {
|
Chris@16
|
35 const Fac1 m_alpha1;
|
Chris@16
|
36 const Fac2 m_alpha2;
|
Chris@16
|
37
|
Chris@16
|
38 scale_sum2( const Fac1 alpha1 , const Fac2 alpha2 )
|
Chris@16
|
39 : m_alpha1( alpha1 ) , m_alpha2( alpha2 ) { }
|
Chris@16
|
40
|
Chris@16
|
41 template< class Tuple >
|
Chris@16
|
42 __host__ __device__
|
Chris@16
|
43 void operator()( Tuple t ) const
|
Chris@16
|
44 {
|
Chris@16
|
45 thrust::get<0>(t) = m_alpha1 * thrust::get<1>(t) + m_alpha2 * thrust::get<2>(t);
|
Chris@16
|
46 }
|
Chris@16
|
47 };
|
Chris@16
|
48
|
Chris@16
|
49 template< class Fac1 = double , class Fac2 = Fac1 >
|
Chris@16
|
50 struct scale_sum_swap2
|
Chris@16
|
51 {
|
Chris@16
|
52 const Fac1 m_alpha1;
|
Chris@16
|
53 const Fac2 m_alpha2;
|
Chris@16
|
54
|
Chris@16
|
55 scale_sum_swap2( const Fac1 alpha1 , const Fac2 alpha2 )
|
Chris@16
|
56 : m_alpha1( alpha1 ) , m_alpha2( alpha2 ) { }
|
Chris@16
|
57
|
Chris@16
|
58 template< class Tuple >
|
Chris@16
|
59 __host__ __device__
|
Chris@16
|
60 void operator()( Tuple t ) const
|
Chris@16
|
61 {
|
Chris@16
|
62 typename thrust::tuple_element<0,Tuple>::type tmp = thrust::get<0>(t);
|
Chris@16
|
63 thrust::get<0>(t) = m_alpha1 * thrust::get<1>(t) + m_alpha2 * thrust::get<2>(t);
|
Chris@16
|
64 thrust::get<1>(t) = tmp;
|
Chris@16
|
65 }
|
Chris@16
|
66 };
|
Chris@16
|
67
|
Chris@16
|
68 template< class Fac1 = double , class Fac2 = Fac1 , class Fac3 = Fac2 >
|
Chris@16
|
69 struct scale_sum3
|
Chris@16
|
70 {
|
Chris@16
|
71 const Fac1 m_alpha1;
|
Chris@16
|
72 const Fac2 m_alpha2;
|
Chris@16
|
73 const Fac3 m_alpha3;
|
Chris@16
|
74
|
Chris@16
|
75 scale_sum3( const Fac1 alpha1 , const Fac2 alpha2 , const Fac3 alpha3 )
|
Chris@16
|
76 : m_alpha1( alpha1 ) , m_alpha2( alpha2 ) , m_alpha3( alpha3 ) { }
|
Chris@16
|
77
|
Chris@16
|
78 template< class Tuple >
|
Chris@16
|
79 __host__ __device__
|
Chris@16
|
80 void operator()( Tuple t ) const
|
Chris@16
|
81 {
|
Chris@16
|
82 thrust::get<0>(t) = m_alpha1 * thrust::get<1>(t) +
|
Chris@16
|
83 m_alpha2 * thrust::get<2>(t) +
|
Chris@16
|
84 m_alpha3 * thrust::get<3>(t);
|
Chris@16
|
85 }
|
Chris@16
|
86 };
|
Chris@16
|
87
|
Chris@16
|
88
|
Chris@16
|
89 template< class Fac1 = double , class Fac2 = Fac1 , class Fac3 = Fac2 , class Fac4 = Fac3 >
|
Chris@16
|
90 struct scale_sum4
|
Chris@16
|
91 {
|
Chris@16
|
92 const Fac1 m_alpha1;
|
Chris@16
|
93 const Fac2 m_alpha2;
|
Chris@16
|
94 const Fac3 m_alpha3;
|
Chris@16
|
95 const Fac4 m_alpha4;
|
Chris@16
|
96
|
Chris@16
|
97 scale_sum4( const Fac1 alpha1 , const Fac2 alpha2 , const Fac3 alpha3 , const Fac4 alpha4 )
|
Chris@16
|
98 : m_alpha1( alpha1 ) , m_alpha2( alpha2 ) , m_alpha3( alpha3 ) , m_alpha4( alpha4 ){ }
|
Chris@16
|
99
|
Chris@16
|
100 template< class Tuple >
|
Chris@16
|
101 __host__ __device__
|
Chris@16
|
102 void operator()( Tuple t ) const
|
Chris@16
|
103 {
|
Chris@16
|
104 thrust::get<0>(t) = m_alpha1 * thrust::get<1>(t) +
|
Chris@16
|
105 m_alpha2 * thrust::get<2>(t) +
|
Chris@16
|
106 m_alpha3 * thrust::get<3>(t) +
|
Chris@16
|
107 m_alpha4 * thrust::get<4>(t);
|
Chris@16
|
108 }
|
Chris@16
|
109 };
|
Chris@16
|
110
|
Chris@16
|
111
|
Chris@16
|
112 template< class Fac1 = double , class Fac2 = Fac1 , class Fac3 = Fac2 ,
|
Chris@16
|
113 class Fac4 = Fac3 , class Fac5 = Fac4 >
|
Chris@16
|
114 struct scale_sum5
|
Chris@16
|
115 {
|
Chris@16
|
116 const Fac1 m_alpha1;
|
Chris@16
|
117 const Fac2 m_alpha2;
|
Chris@16
|
118 const Fac3 m_alpha3;
|
Chris@16
|
119 const Fac4 m_alpha4;
|
Chris@16
|
120 const Fac5 m_alpha5;
|
Chris@16
|
121
|
Chris@16
|
122 scale_sum5( const Fac1 alpha1 , const Fac2 alpha2 , const Fac3 alpha3 ,
|
Chris@16
|
123 const Fac4 alpha4 , const Fac5 alpha5 )
|
Chris@16
|
124 : m_alpha1( alpha1 ) , m_alpha2( alpha2 ) , m_alpha3( alpha3 ) ,
|
Chris@16
|
125 m_alpha4( alpha4 ) , m_alpha5( alpha5 ) { }
|
Chris@16
|
126
|
Chris@16
|
127 template< class Tuple >
|
Chris@16
|
128 __host__ __device__
|
Chris@16
|
129 void operator()( Tuple t ) const
|
Chris@16
|
130 {
|
Chris@16
|
131 thrust::get<0>(t) = m_alpha1 * thrust::get<1>(t) +
|
Chris@16
|
132 m_alpha2 * thrust::get<2>(t) +
|
Chris@16
|
133 m_alpha3 * thrust::get<3>(t) +
|
Chris@16
|
134 m_alpha4 * thrust::get<4>(t) +
|
Chris@16
|
135 m_alpha5 * thrust::get<5>(t);
|
Chris@16
|
136 }
|
Chris@16
|
137 };
|
Chris@16
|
138
|
Chris@16
|
139
|
Chris@16
|
140 template< class Fac1 = double , class Fac2 = Fac1 , class Fac3 = Fac2 ,
|
Chris@16
|
141 class Fac4 = Fac3 , class Fac5 = Fac4 , class Fac6 = Fac5 >
|
Chris@16
|
142 struct scale_sum6
|
Chris@16
|
143 {
|
Chris@16
|
144 const Fac1 m_alpha1;
|
Chris@16
|
145 const Fac2 m_alpha2;
|
Chris@16
|
146 const Fac3 m_alpha3;
|
Chris@16
|
147 const Fac4 m_alpha4;
|
Chris@16
|
148 const Fac5 m_alpha5;
|
Chris@16
|
149 const Fac6 m_alpha6;
|
Chris@16
|
150
|
Chris@16
|
151 scale_sum6( const Fac1 alpha1 , const Fac2 alpha2 , const Fac3 alpha3 ,
|
Chris@16
|
152 const Fac4 alpha4 , const Fac5 alpha5 , const Fac6 alpha6 )
|
Chris@16
|
153 : m_alpha1( alpha1 ) , m_alpha2( alpha2 ) , m_alpha3( alpha3 ) ,
|
Chris@16
|
154 m_alpha4( alpha4 ) , m_alpha5( alpha5 ) , m_alpha6( alpha6 ) { }
|
Chris@16
|
155
|
Chris@16
|
156 template< class Tuple >
|
Chris@16
|
157 __host__ __device__
|
Chris@16
|
158 void operator()( Tuple t ) const
|
Chris@16
|
159 {
|
Chris@16
|
160 thrust::get<0>(t) = m_alpha1 * thrust::get<1>(t) +
|
Chris@16
|
161 m_alpha2 * thrust::get<2>(t) +
|
Chris@16
|
162 m_alpha3 * thrust::get<3>(t) +
|
Chris@16
|
163 m_alpha4 * thrust::get<4>(t) +
|
Chris@16
|
164 m_alpha5 * thrust::get<5>(t) +
|
Chris@16
|
165 m_alpha6 * thrust::get<6>(t);
|
Chris@16
|
166 }
|
Chris@16
|
167 };
|
Chris@16
|
168
|
Chris@16
|
169
|
Chris@16
|
170 template< class Fac1 = double , class Fac2 = Fac1 , class Fac3 = Fac2 , class Fac4 = Fac3 ,
|
Chris@16
|
171 class Fac5 = Fac4 , class Fac6 = Fac5 , class Fac7 = Fac6 >
|
Chris@16
|
172 struct scale_sum7
|
Chris@16
|
173 {
|
Chris@16
|
174 const Fac1 m_alpha1;
|
Chris@16
|
175 const Fac2 m_alpha2;
|
Chris@16
|
176 const Fac3 m_alpha3;
|
Chris@16
|
177 const Fac4 m_alpha4;
|
Chris@16
|
178 const Fac5 m_alpha5;
|
Chris@16
|
179 const Fac6 m_alpha6;
|
Chris@16
|
180 const Fac7 m_alpha7;
|
Chris@16
|
181
|
Chris@16
|
182 scale_sum7( const Fac1 alpha1 , const Fac2 alpha2 , const Fac3 alpha3 ,
|
Chris@16
|
183 const Fac4 alpha4 , const Fac5 alpha5 , const Fac6 alpha6 , const Fac7 alpha7 )
|
Chris@16
|
184 : m_alpha1( alpha1 ) , m_alpha2( alpha2 ) , m_alpha3( alpha3 ) ,
|
Chris@16
|
185 m_alpha4( alpha4 ) , m_alpha5( alpha5 ) , m_alpha6( alpha6 ) , m_alpha7( alpha7 ) { }
|
Chris@16
|
186
|
Chris@16
|
187 template< class Tuple >
|
Chris@16
|
188 __host__ __device__
|
Chris@16
|
189 void operator()( Tuple t ) const
|
Chris@16
|
190 {
|
Chris@16
|
191 thrust::get<0>(t) = m_alpha1 * thrust::get<1>(t) +
|
Chris@16
|
192 m_alpha2 * thrust::get<2>(t) +
|
Chris@16
|
193 m_alpha3 * thrust::get<3>(t) +
|
Chris@16
|
194 m_alpha4 * thrust::get<4>(t) +
|
Chris@16
|
195 m_alpha5 * thrust::get<5>(t) +
|
Chris@16
|
196 m_alpha6 * thrust::get<6>(t) +
|
Chris@16
|
197 m_alpha7 * thrust::get<7>(t) ;
|
Chris@16
|
198 }
|
Chris@16
|
199 };
|
Chris@16
|
200
|
Chris@16
|
201
|
Chris@16
|
202
|
Chris@16
|
203
|
Chris@16
|
204 template< class Fac1 = double >
|
Chris@16
|
205 struct rel_error
|
Chris@16
|
206 {
|
Chris@16
|
207 const Fac1 m_eps_abs , m_eps_rel , m_a_x , m_a_dxdt;
|
Chris@16
|
208
|
Chris@16
|
209 rel_error( const Fac1 eps_abs , const Fac1 eps_rel , const Fac1 a_x , const Fac1 a_dxdt )
|
Chris@16
|
210 : m_eps_abs( eps_abs ) , m_eps_rel( eps_rel ) , m_a_x( a_x ) , m_a_dxdt( a_dxdt ) { }
|
Chris@16
|
211
|
Chris@16
|
212
|
Chris@16
|
213 template< class Tuple >
|
Chris@16
|
214 __host__ __device__
|
Chris@16
|
215 void operator()( Tuple t ) const
|
Chris@16
|
216 {
|
Chris@16
|
217 using std::abs;
|
Chris@16
|
218 thrust::get< 0 >( t ) = abs( thrust::get< 0 >( t ) ) /
|
Chris@16
|
219 ( m_eps_abs + m_eps_rel * ( m_a_x * abs( thrust::get< 1 >( t ) + m_a_dxdt * abs( thrust::get< 2 >( t ) ) ) ) );
|
Chris@16
|
220 }
|
Chris@16
|
221
|
Chris@16
|
222 typedef void result_type;
|
Chris@16
|
223 };
|
Chris@16
|
224
|
Chris@16
|
225
|
Chris@16
|
226 };
|
Chris@16
|
227
|
Chris@16
|
228 } // odeint
|
Chris@16
|
229 } // numeric
|
Chris@16
|
230 } // boost
|
Chris@16
|
231
|
Chris@16
|
232
|
Chris@16
|
233 #endif // BOOST_NUMERIC_ODEINT_EXTERNAL_THRUST_THRUST_OPERATIONS_HPP_INCLUDED
|