3 boost/numeric/odeint/stepper/detail/generic_rk_call_algebra.hpp
6 Algebra caller for the generic Runge-Kutta methods.
9 Copyright 2011-2012 Mario Mulansky
10 Copyright 2011-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_STEPPER_DETAIL_GENERIC_RK_CALL_ALGEBRA_HPP_INCLUDED
19 #define BOOST_NUMERIC_ODEINT_STEPPER_DETAIL_GENERIC_RK_CALL_ALGEBRA_HPP_INCLUDED
27 template< size_t StageNumber , class Algebra >
28 struct generic_rk_call_algebra;
30 template< class Algebra >
31 struct generic_rk_call_algebra< 1 , Algebra >
33 typedef Algebra algebra_type;
35 template< class S1 , class S2 , class S3 , class S4 , class Op>
36 void operator()( algebra_type &algebra , S1 &s1 , S2 &s2 , S3 &s3 , S4 * /* s4_array */ , Op op ) const
38 algebra.for_each3( s1 , s2 , s3 , op );
41 template< class S1 , class S2 , class S4 , class Op>
42 void operator()( algebra_type &algebra , S1 &s1 , S2 &s2 , S4 * /* s4_array */ , Op op ) const
44 algebra.for_each2( s1 , s2 , op );
48 template< class Algebra >
49 struct generic_rk_call_algebra< 2 , Algebra >
51 template< class S1 , class S2 , class S3 , class S4 , class Op>
52 void operator()( Algebra &algebra , S1 &s1 , S2 &s2 , S3 &s3 , S4 s4_array[1] , Op op ) const
54 algebra.for_each4( s1 , s2 , s3 , s4_array[0].m_v , op );
57 template< class S1 , class S2 , class S4 , class Op>
58 void operator()( Algebra &algebra , S1 &s1 , S2 &s2 , S4 s4_array[1] , Op op ) const
60 algebra.for_each3( s1 , s2 , s4_array[0].m_v , op );
65 template< class Algebra >
66 struct generic_rk_call_algebra< 3 , Algebra >
68 template< class S1 , class S2 , class S3 , class S4 , class Op>
69 void operator()( Algebra &algebra , S1 &s1 , S2 &s2 , S3 &s3 , S4 s4_array[2] , Op op ) const
71 algebra.for_each5( s1 , s2 , s3 , s4_array[0].m_v , s4_array[1].m_v , op );
74 template< class S1 , class S2 , class S4 , class Op>
75 void operator()( Algebra &algebra , S1 &s1 , S2 &s2 , S4 s4_array[2] , Op op ) const
77 algebra.for_each4( s1 , s2 , s4_array[0].m_v , s4_array[1].m_v , op );
82 template< class Algebra >
83 struct generic_rk_call_algebra< 4 , Algebra >
85 template< class S1 , class S2 , class S3 , class S4 , class Op>
86 void operator()( Algebra &algebra , S1 &s1 , S2 &s2 , S3 &s3 , S4 s4_array[3] , Op op ) const
88 algebra.for_each6( s1 , s2 , s3 , s4_array[0].m_v , s4_array[1].m_v , s4_array[2].m_v , op );
91 template< class S1 , class S2 , class S4 , class Op>
92 void operator()( Algebra &algebra , S1 &s1 , S2 &s2 , S4 s4_array[3] , Op op ) const
94 algebra.for_each5( s1 , s2 , s4_array[0].m_v , s4_array[1].m_v , s4_array[2].m_v , op );
99 template< class Algebra >
100 struct generic_rk_call_algebra< 5 , Algebra >
102 template< class S1 , class S2 , class S3 , class S4 , class Op>
103 void operator()( Algebra &algebra , S1 &s1 , S2 &s2 , S3 &s3 , S4 s4_array[4] , Op op ) const
105 algebra.for_each7( s1 , s2 , s3 , s4_array[0].m_v , s4_array[1].m_v , s4_array[2].m_v , s4_array[3].m_v , op );
108 template< class S1 , class S2 , class S4 , class Op>
109 void operator()( Algebra &algebra , S1 &s1 , S2 &s2 , S4 s4_array[4] , Op op ) const
111 algebra.for_each6( s1 , s2 , s4_array[0].m_v , s4_array[1].m_v , s4_array[2].m_v , s4_array[3].m_v , op );
115 template< class Algebra >
116 struct generic_rk_call_algebra< 6 , Algebra >
118 template< class S1 , class S2 , class S3 , class S4 , class Op>
119 void operator()( Algebra &algebra , S1 &s1 , S2 &s2 , S3 &s3 , S4 s4_array[5] , Op op ) const
121 algebra.for_each8( s1 , s2 , s3 , s4_array[0].m_v , s4_array[1].m_v , s4_array[2].m_v , s4_array[3].m_v , s4_array[4].m_v , op );
124 template< class S1 , class S2 , class S4 , class Op>
125 void operator()( Algebra &algebra , S1 &s1 , S2 &s2 , S4 s4_array[5] , Op op ) const
127 algebra.for_each7( s1 , s2 , s4_array[0].m_v , s4_array[1].m_v , s4_array[2].m_v , s4_array[3].m_v , s4_array[4].m_v , op );
131 template< class Algebra >
132 struct generic_rk_call_algebra< 7 , Algebra >
134 template< class S1 , class S2 , class S3 , class S4 , class Op>
135 void operator()( Algebra &algebra , S1 &s1 , S2 &s2 , S3 &s3 , S4 s4_array[6] , Op op ) const
137 algebra.for_each9( s1 , s2 , s3 , s4_array[0].m_v , s4_array[1].m_v , s4_array[2].m_v , s4_array[3].m_v , s4_array[4].m_v ,
138 s4_array[5].m_v , op );
141 template< class S1 , class S2 , class S4 , class Op>
142 void operator()( Algebra &algebra , S1 &s1 , S2 &s2 , S4 s4_array[6] , Op op ) const
144 algebra.for_each8( s1 , s2 , s4_array[0].m_v , s4_array[1].m_v , s4_array[2].m_v , s4_array[3].m_v , s4_array[4].m_v ,
145 s4_array[5].m_v , op );
149 template< class Algebra >
150 struct generic_rk_call_algebra< 8 , Algebra >
152 template< class S1 , class S2 , class S3 , class S4 , class Op>
153 void operator()( Algebra &algebra , S1 &s1 , S2 &s2 , S3 &s3 , S4 s4_array[7] , Op op ) const
155 algebra.for_each10( s1 , s2 , s3 , s4_array[0].m_v , s4_array[1].m_v , s4_array[2].m_v , s4_array[3].m_v , s4_array[4].m_v ,
156 s4_array[5].m_v , s4_array[6].m_v , op );
159 template< class S1 , class S2 , class S4 , class Op>
160 void operator()( Algebra &algebra , S1 &s1 , S2 &s2 , S4 s4_array[7] , Op op ) const
162 algebra.for_each9( s1 , s2 , s4_array[0].m_v , s4_array[1].m_v , s4_array[2].m_v , s4_array[3].m_v , s4_array[4].m_v ,
163 s4_array[5].m_v , s4_array[6].m_v , op );
167 template< class Algebra >
168 struct generic_rk_call_algebra< 9 , Algebra >
170 template< class S1 , class S2 , class S3 , class S4 , class Op>
171 void operator()( Algebra &algebra , S1 &s1 , S2 &s2 , S3 &s3 , S4 s4_array[8] , Op op ) const
173 algebra.for_each11( s1 , s2 , s3 , s4_array[0].m_v , s4_array[1].m_v , s4_array[2].m_v , s4_array[3].m_v , s4_array[4].m_v ,
174 s4_array[5].m_v , s4_array[6].m_v , s4_array[7].m_v , op );
177 template< class S1 , class S2 , class S4 , class Op>
178 void operator()( Algebra &algebra , S1 &s1 , S2 &s2 , S4 s4_array[8] , Op op ) const
180 algebra.for_each10( s1 , s2 , s4_array[0].m_v , s4_array[1].m_v , s4_array[2].m_v , s4_array[3].m_v , s4_array[4].m_v ,
181 s4_array[5].m_v , s4_array[6].m_v , s4_array[7].m_v , op );
185 template< class Algebra >
186 struct generic_rk_call_algebra< 10 , Algebra >
188 template< class S1 , class S2 , class S3 , class S4 , class Op>
189 void operator()( Algebra &algebra , S1 &s1 , S2 &s2 , S3 &s3 , S4 s4_array[9] , Op op ) const
191 algebra.for_each12( s1 , s2 , s3 , s4_array[0].m_v , s4_array[1].m_v , s4_array[2].m_v , s4_array[3].m_v , s4_array[4].m_v ,
192 s4_array[5].m_v , s4_array[6].m_v , s4_array[7].m_v , s4_array[8].m_v , op );
195 template< class S1 , class S2 , class S4 , class Op>
196 void operator()( Algebra &algebra , S1 &s1 , S2 &s2 , S4 s4_array[9] , Op op ) const
198 algebra.for_each11( s1 , s2 , s4_array[0].m_v , s4_array[1].m_v , s4_array[2].m_v , s4_array[3].m_v , s4_array[4].m_v ,
199 s4_array[5].m_v , s4_array[6].m_v , s4_array[7].m_v , s4_array[8].m_v , op );
204 template< class Algebra >
205 struct generic_rk_call_algebra< 11 , Algebra >
207 template< class S1 , class S2 , class S3 , class S4 , class Op>
208 void operator()( Algebra &algebra , S1 &s1 , S2 &s2 , S3 &s3 , S4 s4_array[10] , Op op ) const
210 algebra.for_each13( s1 , s2 , s3 , s4_array[0].m_v , s4_array[1].m_v , s4_array[2].m_v , s4_array[3].m_v , s4_array[4].m_v ,
211 s4_array[5].m_v , s4_array[6].m_v , s4_array[7].m_v , s4_array[8].m_v , s4_array[9].m_v , op );
214 template< class S1 , class S2 , class S4 , class Op>
215 void operator()( Algebra &algebra , S1 &s1 , S2 &s2 , S4 s4_array[10] , Op op ) const
217 algebra.for_each12( s1 , s2 , s4_array[0].m_v , s4_array[1].m_v , s4_array[2].m_v , s4_array[3].m_v , s4_array[4].m_v ,
218 s4_array[5].m_v , s4_array[6].m_v , s4_array[7].m_v , s4_array[8].m_v , s4_array[9].m_v , op );
222 template< class Algebra >
223 struct generic_rk_call_algebra< 12 , Algebra >
225 template< class S1 , class S2 , class S3 , class S4 , class Op>
226 void operator()( Algebra &algebra , S1 &s1 , S2 &s2 , S3 &s3 , S4 s4_array[11] , Op op ) const
228 algebra.for_each14( s1 , s2 , s3 , s4_array[0].m_v , s4_array[1].m_v , s4_array[2].m_v , s4_array[3].m_v , s4_array[4].m_v ,
229 s4_array[5].m_v , s4_array[6].m_v , s4_array[7].m_v , s4_array[8].m_v , s4_array[9].m_v , s4_array[10].m_v , op );
232 template< class S1 , class S2 , class S4 , class Op>
233 void operator()( Algebra &algebra , S1 &s1 , S2 &s2 , S4 s4_array[11] , Op op ) const
235 algebra.for_each13( s1 , s2 , s4_array[0].m_v , s4_array[1].m_v , s4_array[2].m_v , s4_array[3].m_v , s4_array[4].m_v ,
236 s4_array[5].m_v , s4_array[6].m_v , s4_array[7].m_v , s4_array[8].m_v , s4_array[9].m_v , s4_array[10].m_v , op );
240 template< class Algebra >
241 struct generic_rk_call_algebra< 13 , Algebra >
243 template< class S1 , class S2 , class S3 , class S4 , class Op>
244 void operator()( Algebra &algebra , S1 &s1 , S2 &s2 , S3 &s3 , S4 s4_array[12] , Op op ) const
246 algebra.for_each15( s1 , s2 , s3 , s4_array[0].m_v , s4_array[1].m_v , s4_array[2].m_v , s4_array[3].m_v , s4_array[4].m_v ,
247 s4_array[5].m_v , s4_array[6].m_v , s4_array[7].m_v , s4_array[8].m_v , s4_array[9].m_v , s4_array[10].m_v , s4_array[11].m_v , op );
250 template< class S1 , class S2 , class S4 , class Op>
251 void operator()( Algebra &algebra , S1 &s1 , S2 &s2 , S4 s4_array[12] , Op op ) const
253 algebra.for_each14( s1 , s2 , s4_array[0].m_v , s4_array[1].m_v , s4_array[2].m_v , s4_array[3].m_v , s4_array[4].m_v ,
254 s4_array[5].m_v , s4_array[6].m_v , s4_array[7].m_v , s4_array[8].m_v , s4_array[9].m_v , s4_array[10].m_v , s4_array[11].m_v , op );
263 #endif // BOOST_NUMERIC_ODEINT_STEPPER_DETAIL_GENERIC_RK_CALL_ALGEBRA_HPP_INCLUDED