1 /*
2  [auto_generated]
3  boost/numeric/odeint/algebra/default_operations.hpp
4 
5  [begin_description]
6  Default operations. They work with the default numerical types, like float, double, complex< double> ...
7  [end_description]
8 
9  Copyright 2010-2012 Karsten Ahnert
10  Copyright 2010-2013 Mario Mulansky
11 
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)
15  */
16 
17 
18 #ifndef BOOST_NUMERIC_ODEINT_ALGEBRA_DEFAULT_OPERATIONS_HPP_INCLUDED
19 #define BOOST_NUMERIC_ODEINT_ALGEBRA_DEFAULT_OPERATIONS_HPP_INCLUDED
20 
21 #include <algorithm>
22 
23 #include <boost/config.hpp>
24 #include <boost/array.hpp>
25 
26 #include <boost/numeric/odeint/util/unit_helper.hpp>
27 
28 
29 namespace boost {
30 namespace numeric {
31 namespace odeint {
32 
33 
34 
35 /*
36  * Notes:
37  *
38  * * the results structs are needed in order to work with fusion_algebra
39  */
40 struct default_operations
41 {
42 
43     template< class Fac1 = double >
44     struct scale
45     {
46         const Fac1 m_alpha1;
47 
scaleboost::numeric::odeint::default_operations::scale48         scale( Fac1 alpha1 ) : m_alpha1( alpha1 ) { }
49 
50         template< class T1 >
operator ()boost::numeric::odeint::default_operations::scale51         void operator()( T1 &t1 ) const
52         {
53             t1 *= m_alpha1;
54         }
55 
56         typedef void result_type;
57     };
58 
59     template< class Fac1 = double >
60     struct scale_sum1
61     {
62         const Fac1 m_alpha1;
63 
scale_sum1boost::numeric::odeint::default_operations::scale_sum164         scale_sum1( Fac1 alpha1 ) : m_alpha1( alpha1 ) { }
65 
66         template< class T1 , class T2 >
operator ()boost::numeric::odeint::default_operations::scale_sum167         void operator()( T1 &t1 , const T2 &t2 ) const
68         {
69             t1 = m_alpha1 * t2;
70         }
71 
72         typedef void result_type;
73     };
74 
75 
76     template< class Fac1 = double , class Fac2 = Fac1 >
77     struct scale_sum2
78     {
79         const Fac1 m_alpha1;
80         const Fac2 m_alpha2;
81 
scale_sum2boost::numeric::odeint::default_operations::scale_sum282         scale_sum2( Fac1 alpha1 , Fac2 alpha2 ) : m_alpha1( alpha1 ) , m_alpha2( alpha2 ) { }
83 
84         template< class T1 , class T2 , class T3 >
operator ()boost::numeric::odeint::default_operations::scale_sum285         void operator()( T1 &t1 , const T2 &t2 , const T3 &t3) const
86         {
87             t1 = m_alpha1 * t2 + m_alpha2 * t3;
88         }
89 
90         typedef void result_type;
91     };
92 
93 
94     template< class Fac1 = double , class Fac2 = Fac1 , class Fac3 = Fac2 >
95     struct scale_sum3
96     {
97         const Fac1 m_alpha1;
98         const Fac2 m_alpha2;
99         const Fac3 m_alpha3;
100 
scale_sum3boost::numeric::odeint::default_operations::scale_sum3101         scale_sum3( Fac1 alpha1 , Fac2 alpha2 , Fac3 alpha3 )
102         : m_alpha1( alpha1 ) , m_alpha2( alpha2 ) , m_alpha3( alpha3 ) { }
103 
104         template< class T1 , class T2 , class T3 , class T4 >
operator ()boost::numeric::odeint::default_operations::scale_sum3105         void operator()( T1 &t1 , const T2 &t2 , const T3 &t3 , const T4 &t4 ) const
106         {
107             t1 = m_alpha1 * t2 + m_alpha2 * t3 + m_alpha3 * t4;
108         }
109 
110         typedef void result_type;
111     };
112 
113 
114     template< class Fac1 = double , class Fac2 = Fac1 , class Fac3 = Fac2 , class Fac4 = Fac3 >
115     struct scale_sum4
116     {
117         const Fac1 m_alpha1;
118         const Fac2 m_alpha2;
119         const Fac3 m_alpha3;
120         const Fac4 m_alpha4;
121 
scale_sum4boost::numeric::odeint::default_operations::scale_sum4122         scale_sum4( Fac1 alpha1 , Fac2 alpha2 , Fac3 alpha3 , Fac4 alpha4 )
123         : m_alpha1( alpha1 ) , m_alpha2( alpha2 ) , m_alpha3( alpha3 ) , m_alpha4( alpha4 ) { }
124 
125         template< class T1 , class T2 , class T3 , class T4 , class T5 >
operator ()boost::numeric::odeint::default_operations::scale_sum4126         void operator()( T1 &t1 , const T2 &t2 , const T3 &t3 , const T4 &t4 , const T5 &t5) const
127         {
128             t1 = m_alpha1 * t2 + m_alpha2 * t3 + m_alpha3 * t4 + m_alpha4 * t5;
129         }
130 
131         typedef void result_type;
132     };
133 
134 
135     template< class Fac1 = double , class Fac2 = Fac1 , class Fac3 = Fac2 , class Fac4 = Fac3 , class Fac5 = Fac4 >
136     struct scale_sum5
137     {
138         const Fac1 m_alpha1;
139         const Fac2 m_alpha2;
140         const Fac3 m_alpha3;
141         const Fac4 m_alpha4;
142         const Fac5 m_alpha5;
143 
scale_sum5boost::numeric::odeint::default_operations::scale_sum5144         scale_sum5( Fac1 alpha1 , Fac2 alpha2 , Fac3 alpha3 , Fac4 alpha4 , Fac5 alpha5 )
145         : m_alpha1( alpha1 ) , m_alpha2( alpha2 ) , m_alpha3( alpha3 ) , m_alpha4( alpha4 ) , m_alpha5( alpha5 ) { }
146 
147         template< class T1 , class T2 , class T3 , class T4 , class T5 , class T6 >
operator ()boost::numeric::odeint::default_operations::scale_sum5148         void operator()( T1 &t1 , const T2 &t2 , const T3 &t3 , const T4 &t4 , const T5 &t5 , const T6 &t6) const
149         {
150             t1 = m_alpha1 * t2 + m_alpha2 * t3 + m_alpha3 * t4 + m_alpha4 * t5 + m_alpha5 * t6;
151         }
152 
153         typedef void result_type;
154     };
155 
156 
157     template< class Fac1 = double , class Fac2 = Fac1 , class Fac3 = Fac2 , class Fac4 = Fac3 , class Fac5 = Fac4 , class Fac6 = Fac5 >
158     struct scale_sum6
159     {
160         const Fac1 m_alpha1;
161         const Fac2 m_alpha2;
162         const Fac3 m_alpha3;
163         const Fac4 m_alpha4;
164         const Fac5 m_alpha5;
165         const Fac6 m_alpha6;
166 
scale_sum6boost::numeric::odeint::default_operations::scale_sum6167         scale_sum6( Fac1 alpha1 , Fac2 alpha2 , Fac3 alpha3 , Fac4 alpha4 , Fac5 alpha5 , Fac6 alpha6 )
168         : m_alpha1( alpha1 ) , m_alpha2( alpha2 ) , m_alpha3( alpha3 ) , m_alpha4( alpha4 ) , m_alpha5( alpha5 ) , m_alpha6( alpha6 ){ }
169 
170         template< class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 >
operator ()boost::numeric::odeint::default_operations::scale_sum6171         void operator()( T1 &t1 , const T2 &t2 , const T3 &t3 , const T4 &t4 , const T5 &t5 , const T6 &t6 ,const T7 &t7) const
172         {
173             t1 = m_alpha1 * t2 + m_alpha2 * t3 + m_alpha3 * t4 + m_alpha4 * t5 + m_alpha5 * t6 + m_alpha6 * t7;
174         }
175 
176         typedef void result_type;
177     };
178 
179 
180     template< class Fac1 = double , class Fac2 = Fac1 , class Fac3 = Fac2 , class Fac4 = Fac3 , class Fac5 = Fac4 , class Fac6 = Fac5 , class Fac7 = Fac6 >
181     struct scale_sum7
182     {
183         const Fac1 m_alpha1;
184         const Fac2 m_alpha2;
185         const Fac3 m_alpha3;
186         const Fac4 m_alpha4;
187         const Fac5 m_alpha5;
188         const Fac6 m_alpha6;
189         const Fac7 m_alpha7;
190 
scale_sum7boost::numeric::odeint::default_operations::scale_sum7191         scale_sum7( Fac1 alpha1 , Fac2 alpha2 , Fac3 alpha3 , Fac4 alpha4 ,
192                 Fac5 alpha5 , Fac6 alpha6 , Fac7 alpha7 )
193         : m_alpha1( alpha1 ) , m_alpha2( alpha2 ) , m_alpha3( alpha3 ) , m_alpha4( alpha4 ) , m_alpha5( alpha5 ) , m_alpha6( alpha6 ) , m_alpha7( alpha7 ) { }
194 
195         template< class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 >
operator ()boost::numeric::odeint::default_operations::scale_sum7196         void operator()( T1 &t1 , const T2 &t2 , const T3 &t3 , const T4 &t4 , const T5 &t5 , const T6 &t6 , const T7 &t7 , const T8 &t8 ) const
197         {
198             t1 = m_alpha1 * t2 + m_alpha2 * t3 + m_alpha3 * t4 + m_alpha4 * t5 + m_alpha5 * t6 + m_alpha6 * t7 + m_alpha7 * t8;
199         }
200 
201         typedef void result_type;
202     };
203 
204 
205     template< class Fac1 = double , class Fac2 = Fac1 , class Fac3 = Fac2 , class Fac4 = Fac3 , class Fac5 = Fac4 , class Fac6 = Fac5 , class Fac7 = Fac6 , class Fac8 = Fac7 >
206     struct scale_sum8
207     {
208         const Fac1 m_alpha1;
209         const Fac2 m_alpha2;
210         const Fac3 m_alpha3;
211         const Fac4 m_alpha4;
212         const Fac5 m_alpha5;
213         const Fac6 m_alpha6;
214         const Fac7 m_alpha7;
215         const Fac8 m_alpha8;
216 
scale_sum8boost::numeric::odeint::default_operations::scale_sum8217         scale_sum8( Fac1 alpha1 , Fac2 alpha2 , Fac3 alpha3 , Fac4 alpha4 ,
218                 Fac5 alpha5 , Fac6 alpha6 , Fac7 alpha7 , Fac8 alpha8 )
219         : m_alpha1( alpha1 ) , m_alpha2( alpha2 ) , m_alpha3( alpha3 ) , m_alpha4( alpha4 ) , m_alpha5( alpha5 ) , m_alpha6( alpha6 ) , m_alpha7( alpha7 ) , m_alpha8( alpha8 ) { }
220 
221         template< class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 >
operator ()boost::numeric::odeint::default_operations::scale_sum8222         void operator()( T1 &t1 , const T2 &t2 , const T3 &t3 , const T4 &t4 , const T5 &t5 , const T6 &t6 , const T7 &t7 , const T8 &t8 , const T9 &t9 ) const
223         {
224             t1 = m_alpha1 * t2 + m_alpha2 * t3 + m_alpha3 * t4 + m_alpha4 * t5 + m_alpha5 * t6 + m_alpha6 * t7 + m_alpha7 * t8 + m_alpha8 * t9;
225         }
226 
227         typedef void result_type;
228     };
229 
230     template< class Fac1 = double , class Fac2 = Fac1 , class Fac3 = Fac2 , class Fac4 = Fac3 , class Fac5 = Fac4 , class Fac6 = Fac5 , class Fac7 = Fac6 , class Fac8 = Fac7 , class Fac9 = Fac8 >
231     struct scale_sum9
232     {
233         const Fac1 m_alpha1;
234         const Fac2 m_alpha2;
235         const Fac3 m_alpha3;
236         const Fac4 m_alpha4;
237         const Fac5 m_alpha5;
238         const Fac6 m_alpha6;
239         const Fac7 m_alpha7;
240         const Fac8 m_alpha8;
241         const Fac9 m_alpha9;
242 
scale_sum9boost::numeric::odeint::default_operations::scale_sum9243         scale_sum9( Fac1 alpha1 , Fac2 alpha2 , Fac3 alpha3 , Fac4 alpha4 ,
244                 Fac5 alpha5 , Fac6 alpha6 , Fac7 alpha7 , Fac8 alpha8 , Fac9 alpha9 )
245         : m_alpha1( alpha1 ) , m_alpha2( alpha2 ) , m_alpha3( alpha3 ) , m_alpha4( alpha4 ) , m_alpha5( alpha5 ) , m_alpha6( alpha6 ) , m_alpha7( alpha7 ) , m_alpha8( alpha8 ) , m_alpha9( alpha9 ) { }
246 
247         template< class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 >
operator ()boost::numeric::odeint::default_operations::scale_sum9248         void operator()( T1 &t1 , const T2 &t2 , const T3 &t3 , const T4 &t4 , const T5 &t5 , const T6 &t6 , const T7 &t7 , const T8 &t8 , const T9 &t9 , const T10 &t10 ) const
249         {
250             t1 = m_alpha1 * t2 + m_alpha2 * t3 + m_alpha3 * t4 + m_alpha4 * t5 + m_alpha5 * t6 + m_alpha6 * t7 + m_alpha7 * t8 + m_alpha8 * t9 + m_alpha9 * t10;
251         }
252 
253         typedef void result_type;
254     };
255 
256     template< class Fac1 = double , class Fac2 = Fac1 , class Fac3 = Fac2 , class Fac4 = Fac3 , class Fac5 = Fac4 , class Fac6 = Fac5 , class Fac7 = Fac6 , class Fac8 = Fac7 , class Fac9 = Fac8 , class Fac10 = Fac9 >
257     struct scale_sum10
258     {
259         const Fac1 m_alpha1;
260         const Fac2 m_alpha2;
261         const Fac3 m_alpha3;
262         const Fac4 m_alpha4;
263         const Fac5 m_alpha5;
264         const Fac6 m_alpha6;
265         const Fac7 m_alpha7;
266         const Fac8 m_alpha8;
267         const Fac9 m_alpha9;
268         const Fac10 m_alpha10;
269 
scale_sum10boost::numeric::odeint::default_operations::scale_sum10270         scale_sum10( Fac1 alpha1 , Fac2 alpha2 , Fac3 alpha3 , Fac4 alpha4 ,
271                 Fac5 alpha5 , Fac6 alpha6 , Fac7 alpha7 , Fac8 alpha8 , Fac9 alpha9 , Fac10 alpha10 )
272         : m_alpha1( alpha1 ) , m_alpha2( alpha2 ) , m_alpha3( alpha3 ) , m_alpha4( alpha4 ) , m_alpha5( alpha5 ) , m_alpha6( alpha6 ) , m_alpha7( alpha7 ) , m_alpha8( alpha8 ) , m_alpha9( alpha9 ) , m_alpha10( alpha10 ) { }
273 
274         template< class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 >
operator ()boost::numeric::odeint::default_operations::scale_sum10275         void operator()( T1 &t1 , const T2 &t2 , const T3 &t3 , const T4 &t4 , const T5 &t5 , const T6 &t6 , const T7 &t7 , const T8 &t8 , const T9 &t9 , const T10 &t10 , const T11 &t11 ) const
276         {
277             t1 = m_alpha1 * t2 + m_alpha2 * t3 + m_alpha3 * t4 + m_alpha4 * t5 + m_alpha5 * t6 + m_alpha6 * t7 + m_alpha7 * t8 + m_alpha8 * t9 + m_alpha9 * t10 + m_alpha10 * t11;
278         }
279 
280         typedef void result_type;
281     };
282 
283 
284     template< class Fac1 = double , class Fac2 = Fac1 , class Fac3 = Fac2 , class Fac4 = Fac3 , class Fac5 = Fac4 , class Fac6 = Fac5 , class Fac7 = Fac6 , class Fac8 = Fac7 , class Fac9 = Fac8 , class Fac10 = Fac9 , class Fac11 = Fac10 >
285     struct scale_sum11
286     {
287         const Fac1 m_alpha1;
288         const Fac2 m_alpha2;
289         const Fac3 m_alpha3;
290         const Fac4 m_alpha4;
291         const Fac5 m_alpha5;
292         const Fac6 m_alpha6;
293         const Fac7 m_alpha7;
294         const Fac8 m_alpha8;
295         const Fac9 m_alpha9;
296         const Fac10 m_alpha10;
297         const Fac11 m_alpha11;
298 
scale_sum11boost::numeric::odeint::default_operations::scale_sum11299         scale_sum11( Fac1 alpha1 , Fac2 alpha2 , Fac3 alpha3 , Fac4 alpha4 ,
300                 Fac5 alpha5 , Fac6 alpha6 , Fac7 alpha7 , Fac8 alpha8 , Fac9 alpha9 ,
301                 Fac10 alpha10 , Fac11 alpha11 )
302         : m_alpha1( alpha1 ) , m_alpha2( alpha2 ) , m_alpha3( alpha3 ) , m_alpha4( alpha4 ) , m_alpha5( alpha5 ) , m_alpha6( alpha6 ) , m_alpha7( alpha7 ) , m_alpha8( alpha8 ) , m_alpha9( alpha9 ) , m_alpha10( alpha10 ) , m_alpha11( alpha11 ) { }
303 
304         template< class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 >
operator ()boost::numeric::odeint::default_operations::scale_sum11305         void operator()( T1 &t1 , const T2 &t2 , const T3 &t3 , const T4 &t4 , const T5 &t5 , const T6 &t6 , const T7 &t7 , const T8 &t8 , const T9 &t9 , const T10 &t10 , const T11 &t11 , const T12 &t12 ) const
306         {
307             t1 = m_alpha1 * t2 + m_alpha2 * t3 + m_alpha3 * t4 + m_alpha4 * t5 + m_alpha5 * t6 + m_alpha6 * t7 + m_alpha7 * t8 + m_alpha8 * t9 + m_alpha9 * t10 + m_alpha10 * t11 + m_alpha11 * t12;
308         }
309 
310         typedef void result_type;
311     };
312 
313     template< class Fac1 = double , class Fac2 = Fac1 , class Fac3 = Fac2 , class Fac4 = Fac3 , class Fac5 = Fac4 , class Fac6 = Fac5 , class Fac7 = Fac6 , class Fac8 = Fac7 , class Fac9 = Fac8 , class Fac10 = Fac9 , class Fac11 = Fac10 , class Fac12 = Fac11 >
314     struct scale_sum12
315     {
316         const Fac1 m_alpha1;
317         const Fac2 m_alpha2;
318         const Fac3 m_alpha3;
319         const Fac4 m_alpha4;
320         const Fac5 m_alpha5;
321         const Fac6 m_alpha6;
322         const Fac7 m_alpha7;
323         const Fac8 m_alpha8;
324         const Fac9 m_alpha9;
325         const Fac10 m_alpha10;
326         const Fac11 m_alpha11;
327         const Fac12 m_alpha12;
328 
scale_sum12boost::numeric::odeint::default_operations::scale_sum12329         scale_sum12( Fac1 alpha1 , Fac2 alpha2 , Fac3 alpha3 , Fac4 alpha4 ,
330                 Fac5 alpha5 , Fac6 alpha6 , Fac7 alpha7 , Fac8 alpha8 , Fac9 alpha9 ,
331                 Fac10 alpha10 , Fac11 alpha11 , Fac12 alpha12 )
332         : m_alpha1( alpha1 ) , m_alpha2( alpha2 ) , m_alpha3( alpha3 ) , m_alpha4( alpha4 ) , m_alpha5( alpha5 ) , m_alpha6( alpha6 ) , m_alpha7( alpha7 ) , m_alpha8( alpha8 ) , m_alpha9( alpha9 ) , m_alpha10( alpha10 ) , m_alpha11( alpha11 ) , m_alpha12( alpha12 ) { }
333 
334         template< class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 >
operator ()boost::numeric::odeint::default_operations::scale_sum12335         void operator()( T1 &t1 , const T2 &t2 , const T3 &t3 , const T4 &t4 , const T5 &t5 , const T6 &t6 , const T7 &t7 , const T8 &t8 , const T9 &t9 , const T10 &t10 , const T11 &t11 , const T12 &t12 , const T13 &t13 ) const
336         {
337             t1 = m_alpha1 * t2 + m_alpha2 * t3 + m_alpha3 * t4 + m_alpha4 * t5 + m_alpha5 * t6 + m_alpha6 * t7 + m_alpha7 * t8 + m_alpha8 * t9 + m_alpha9 * t10 + m_alpha10 * t11 + m_alpha11 * t12 + m_alpha12 * t13;
338         }
339 
340         typedef void result_type;
341     };
342 
343     template< class Fac1 = double , class Fac2 = Fac1 , class Fac3 = Fac2 , class Fac4 = Fac3 , class Fac5 = Fac4 , class Fac6 = Fac5 , class Fac7 = Fac6 , class Fac8 = Fac7 , class Fac9 = Fac8 , class Fac10 = Fac9 , class Fac11 = Fac10 , class Fac12 = Fac11 , class Fac13 = Fac12 >
344     struct scale_sum13
345     {
346         const Fac1 m_alpha1;
347         const Fac2 m_alpha2;
348         const Fac3 m_alpha3;
349         const Fac4 m_alpha4;
350         const Fac5 m_alpha5;
351         const Fac6 m_alpha6;
352         const Fac7 m_alpha7;
353         const Fac8 m_alpha8;
354         const Fac9 m_alpha9;
355         const Fac10 m_alpha10;
356         const Fac11 m_alpha11;
357         const Fac12 m_alpha12;
358         const Fac13 m_alpha13;
359 
scale_sum13boost::numeric::odeint::default_operations::scale_sum13360         scale_sum13( Fac1 alpha1 , Fac2 alpha2 , Fac3 alpha3 , Fac4 alpha4 ,
361                 Fac5 alpha5 , Fac6 alpha6 , Fac7 alpha7 , Fac8 alpha8 , Fac9 alpha9 ,
362                 Fac10 alpha10 , Fac11 alpha11 , Fac12 alpha12 , Fac13 alpha13 )
363         : m_alpha1( alpha1 ) , m_alpha2( alpha2 ) , m_alpha3( alpha3 ) , m_alpha4( alpha4 ) , m_alpha5( alpha5 ) , m_alpha6( alpha6 ) , m_alpha7( alpha7 ) , m_alpha8( alpha8 ) , m_alpha9( alpha9 ) , m_alpha10( alpha10 ) , m_alpha11( alpha11 ) , m_alpha12( alpha12 ) , m_alpha13( alpha13 ) { }
364 
365         template< class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 >
operator ()boost::numeric::odeint::default_operations::scale_sum13366         void operator()( T1 &t1 , const T2 &t2 , const T3 &t3 , const T4 &t4 , const T5 &t5 , const T6 &t6 , const T7 &t7 , const T8 &t8 , const T9 &t9 , const T10 &t10 , const T11 &t11 , const T12 &t12 , const T13 &t13 , const T14 &t14 ) const
367         {
368             t1 = m_alpha1 * t2 + m_alpha2 * t3 + m_alpha3 * t4 + m_alpha4 * t5 + m_alpha5 * t6 + m_alpha6 * t7 + m_alpha7 * t8 + m_alpha8 * t9 + m_alpha9 * t10 + m_alpha10 * t11 + m_alpha11 * t12 + m_alpha12 * t13 + m_alpha13 * t14;
369         }
370 
371         typedef void result_type;
372     };
373 
374     template< class Fac1 = double , class Fac2 = Fac1 , class Fac3 = Fac2 , class Fac4 = Fac3 , class Fac5 = Fac4 , class Fac6 = Fac5 , class Fac7 = Fac6 , class Fac8 = Fac7 , class Fac9 = Fac8 , class Fac10 = Fac9 , class Fac11 = Fac10 , class Fac12 = Fac11 , class Fac13 = Fac12 , class Fac14 = Fac13 >
375     struct scale_sum14
376     {
377         const Fac1 m_alpha1;
378         const Fac2 m_alpha2;
379         const Fac3 m_alpha3;
380         const Fac4 m_alpha4;
381         const Fac5 m_alpha5;
382         const Fac6 m_alpha6;
383         const Fac7 m_alpha7;
384         const Fac8 m_alpha8;
385         const Fac9 m_alpha9;
386         const Fac10 m_alpha10;
387         const Fac11 m_alpha11;
388         const Fac12 m_alpha12;
389         const Fac13 m_alpha13;
390         const Fac14 m_alpha14;
391 
scale_sum14boost::numeric::odeint::default_operations::scale_sum14392         scale_sum14( Fac1 alpha1 , Fac2 alpha2 , Fac3 alpha3 , Fac4 alpha4 ,
393                 Fac5 alpha5 , Fac6 alpha6 , Fac7 alpha7 , Fac8 alpha8 , Fac9 alpha9 ,
394                 Fac10 alpha10 , Fac11 alpha11 , Fac12 alpha12 , Fac13 alpha13 , Fac14 alpha14 )
395         : m_alpha1( alpha1 ) , m_alpha2( alpha2 ) , m_alpha3( alpha3 ) , m_alpha4( alpha4 ) , m_alpha5( alpha5 ) , m_alpha6( alpha6 ) , m_alpha7( alpha7 ) , m_alpha8( alpha8 ) , m_alpha9( alpha9 ) , m_alpha10( alpha10 ) , m_alpha11( alpha11 ) , m_alpha12( alpha12 ) , m_alpha13( alpha13 ) , m_alpha14( alpha14 ) { }
396 
397         template< class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 >
operator ()boost::numeric::odeint::default_operations::scale_sum14398         void operator()( T1 &t1 , const T2 &t2 , const T3 &t3 , const T4 &t4 , const T5 &t5 , const T6 &t6 , const T7 &t7 , const T8 &t8 , const T9 &t9 , const T10 &t10 , const T11 &t11 , const T12 &t12 , const T13 &t13 , const T14 &t14 , const T15 &t15 ) const
399         {
400             t1 = m_alpha1 * t2 + m_alpha2 * t3 + m_alpha3 * t4 + m_alpha4 * t5 + m_alpha5 * t6 + m_alpha6 * t7 + m_alpha7 * t8 + m_alpha8 * t9 + m_alpha9 * t10 + m_alpha10 * t11 + m_alpha11 * t12 + m_alpha12 * t13 + m_alpha13 * t14 + m_alpha14 * t15;
401         }
402 
403         typedef void result_type;
404     };
405 
406     template< class Fac1 = double , class Fac2 = Fac1 >
407     struct scale_sum_swap2
408     {
409         const Fac1 m_alpha1;
410         const Fac2 m_alpha2;
411 
scale_sum_swap2boost::numeric::odeint::default_operations::scale_sum_swap2412         scale_sum_swap2( Fac1 alpha1 , Fac2 alpha2 ) : m_alpha1( alpha1 ) , m_alpha2( alpha2 ) { }
413 
414         template< class T1 , class T2 , class T3 >
operator ()boost::numeric::odeint::default_operations::scale_sum_swap2415         void operator()( T1 &t1 , T2 &t2 , const T3 &t3) const
416         {
417             const T1 tmp( t1 );
418             t1 = m_alpha1 * t2 + m_alpha2 * t3;
419             t2 = tmp;
420         }
421 
422         typedef void result_type;
423     };
424 
425     /*
426      * for usage in for_each2
427      *
428      * Works with boost::units by eliminating the unit
429      */
430     template< class Fac1 = double >
431     struct rel_error
432     {
433         const Fac1 m_eps_abs , m_eps_rel , m_a_x , m_a_dxdt;
434 
rel_errorboost::numeric::odeint::default_operations::rel_error435         rel_error( Fac1 eps_abs , Fac1 eps_rel , Fac1 a_x , Fac1 a_dxdt )
436         : m_eps_abs( eps_abs ) , m_eps_rel( eps_rel ) , m_a_x( a_x ) , m_a_dxdt( a_dxdt ) { }
437 
438 
439         template< class T1 , class T2 , class T3 >
operator ()boost::numeric::odeint::default_operations::rel_error440         void operator()( T3 &t3 , const T1 &t1 , const T2 &t2 ) const
441         {
442             using std::abs;
443             set_unit_value( t3 , abs( get_unit_value( t3 ) ) / ( m_eps_abs + m_eps_rel * ( m_a_x * abs( get_unit_value( t1 ) ) + m_a_dxdt * abs( get_unit_value( t2 ) ) ) ) );
444         }
445 
446         typedef void result_type;
447     };
448 
449 
450     /*
451      * for usage in for_each3
452      *
453      * used in the controller for the rosenbrock4 method
454      *
455      * Works with boost::units by eliminating the unit
456      */
457     template< class Fac1 = double >
458     struct default_rel_error
459     {
460         const Fac1 m_eps_abs , m_eps_rel ;
461 
default_rel_errorboost::numeric::odeint::default_operations::default_rel_error462         default_rel_error( Fac1 eps_abs , Fac1 eps_rel )
463         : m_eps_abs( eps_abs ) , m_eps_rel( eps_rel ) { }
464 
465 
466         /*
467          * xerr = xerr / ( eps_abs + eps_rel * max( x , x_old ) )
468          */
469         template< class T1 , class T2 , class T3 >
operator ()boost::numeric::odeint::default_operations::default_rel_error470         void operator()( T3 &t3 , const T1 &t1 , const T2 &t2 ) const
471         {
472             BOOST_USING_STD_MAX();
473             using std::abs;
474             Fac1 x1 = abs( get_unit_value( t1 ) ) , x2 = abs( get_unit_value( t2 ) );
475             set_unit_value( t3 , abs( get_unit_value( t3 ) ) / ( m_eps_abs + m_eps_rel * max BOOST_PREVENT_MACRO_SUBSTITUTION ( x1 , x2 ) ) );
476         }
477 
478         typedef void result_type;
479     };
480 
481 
482 
483     /*
484      * for usage in reduce
485      */
486 
487     template< class Value >
488     struct maximum
489     {
490         template< class Fac1 , class Fac2 >
operator ()boost::numeric::odeint::default_operations::maximum491         Value operator()( Fac1 t1 , const Fac2 t2 ) const
492         {
493             using std::abs;
494             Value a1 = abs( get_unit_value( t1 ) ) , a2 = abs( get_unit_value( t2 ) );
495             return ( a1 < a2 ) ? a2 : a1 ;
496         }
497 
498         typedef Value result_type;
499     };
500 
501 
502     template< class Fac1 = double >
503     struct rel_error_max
504     {
505         const Fac1 m_eps_abs , m_eps_rel;
506 
rel_error_maxboost::numeric::odeint::default_operations::rel_error_max507         rel_error_max( Fac1 eps_abs , Fac1 eps_rel )
508         : m_eps_abs( eps_abs ) , m_eps_rel( eps_rel )
509         { }
510 
511         template< class Res , class T1 , class T2 , class T3 >
512         Res operator()( Res r , const T1 &x_old , const T2 &x , const T3 &x_err )
513         {
514             BOOST_USING_STD_MAX();
515             using std::abs;
516             Res tmp = abs( get_unit_value( x_err ) ) / ( m_eps_abs + m_eps_rel * max BOOST_PREVENT_MACRO_SUBSTITUTION ( abs( x_old ) , abs( x ) ) );
517             return max BOOST_PREVENT_MACRO_SUBSTITUTION ( r , tmp );
518         }
519     };
520 
521 
522     template< class Fac1 = double >
523     struct rel_error_max2
524     {
525         const Fac1 m_eps_abs , m_eps_rel , m_a_x , m_a_dxdt;
526 
rel_error_max2boost::numeric::odeint::default_operations::rel_error_max2527         rel_error_max2( Fac1 eps_abs , Fac1 eps_rel , Fac1 a_x , Fac1 a_dxdt )
528         : m_eps_abs( eps_abs ) , m_eps_rel( eps_rel ) , m_a_x( a_x ) , m_a_dxdt( a_dxdt )
529         { }
530 
531         template< class Res , class T1 , class T2 , class T3 , class T4 >
532         Res operator()( Res r , const T1 &x_old , const T2 &/*x*/ , const T3 &dxdt_old , const T4 &x_err )
533         {
534             BOOST_USING_STD_MAX();
535             using std::abs;
536             Res tmp = abs( get_unit_value( x_err ) ) /
537                     ( m_eps_abs + m_eps_rel * ( m_a_x * abs( get_unit_value( x_old ) ) + m_a_dxdt * abs( get_unit_value( dxdt_old ) ) ) );
538             return max BOOST_PREVENT_MACRO_SUBSTITUTION ( r , tmp );
539         }
540     };
541 
542 
543 
544 
545     template< class Fac1 = double >
546     struct rel_error_l2
547     {
548         const Fac1 m_eps_abs , m_eps_rel;
549 
rel_error_l2boost::numeric::odeint::default_operations::rel_error_l2550         rel_error_l2( Fac1 eps_abs , Fac1 eps_rel )
551         : m_eps_abs( eps_abs ) , m_eps_rel( eps_rel )
552         { }
553 
554         template< class Res , class T1 , class T2 , class T3 >
555         Res operator()( Res r , const T1 &x_old , const T2 &x , const T3 &x_err )
556         {
557             BOOST_USING_STD_MAX();
558             using std::abs;
559             Res tmp = abs( get_unit_value( x_err ) ) / ( m_eps_abs + m_eps_rel * max BOOST_PREVENT_MACRO_SUBSTITUTION ( abs( x_old ) , abs( x ) ) );
560             return r + tmp * tmp;
561         }
562     };
563 
564 
565 
566 
567     template< class Fac1 = double >
568     struct rel_error_l2_2
569     {
570         const Fac1 m_eps_abs , m_eps_rel , m_a_x , m_a_dxdt;
571 
rel_error_l2_2boost::numeric::odeint::default_operations::rel_error_l2_2572         rel_error_l2_2( Fac1 eps_abs , Fac1 eps_rel , Fac1 a_x , Fac1 a_dxdt )
573         : m_eps_abs( eps_abs ) , m_eps_rel( eps_rel ) , m_a_x( a_x ) , m_a_dxdt( a_dxdt )
574         { }
575 
576         template< class Res , class T1 , class T2 , class T3 , class T4 >
577         Res operator()( Res r , const T1 &x_old , const T2 &/*x*/ , const T3 &dxdt_old , const T4 &x_err )
578         {
579             using std::abs;
580             Res tmp = abs( get_unit_value( x_err ) ) /
581                     ( m_eps_abs + m_eps_rel * ( m_a_x * abs( get_unit_value( x_old ) ) + m_a_dxdt * abs( get_unit_value( dxdt_old ) ) ) );
582             return r + tmp * tmp;
583         }
584     };
585 
586 
587 
588 
589 
590 
591 };
592 
593 
594 } // odeint
595 } // numeric
596 } // boost
597 
598 
599 #endif // BOOST_NUMERIC_ODEINT_ALGEBRA_DEFAULT_OPERATIONS_HPP_INCLUDED
600