1 /*
2  [auto_generated]
3  boost/numeric/odeint/algebra/vector_space_algebra.hpp
4 
5  [begin_description]
6  An algebra for types which have vector space semantics, hence types on which the operators +,-,* are well defined.
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_VECTOR_SPACE_ALGEBRA_HPP_INCLUDED
19 #define BOOST_NUMERIC_ODEINT_ALGEBRA_VECTOR_SPACE_ALGEBRA_HPP_INCLUDED
20 
21 #include <complex>
22 
23 #include <boost/type_traits/remove_reference.hpp>
24 
25 
26 namespace boost {
27 namespace numeric {
28 namespace odeint {
29 
30 /*
31  * This class template has to be overload in order to call vector_space_algebra::norm_inf
32  */
33 template< class State > struct vector_space_norm_inf;
34 
35 /*
36  * Example: instantiation for sole doubles and complex
37  */
38 template<>
39 struct vector_space_norm_inf< double >
40 {
41     typedef double result_type;
operator ()boost::numeric::odeint::vector_space_norm_inf42     double operator()( double x ) const
43     {
44         using std::abs;
45         return abs(x);
46     }
47 };
48 
49 template<>
50 struct vector_space_norm_inf< float >
51 {
52     typedef float result_type;
operator ()boost::numeric::odeint::vector_space_norm_inf53     result_type operator()( float x ) const
54     {
55         using std::abs;
56         return abs(x);
57     }
58 };
59 
60 template< typename T >
61 struct vector_space_norm_inf< std::complex<T> >
62 {
63     typedef T result_type;
operator ()boost::numeric::odeint::vector_space_norm_inf64     result_type operator()( std::complex<T> x ) const
65     {
66         using std::abs;
67         return abs( x );
68     }
69 };
70 
71 struct vector_space_algebra
72 {
73     template< class S1 , class Op >
for_each1boost::numeric::odeint::vector_space_algebra74     static void for_each1( S1 &s1 , Op op )
75     {
76         // ToDo : build checks, that the +-*/ operators are well defined
77         op( s1 );
78     }
79 
80     template< class S1 , class S2 , class Op >
for_each2boost::numeric::odeint::vector_space_algebra81     static void for_each2( S1 &s1 , S2 &s2 , Op op )
82     {
83         op( s1 , s2 );
84     }
85 
86     template< class S1 , class S2 , class S3 , class Op >
for_each3boost::numeric::odeint::vector_space_algebra87     static void for_each3( S1 &s1 , S2 &s2 , S3 &s3 , Op op )
88     {
89         op( s1 , s2 , s3 );
90     }
91 
92     template< class S1 , class S2 , class S3 , class S4 , class Op >
for_each4boost::numeric::odeint::vector_space_algebra93     static void for_each4( S1 &s1 , S2 &s2 , S3 &s3 , S4 &s4 , Op op )
94     {
95         op( s1 , s2 , s3 , s4 );
96     }
97 
98     template< class S1 , class S2 , class S3 , class S4 , class S5 , class Op >
for_each5boost::numeric::odeint::vector_space_algebra99     static void for_each5( S1 &s1 , S2 &s2 , S3 &s3 , S4 &s4 , S5 &s5 , Op op )
100     {
101         op( s1 , s2 , s3 , s4 , s5 );
102     }
103 
104     template< class S1 , class S2 , class S3 , class S4 , class S5 , class S6 , class Op >
for_each6boost::numeric::odeint::vector_space_algebra105     static void for_each6( S1 &s1 , S2 &s2 , S3 &s3 , S4 &s4 , S5 &s5 , S6 &s6 , Op op )
106     {
107         op( s1 , s2 , s3 , s4 , s5 , s6 );
108     }
109 
110     template< class S1 , class S2 , class S3 , class S4 , class S5 , class S6 ,class S7 , class Op >
for_each7boost::numeric::odeint::vector_space_algebra111     static void for_each7( S1 &s1 , S2 &s2 , S3 &s3 , S4 &s4 , S5 &s5 , S6 &s6 , S7 &s7 , Op op )
112     {
113         op( s1 , s2 , s3 , s4 , s5 , s6 , s7 );
114     }
115 
116     template< class S1 , class S2 , class S3 , class S4 , class S5 , class S6 ,class S7 , class S8 , class Op >
for_each8boost::numeric::odeint::vector_space_algebra117     static void for_each8( S1 &s1 , S2 &s2 , S3 &s3 , S4 &s4 , S5 &s5 , S6 &s6 , S7 &s7 , S8 &s8 , Op op )
118     {
119         op( s1 , s2 , s3 , s4 , s5 , s6 , s7 , s8 );
120     }
121 
122     template< class S1 , class S2 , class S3 , class S4 , class S5 , class S6 ,class S7 , class S8 , class S9 , class Op >
for_each9boost::numeric::odeint::vector_space_algebra123     static void for_each9( S1 &s1 , S2 &s2 , S3 &s3 , S4 &s4 , S5 &s5 , S6 &s6 , S7 &s7 , S8 &s8 , S9 &s9 , Op op )
124     {
125         op( s1 , s2 , s3 , s4 , s5 , s6 , s7 , s8 , s9 );
126     }
127 
128     template< class S1 , class S2 , class S3 , class S4 , class S5 , class S6 ,class S7 , class S8 , class S9 , class S10 , class Op >
for_each10boost::numeric::odeint::vector_space_algebra129     static void for_each10( S1 &s1 , S2 &s2 , S3 &s3 , S4 &s4 , S5 &s5 , S6 &s6 , S7 &s7 , S8 &s8 , S9 &s9 , S10 &s10 , Op op )
130     {
131         op( s1 , s2 , s3 , s4 , s5 , s6 , s7 , s8 , s9 , s10 );
132     }
133 
134     template< class S1 , class S2 , class S3 , class S4 , class S5 , class S6 ,class S7 , class S8 , class S9 , class S10 , class S11 , class Op >
for_each11boost::numeric::odeint::vector_space_algebra135     static void for_each11( S1 &s1 , S2 &s2 , S3 &s3 , S4 &s4 , S5 &s5 , S6 &s6 , S7 &s7 , S8 &s8 , S9 &s9 , S10 &s10 , S11 &s11 , Op op )
136     {
137         op( s1 , s2 , s3 , s4 , s5 , s6 , s7 , s8 , s9 , s10 , s11 );
138     }
139 
140     template< class S1 , class S2 , class S3 , class S4 , class S5 , class S6 ,class S7 , class S8 , class S9 , class S10 , class S11 , class S12 , class Op >
for_each12boost::numeric::odeint::vector_space_algebra141     static void for_each12( S1 &s1 , S2 &s2 , S3 &s3 , S4 &s4 , S5 &s5 , S6 &s6 , S7 &s7 , S8 &s8 , S9 &s9 , S10 &s10 , S11 &s11 , S12 &s12 , Op op )
142     {
143         op( s1 , s2 , s3 , s4 , s5 , s6 , s7 , s8 , s9 , s10 , s11 , s12 );
144     }
145 
146     template< class S1 , class S2 , class S3 , class S4 , class S5 , class S6 ,class S7 , class S8 , class S9 , class S10 , class S11 , class S12 , class S13 , class Op >
for_each13boost::numeric::odeint::vector_space_algebra147     static void for_each13( S1 &s1 , S2 &s2 , S3 &s3 , S4 &s4 , S5 &s5 , S6 &s6 , S7 &s7 , S8 &s8 , S9 &s9 , S10 &s10 , S11 &s11 , S12 &s12 , S13 &s13 , Op op )
148     {
149         op( s1 , s2 , s3 , s4 , s5 , s6 , s7 , s8 , s9 , s10 , s11 , s12 , s13 );
150     }
151 
152     template< class S1 , class S2 , class S3 , class S4 , class S5 , class S6 ,class S7 , class S8 , class S9 , class S10 , class S11 , class S12 , class S13 , class S14 , class Op >
for_each14boost::numeric::odeint::vector_space_algebra153     static void for_each14( S1 &s1 , S2 &s2 , S3 &s3 , S4 &s4 , S5 &s5 , S6 &s6 , S7 &s7 , S8 &s8 , S9 &s9 , S10 &s10 , S11 &s11 , S12 &s12 , S13 &s13 , S14 &s14 , Op op )
154     {
155         op( s1 , s2 , s3 , s4 , s5 , s6 , s7 , s8 , s9 , s10 , s11 , s12 , s13 , s14 );
156     }
157 
158     template< class S1 , class S2 , class S3 , class S4 , class S5 , class S6 ,class S7 , class S8 , class S9 , class S10 , class S11 , class S12 , class S13 , class S14 , class S15 , class Op >
for_each15boost::numeric::odeint::vector_space_algebra159     static void for_each15( S1 &s1 , S2 &s2 , S3 &s3 , S4 &s4 , S5 &s5 , S6 &s6 , S7 &s7 , S8 &s8 , S9 &s9 , S10 &s10 , S11 &s11 , S12 &s12 , S13 &s13 , S14 &s14 , S15 &s15 , Op op )
160     {
161         op( s1 , s2 , s3 , s4 , s5 , s6 , s7 , s8 , s9 , s10 , s11 , s12 , s13 , s14 , s15 );
162     }
163 
164     template< class S >
norm_infboost::numeric::odeint::vector_space_algebra165     static typename boost::numeric::odeint::vector_space_norm_inf< S >::result_type norm_inf( const S &s )
166     {
167         boost::numeric::odeint::vector_space_norm_inf< S > n;
168         return n( s );
169     }
170 };
171 
172 
173 } // odeint
174 } // numeric
175 } // boost
176 
177 
178 #endif // BOOST_NUMERIC_ODEINT_ALGEBRA_VECTOR_SPACE_ALGEBRA_HPP_INCLUDED
179