Chris@16
|
1 /*
|
Chris@16
|
2 [auto_generated]
|
Chris@16
|
3 boost/numeric/odeint/external/thrust/thrust_algebra.hpp
|
Chris@16
|
4
|
Chris@16
|
5 [begin_description]
|
Chris@16
|
6 An algebra for thrusts device_vectors.
|
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_THRUST_THRUST_ALGEBRA_HPP_INCLUDED
|
Chris@16
|
19 #define BOOST_NUMERIC_ODEINT_EXTERNAL_THRUST_THRUST_ALGEBRA_HPP_INCLUDED
|
Chris@16
|
20
|
Chris@16
|
21
|
Chris@16
|
22 #include <thrust/device_vector.h>
|
Chris@16
|
23 #include <thrust/for_each.h>
|
Chris@16
|
24 #include <thrust/iterator/zip_iterator.h>
|
Chris@16
|
25
|
Chris@16
|
26 #include <boost/range.hpp>
|
Chris@16
|
27
|
Chris@16
|
28 namespace boost {
|
Chris@16
|
29 namespace numeric {
|
Chris@16
|
30 namespace odeint {
|
Chris@16
|
31
|
Chris@16
|
32
|
Chris@16
|
33
|
Chris@16
|
34 /** ToDO extend until for_each14 for rk78 */
|
Chris@16
|
35
|
Chris@16
|
36 /*
|
Chris@16
|
37 * The const versions are needed for boost.range to work, i.e.
|
Chris@16
|
38 * it allows you to do
|
Chris@16
|
39 * for_each1( make_pair( vec1.begin() , vec1.begin() + 10 ) , op );
|
Chris@16
|
40 */
|
Chris@16
|
41
|
Chris@16
|
42 struct thrust_algebra
|
Chris@16
|
43 {
|
Chris@16
|
44 template< class StateType , class Operation >
|
Chris@16
|
45 static void for_each1( StateType &s , Operation op )
|
Chris@16
|
46 {
|
Chris@16
|
47 thrust::for_each( boost::begin(s) , boost::begin(s) , op );
|
Chris@16
|
48 }
|
Chris@16
|
49
|
Chris@16
|
50 template< class StateType1 , class StateType2 , class Operation >
|
Chris@16
|
51 static void for_each2( StateType1 &s1 , StateType2 &s2 , Operation op )
|
Chris@16
|
52 {
|
Chris@16
|
53 thrust::for_each(
|
Chris@16
|
54 thrust::make_zip_iterator( thrust::make_tuple( boost::begin(s1) ,
|
Chris@16
|
55 boost::begin(s2) ) ) ,
|
Chris@16
|
56 thrust::make_zip_iterator( thrust::make_tuple( boost::end(s1) ,
|
Chris@16
|
57 boost::end(s2) ) ) ,
|
Chris@16
|
58 op);
|
Chris@16
|
59 }
|
Chris@16
|
60
|
Chris@16
|
61 template< class StateType1 , class StateType2 , class StateType3 , class Operation >
|
Chris@16
|
62 static void for_each3( StateType1 &s1 , StateType2 &s2 , StateType3 &s3 , Operation op )
|
Chris@16
|
63 {
|
Chris@16
|
64 thrust::for_each(
|
Chris@16
|
65 thrust::make_zip_iterator( thrust::make_tuple( boost::begin(s1) ,
|
Chris@16
|
66 boost::begin(s2) ,
|
Chris@16
|
67 boost::begin(s3) ) ) ,
|
Chris@16
|
68 thrust::make_zip_iterator( thrust::make_tuple( boost::end(s1) ,
|
Chris@16
|
69 boost::end(s2) ,
|
Chris@16
|
70 boost::end(s3) ) ) ,
|
Chris@16
|
71 op);
|
Chris@16
|
72 }
|
Chris@16
|
73
|
Chris@16
|
74 template< class StateType1 , class StateType2 , class StateType3 , class StateType4 ,
|
Chris@16
|
75 class Operation >
|
Chris@16
|
76 static void for_each4( StateType1 &s1 , StateType2 &s2 , StateType3 &s3 , StateType4 &s4 ,
|
Chris@16
|
77 Operation op )
|
Chris@16
|
78 {
|
Chris@16
|
79 thrust::for_each(
|
Chris@16
|
80 thrust::make_zip_iterator( thrust::make_tuple( boost::begin(s1) ,
|
Chris@16
|
81 boost::begin(s2) ,
|
Chris@16
|
82 boost::begin(s3) ,
|
Chris@16
|
83 boost::begin(s4) ) ) ,
|
Chris@16
|
84 thrust::make_zip_iterator( thrust::make_tuple( boost::end(s1) ,
|
Chris@16
|
85 boost::end(s2) ,
|
Chris@16
|
86 boost::end(s3) ,
|
Chris@16
|
87 boost::end(s4) ) ) ,
|
Chris@16
|
88 op);
|
Chris@16
|
89 }
|
Chris@16
|
90
|
Chris@16
|
91 template< class StateType1 , class StateType2 , class StateType3 ,
|
Chris@16
|
92 class StateType4 , class StateType5 ,class Operation >
|
Chris@16
|
93 static void for_each5( StateType1 &s1 , StateType2 &s2 , StateType3 &s3 , StateType4 &s4 ,
|
Chris@16
|
94 StateType5 &s5 , Operation op )
|
Chris@16
|
95 {
|
Chris@16
|
96 thrust::for_each(
|
Chris@16
|
97 thrust::make_zip_iterator( thrust::make_tuple( boost::begin(s1) ,
|
Chris@16
|
98 boost::begin(s2) ,
|
Chris@16
|
99 boost::begin(s3) ,
|
Chris@16
|
100 boost::begin(s4) ,
|
Chris@16
|
101 boost::begin(s5) ) ) ,
|
Chris@16
|
102 thrust::make_zip_iterator( thrust::make_tuple( boost::end(s1) ,
|
Chris@16
|
103 boost::end(s2) ,
|
Chris@16
|
104 boost::end(s3) ,
|
Chris@16
|
105 boost::end(s4) ,
|
Chris@16
|
106 boost::end(s5) ) ) ,
|
Chris@16
|
107 op);
|
Chris@16
|
108 }
|
Chris@16
|
109
|
Chris@16
|
110 template< class StateType1 , class StateType2 , class StateType3 ,
|
Chris@16
|
111 class StateType4 , class StateType5 , class StateType6 , class Operation >
|
Chris@16
|
112 static void for_each6( StateType1 &s1 , StateType2 &s2 , StateType3 &s3 , StateType4 &s4 ,
|
Chris@16
|
113 StateType5 &s5 , StateType6 &s6 , Operation op )
|
Chris@16
|
114 {
|
Chris@16
|
115 thrust::for_each(
|
Chris@16
|
116 thrust::make_zip_iterator( thrust::make_tuple( boost::begin(s1) ,
|
Chris@16
|
117 boost::begin(s2) ,
|
Chris@16
|
118 boost::begin(s3) ,
|
Chris@16
|
119 boost::begin(s4) ,
|
Chris@16
|
120 boost::begin(s5) ,
|
Chris@16
|
121 boost::begin(s6) ) ) ,
|
Chris@16
|
122 thrust::make_zip_iterator( thrust::make_tuple( boost::end(s1) ,
|
Chris@16
|
123 boost::end(s2) ,
|
Chris@16
|
124 boost::end(s3) ,
|
Chris@16
|
125 boost::end(s4) ,
|
Chris@16
|
126 boost::end(s5) ,
|
Chris@16
|
127 boost::end(s6) ) ) ,
|
Chris@16
|
128 op);
|
Chris@16
|
129 }
|
Chris@16
|
130
|
Chris@16
|
131 template< class StateType1 , class StateType2 , class StateType3 , class StateType4 ,
|
Chris@16
|
132 class StateType5 , class StateType6 , class StateType7 , class Operation >
|
Chris@16
|
133 static void for_each7( StateType1 &s1 , StateType2 &s2 , StateType3 &s3 , StateType4 &s4 ,
|
Chris@16
|
134 StateType5 &s5 , StateType6 &s6 , StateType7 &s7 , Operation op )
|
Chris@16
|
135 {
|
Chris@16
|
136 thrust::for_each(
|
Chris@16
|
137 thrust::make_zip_iterator( thrust::make_tuple( boost::begin(s1) ,
|
Chris@16
|
138 boost::begin(s2) ,
|
Chris@16
|
139 boost::begin(s3) ,
|
Chris@16
|
140 boost::begin(s4) ,
|
Chris@16
|
141 boost::begin(s5) ,
|
Chris@16
|
142 boost::begin(s6) ,
|
Chris@16
|
143 boost::begin(s7) ) ) ,
|
Chris@16
|
144 thrust::make_zip_iterator( thrust::make_tuple( boost::end(s1) ,
|
Chris@16
|
145 boost::end(s2) ,
|
Chris@16
|
146 boost::end(s3) ,
|
Chris@16
|
147 boost::end(s4) ,
|
Chris@16
|
148 boost::end(s5) ,
|
Chris@16
|
149 boost::end(s6) ,
|
Chris@16
|
150 boost::end(s7) ) ) ,
|
Chris@16
|
151 op);
|
Chris@16
|
152 }
|
Chris@16
|
153
|
Chris@16
|
154 template< class StateType1 , class StateType2 , class StateType3 , class StateType4 ,
|
Chris@16
|
155 class StateType5 , class StateType6 , class StateType7 , class StateType8 , class Operation >
|
Chris@16
|
156 static void for_each8( StateType1 &s1 , StateType2 &s2 , StateType3 &s3 , StateType4 &s4 ,
|
Chris@16
|
157 StateType5 &s5 , StateType6 &s6 , StateType7 &s7 , StateType8 &s8 , Operation op )
|
Chris@16
|
158 {
|
Chris@16
|
159 thrust::for_each(
|
Chris@16
|
160 thrust::make_zip_iterator( thrust::make_tuple( boost::begin(s1) ,
|
Chris@16
|
161 boost::begin(s2) ,
|
Chris@16
|
162 boost::begin(s3) ,
|
Chris@16
|
163 boost::begin(s4) ,
|
Chris@16
|
164 boost::begin(s5) ,
|
Chris@16
|
165 boost::begin(s6) ,
|
Chris@16
|
166 boost::begin(s7) ,
|
Chris@16
|
167 boost::begin(s8) ) ) ,
|
Chris@16
|
168 thrust::make_zip_iterator( thrust::make_tuple( boost::end(s1) ,
|
Chris@16
|
169 boost::end(s2) ,
|
Chris@16
|
170 boost::end(s3) ,
|
Chris@16
|
171 boost::end(s4) ,
|
Chris@16
|
172 boost::end(s5) ,
|
Chris@16
|
173 boost::end(s6) ,
|
Chris@16
|
174 boost::end(s7) ,
|
Chris@16
|
175 boost::end(s8) ) ) ,
|
Chris@16
|
176 op);
|
Chris@16
|
177 }
|
Chris@16
|
178
|
Chris@16
|
179
|
Chris@16
|
180 template< class Value , class S , class Red >
|
Chris@16
|
181 Value reduce( const S &s , Red red , Value init)
|
Chris@16
|
182 {
|
Chris@16
|
183 return thrust::reduce( boost::begin( s ) , boost::end( s ) , init , red );
|
Chris@16
|
184 }
|
Chris@16
|
185
|
Chris@16
|
186
|
Chris@16
|
187
|
Chris@16
|
188
|
Chris@16
|
189 };
|
Chris@16
|
190
|
Chris@16
|
191
|
Chris@16
|
192 } // odeint
|
Chris@16
|
193 } // numeric
|
Chris@16
|
194 } // boost
|
Chris@16
|
195
|
Chris@16
|
196
|
Chris@16
|
197
|
Chris@16
|
198 #endif // BOOST_NUMERIC_ODEINT_EXTERNAL_THRUST_THRUST_ALGEBRA_HPP_INCLUDED
|