• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  [auto_generated]
3  boost/numeric/odeint/algebra/array_algebra.hpp
4 
5  [begin_description]
6  Algebra for Arrays. Highly specialized for odeint. Const arguments are
7  introduce to work with odeint.
8  The Array algebra can be used for Array structures with two template
9  parameters:
10  Array<T, N>
11  [end_description]
12 
13  Copyright 2011-2013 Mario Mulansky
14  Copyright 2011-2012 Karsten Ahnert
15 
16  Distributed under the Boost Software License, Version 1.0.
17  (See accompanying file LICENSE_1_0.txt or
18  copy at http://www.boost.org/LICENSE_1_0.txt)
19  */
20 
21 
22 #ifndef BOOST_NUMERIC_ODEINT_ALGEBRA_ARRAY_ALGEBRA_HPP_INCLUDED
23 #define BOOST_NUMERIC_ODEINT_ALGEBRA_ARRAY_ALGEBRA_HPP_INCLUDED
24 
25 #include <algorithm>
26 #include <boost/array.hpp>
27 
28 #include <boost/numeric/odeint/algebra/norm_result_type.hpp>
29 
30 namespace boost {
31 namespace numeric {
32 namespace odeint {
33 
34 struct array_algebra
35 {
36     //template< typename T , size_t dim , class Op >
37     template < template < typename, size_t > class Array, typename T,
38                size_t dim, class Op >
for_each1boost::numeric::odeint::array_algebra39     static void for_each1( Array< T, dim > &s1, Op op )
40     {
41         for( size_t i=0 ; i<dim ; ++i )
42             op( s1[i] );
43     }
44 
45     template < template < typename, size_t > class Array, typename T,
46                size_t dim, class Op >
for_each2boost::numeric::odeint::array_algebra47     static void for_each2( Array< T, dim > &s1, const Array< T, dim > &s2,
48                            Op op )
49     {
50         for( size_t i=0 ; i<dim ; ++i )
51             op( s1[i] , s2[i] );
52     }
53 
54     template < template < typename, size_t > class Array, typename T,
55                size_t dim, class Op >
for_each3boost::numeric::odeint::array_algebra56     static void for_each3( Array< T , dim > &s1 ,
57             const Array< T , dim > &s2 ,
58             const Array< T , dim > &s3 , Op op )
59     {
60         for( size_t i=0 ; i<dim ; ++i )
61             op( s1[i] , s2[i] , s3[i] );
62     }
63 
64     /* different const signature - required for the scale_sum_swap2 operation */
65     template < template < typename, size_t > class Array, typename T,
66                size_t dim, class Op >
for_each3boost::numeric::odeint::array_algebra67     static void for_each3( Array< T , dim > &s1 ,
68             Array< T , dim > &s2 ,
69             const Array< T , dim > &s3 , Op op )
70     {
71         for( size_t i=0 ; i<dim ; ++i )
72             op( s1[i] , s2[i] , s3[i] );
73     }
74 
75     template < template < typename, size_t > class Array, typename T,
76                size_t dim, class Op >
for_each4boost::numeric::odeint::array_algebra77     static void for_each4( Array< T , dim > &s1 ,
78             const Array< T , dim > &s2 ,
79             const Array< T , dim > &s3 ,
80             const Array< T , dim > &s4 , Op op )
81     {
82         for( size_t i=0 ; i<dim ; ++i )
83             op( s1[i] , s2[i] , s3[i] , s4[i] );
84     }
85 
86     template < template < typename, size_t > class Array, typename T,
87                size_t dim, class Op >
for_each5boost::numeric::odeint::array_algebra88     static void for_each5( Array< T , dim > &s1 ,
89             const Array< T , dim > &s2 ,
90             const Array< T , dim > &s3 ,
91             const Array< T , dim > &s4 ,
92             const Array< T , dim > &s5 , Op op )
93     {
94         for( size_t i=0 ; i<dim ; ++i )
95             op( s1[i] , s2[i] , s3[i] , s4[i] , s5[i] );
96     }
97 
98     template < template < typename, size_t > class Array, typename T,
99                size_t dim, class Op >
for_each6boost::numeric::odeint::array_algebra100     static void for_each6( Array< T , dim > &s1 ,
101             const Array< T , dim > &s2 ,
102             const Array< T , dim > &s3 ,
103             const Array< T , dim > &s4 ,
104             const Array< T , dim > &s5 ,
105             const Array< T , dim > &s6 , Op op )
106     {
107         for( size_t i=0 ; i<dim ; ++i )
108             op( s1[i] , s2[i] , s3[i] , s4[i] , s5[i] , s6[i] );
109     }
110 
111     template < template < typename, size_t > class Array, typename T,
112                size_t dim, class Op >
for_each7boost::numeric::odeint::array_algebra113     static void for_each7( Array< T , dim > &s1 ,
114             const Array< T , dim > &s2 ,
115             const Array< T , dim > &s3 ,
116             const Array< T , dim > &s4 ,
117             const Array< T , dim > &s5 ,
118             const Array< T , dim > &s6 ,
119             const Array< T , dim > &s7 , Op op )
120     {
121         for( size_t i=0 ; i<dim ; ++i )
122             op( s1[i] , s2[i] , s3[i] , s4[i] , s5[i] , s6[i] , s7[i] );
123     }
124 
125     template < template < typename, size_t > class Array, typename T,
126                size_t dim, class Op >
for_each8boost::numeric::odeint::array_algebra127     static void for_each8( Array< T , dim > &s1 ,
128             const Array< T , dim > &s2 ,
129             const Array< T , dim > &s3 ,
130             const Array< T , dim > &s4 ,
131             const Array< T , dim > &s5 ,
132             const Array< T , dim > &s6 ,
133             const Array< T , dim > &s7 ,
134             const Array< T , dim > &s8 , Op op )
135     {
136         for( size_t i=0 ; i<dim ; ++i )
137             op( s1[i] , s2[i] , s3[i] , s4[i] , s5[i] , s6[i] , s7[i] , s8[i] );
138     }
139 
140     template < template < typename, size_t > class Array, typename T,
141                size_t dim, class Op >
for_each9boost::numeric::odeint::array_algebra142     static void for_each9( Array< T , dim > &s1 ,
143             const Array< T , dim > &s2 ,
144             const Array< T , dim > &s3 ,
145             const Array< T , dim > &s4 ,
146             const Array< T , dim > &s5 ,
147             const Array< T , dim > &s6 ,
148             const Array< T , dim > &s7 ,
149             const Array< T , dim > &s8 ,
150             const Array< T , dim > &s9 , Op op )
151     {
152         for( size_t i=0 ; i<dim ; ++i )
153             op( s1[i] , s2[i] , s3[i] , s4[i] , s5[i] , s6[i] , s7[i] , s8[i] , s9[i] );
154     }
155 
156     template < template < typename, size_t > class Array, typename T,
157                size_t dim, class Op >
for_each10boost::numeric::odeint::array_algebra158     static void for_each10( Array< T , dim > &s1 ,
159             const Array< T , dim > &s2 ,
160             const Array< T , dim > &s3 ,
161             const Array< T , dim > &s4 ,
162             const Array< T , dim > &s5 ,
163             const Array< T , dim > &s6 ,
164             const Array< T , dim > &s7 ,
165             const Array< T , dim > &s8 ,
166             const Array< T , dim > &s9 ,
167             const Array< T , dim > &s10 , Op op )
168     {
169         for( size_t i=0 ; i<dim ; ++i )
170             op( s1[i] , s2[i] , s3[i] , s4[i] , s5[i] , s6[i] , s7[i] , s8[i] , s9[i] , s10[i] );
171     }
172 
173     template < template < typename, size_t > class Array, typename T,
174                size_t dim, class Op >
for_each11boost::numeric::odeint::array_algebra175     static void for_each11( Array< T , dim > &s1 ,
176             const Array< T , dim > &s2 ,
177             const Array< T , dim > &s3 ,
178             const Array< T , dim > &s4 ,
179             const Array< T , dim > &s5 ,
180             const Array< T , dim > &s6 ,
181             const Array< T , dim > &s7 ,
182             const Array< T , dim > &s8 ,
183             const Array< T , dim > &s9 ,
184             const Array< T , dim > &s10 ,
185             const Array< T , dim > &s11 , Op op )
186     {
187         for( size_t i=0 ; i<dim ; ++i )
188             op( s1[i] , s2[i] , s3[i] , s4[i] , s5[i] , s6[i] , s7[i] , s8[i] , s9[i] , s10[i] , s11[i] );
189     }
190 
191     template < template < typename, size_t > class Array, typename T,
192                size_t dim, class Op >
for_each12boost::numeric::odeint::array_algebra193     static void for_each12( Array< T , dim > &s1 ,
194             const Array< T , dim > &s2 ,
195             const Array< T , dim > &s3 ,
196             const Array< T , dim > &s4 ,
197             const Array< T , dim > &s5 ,
198             const Array< T , dim > &s6 ,
199             const Array< T , dim > &s7 ,
200             const Array< T , dim > &s8 ,
201             const Array< T , dim > &s9 ,
202             const Array< T , dim > &s10 ,
203             const Array< T , dim > &s11 ,
204             const Array< T , dim > &s12 , Op op )
205     {
206         for( size_t i=0 ; i<dim ; ++i )
207             op( s1[i] , s2[i] , s3[i] , s4[i] , s5[i] , s6[i] , s7[i] , s8[i] , s9[i] , s10[i] , s11[i] , s12[i] );
208     }
209 
210     template < template < typename, size_t > class Array, typename T,
211                size_t dim, class Op >
for_each13boost::numeric::odeint::array_algebra212     static void for_each13( Array< T , dim > &s1 ,
213             const Array< T , dim > &s2 ,
214             const Array< T , dim > &s3 ,
215             const Array< T , dim > &s4 ,
216             const Array< T , dim > &s5 ,
217             const Array< T , dim > &s6 ,
218             const Array< T , dim > &s7 ,
219             const Array< T , dim > &s8 ,
220             const Array< T , dim > &s9 ,
221             const Array< T , dim > &s10 ,
222             const Array< T , dim > &s11 ,
223             const Array< T , dim > &s12 ,
224             const Array< T , dim > &s13 , Op op )
225     {
226         for( size_t i=0 ; i<dim ; ++i )
227             op( s1[i] , s2[i] , s3[i] , s4[i] , s5[i] , s6[i] , s7[i] , s8[i] , s9[i] , s10[i] , s11[i] , s12[i] , s13[i] );
228     }
229 
230     template < template < typename, size_t > class Array, typename T,
231                size_t dim, class Op >
for_each14boost::numeric::odeint::array_algebra232     static void for_each14( Array< T , dim > &s1 ,
233             const Array< T , dim > &s2 ,
234             const Array< T , dim > &s3 ,
235             const Array< T , dim > &s4 ,
236             const Array< T , dim > &s5 ,
237             const Array< T , dim > &s6 ,
238             const Array< T , dim > &s7 ,
239             const Array< T , dim > &s8 ,
240             const Array< T , dim > &s9 ,
241             const Array< T , dim > &s10 ,
242             const Array< T , dim > &s11 ,
243             const Array< T , dim > &s12 ,
244             const Array< T , dim > &s13 ,
245             const Array< T , dim > &s14 , Op op )
246     {
247         for( size_t i=0 ; i<dim ; ++i )
248             op( s1[i] , s2[i] , s3[i] , s4[i] , s5[i] , s6[i] , s7[i] , s8[i] , s9[i] , s10[i] , s11[i] , s12[i] , s13[i] , s14[i] );
249     }
250 
251     template < template < typename, size_t > class Array, typename T,
252                size_t dim, class Op >
for_each15boost::numeric::odeint::array_algebra253     static void for_each15( Array< T , dim > &s1 ,
254             const Array< T , dim > &s2 ,
255             const Array< T , dim > &s3 ,
256             const Array< T , dim > &s4 ,
257             const Array< T , dim > &s5 ,
258             const Array< T , dim > &s6 ,
259             const Array< T , dim > &s7 ,
260             const Array< T , dim > &s8 ,
261             const Array< T , dim > &s9 ,
262             const Array< T , dim > &s10 ,
263             const Array< T , dim > &s11 ,
264             const Array< T , dim > &s12 ,
265             const Array< T , dim > &s13 ,
266             const Array< T , dim > &s14 ,
267             const Array< T , dim > &s15 , Op op )
268     {
269         for( size_t i=0 ; i<dim ; ++i )
270             op( s1[i] , s2[i] , s3[i] , s4[i] , s5[i] , s6[i] , s7[i] , s8[i] , s9[i] , s10[i] , s11[i] , s12[i] , s13[i] , s14[i] , s15[i] );
271     }
272 
273 
274     template < template < typename, size_t > class Array, typename T,
275                size_t dim>
norm_infboost::numeric::odeint::array_algebra276     static typename norm_result_type< Array< T , dim > >::type norm_inf( const Array< T , dim > &s )
277     {
278         BOOST_USING_STD_MAX();
279         using std::abs;
280         typedef typename norm_result_type< Array< T , dim > >::type result_type;
281         result_type init = static_cast< result_type >( 0 );
282         for( size_t i=0 ; i<dim ; ++i )
283             init = max BOOST_PREVENT_MACRO_SUBSTITUTION ( init , static_cast< result_type >(abs(s[i])) );
284         return init;
285     }
286 
287 };
288 
289 }
290 }
291 }
292 
293 #endif // BOOST_NUMERIC_ODEINT_ALGEBRA_ARRAY_ALGEBRA_HPP_INCLUDED
294