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