diff options
Diffstat (limited to 'boost/numeric/odeint/algebra/array_algebra.hpp')
-rw-r--r-- | boost/numeric/odeint/algebra/array_algebra.hpp | 309 |
1 files changed, 165 insertions, 144 deletions
diff --git a/boost/numeric/odeint/algebra/array_algebra.hpp b/boost/numeric/odeint/algebra/array_algebra.hpp index c565d6dd7..471e866fe 100644 --- a/boost/numeric/odeint/algebra/array_algebra.hpp +++ b/boost/numeric/odeint/algebra/array_algebra.hpp @@ -3,7 +3,11 @@ boost/numeric/odeint/algebra/array_algebra.hpp [begin_description] - Algebra for boost::array. Highly specialized for odeint. Const arguments are introduce to work with odeint. + Algebra for Arrays. Highly specialized for odeint. Const arguments are + introduce to work with odeint. + The Array algebra can be used for Array structures with two template + parameters: + Array<T, N> [end_description] Copyright 2011-2013 Mario Mulansky @@ -29,234 +33,251 @@ namespace odeint { struct array_algebra { - template< typename T , size_t dim , class Op > - static void for_each1( boost::array< T , dim > &s1 , Op op ) + //template< typename T , size_t dim , class Op > + template < template < typename, size_t > class Array, typename T, + size_t dim, class Op > + static void for_each1( Array< T, dim > &s1, Op op ) { for( size_t i=0 ; i<dim ; ++i ) op( s1[i] ); } - - template< typename T1 , typename T2 , size_t dim , class Op > - static void for_each2( boost::array< T1 , dim > &s1 , - const boost::array< T2 , dim > &s2 , Op op ) + template < template < typename, size_t > class Array, typename T, + size_t dim, class Op > + static void for_each2( Array< T, dim > &s1, const Array< T, dim > &s2, + Op op ) { for( size_t i=0 ; i<dim ; ++i ) op( s1[i] , s2[i] ); } - template< typename T , size_t dim , class Op > - static void for_each3( boost::array< T , dim > &s1 , - const boost::array< T , dim > &s2 , - const boost::array< T , dim > &s3 , Op op ) + template < template < typename, size_t > class Array, typename T, + size_t dim, class Op > + static void for_each3( Array< T , dim > &s1 , + const Array< T , dim > &s2 , + const Array< T , dim > &s3 , Op op ) { for( size_t i=0 ; i<dim ; ++i ) op( s1[i] , s2[i] , s3[i] ); } /* different const signature - required for the scale_sum_swap2 operation */ - template< typename T , size_t dim , class Op > - static void for_each3( boost::array< T , dim > &s1 , - boost::array< T , dim > &s2 , - const boost::array< T , dim > &s3 , Op op ) + template < template < typename, size_t > class Array, typename T, + size_t dim, class Op > + static void for_each3( Array< T , dim > &s1 , + Array< T , dim > &s2 , + const Array< T , dim > &s3 , Op op ) { for( size_t i=0 ; i<dim ; ++i ) op( s1[i] , s2[i] , s3[i] ); } - template< typename T , size_t dim , class Op > - static void for_each4( boost::array< T , dim > &s1 , - const boost::array< T , dim > &s2 , - const boost::array< T , dim > &s3 , - const boost::array< T , dim > &s4 , Op op ) + template < template < typename, size_t > class Array, typename T, + size_t dim, class Op > + static void for_each4( Array< T , dim > &s1 , + const Array< T , dim > &s2 , + const Array< T , dim > &s3 , + const Array< T , dim > &s4 , Op op ) { for( size_t i=0 ; i<dim ; ++i ) op( s1[i] , s2[i] , s3[i] , s4[i] ); } - template< typename T , size_t dim , class Op > - static void for_each5( boost::array< T , dim > &s1 , - const boost::array< T , dim > &s2 , - const boost::array< T , dim > &s3 , - const boost::array< T , dim > &s4 , - const boost::array< T , dim > &s5 , Op op ) + template < template < typename, size_t > class Array, typename T, + size_t dim, class Op > + static void for_each5( Array< T , dim > &s1 , + const Array< T , dim > &s2 , + const Array< T , dim > &s3 , + const Array< T , dim > &s4 , + const Array< T , dim > &s5 , Op op ) { for( size_t i=0 ; i<dim ; ++i ) op( s1[i] , s2[i] , s3[i] , s4[i] , s5[i] ); } - template< typename T , size_t dim , class Op > - static void for_each6( boost::array< T , dim > &s1 , - const boost::array< T , dim > &s2 , - const boost::array< T , dim > &s3 , - const boost::array< T , dim > &s4 , - const boost::array< T , dim > &s5 , - const boost::array< T , dim > &s6 , Op op ) + template < template < typename, size_t > class Array, typename T, + size_t dim, class Op > + static void for_each6( Array< T , dim > &s1 , + const Array< T , dim > &s2 , + const Array< T , dim > &s3 , + const Array< T , dim > &s4 , + const Array< T , dim > &s5 , + const Array< T , dim > &s6 , Op op ) { for( size_t i=0 ; i<dim ; ++i ) op( s1[i] , s2[i] , s3[i] , s4[i] , s5[i] , s6[i] ); } - template< typename T , size_t dim , class Op > - static void for_each7( boost::array< T , dim > &s1 , - const boost::array< T , dim > &s2 , - const boost::array< T , dim > &s3 , - const boost::array< T , dim > &s4 , - const boost::array< T , dim > &s5 , - const boost::array< T , dim > &s6 , - const boost::array< T , dim > &s7 , Op op ) + template < template < typename, size_t > class Array, typename T, + size_t dim, class Op > + static void for_each7( Array< T , dim > &s1 , + const Array< T , dim > &s2 , + const Array< T , dim > &s3 , + const Array< T , dim > &s4 , + const Array< T , dim > &s5 , + const Array< T , dim > &s6 , + const Array< T , dim > &s7 , Op op ) { for( size_t i=0 ; i<dim ; ++i ) op( s1[i] , s2[i] , s3[i] , s4[i] , s5[i] , s6[i] , s7[i] ); } - template< typename T , size_t dim , class Op > - static void for_each8( boost::array< T , dim > &s1 , - const boost::array< T , dim > &s2 , - const boost::array< T , dim > &s3 , - const boost::array< T , dim > &s4 , - const boost::array< T , dim > &s5 , - const boost::array< T , dim > &s6 , - const boost::array< T , dim > &s7 , - const boost::array< T , dim > &s8 , Op op ) + template < template < typename, size_t > class Array, typename T, + size_t dim, class Op > + static void for_each8( Array< T , dim > &s1 , + const Array< T , dim > &s2 , + const Array< T , dim > &s3 , + const Array< T , dim > &s4 , + const Array< T , dim > &s5 , + const Array< T , dim > &s6 , + const Array< T , dim > &s7 , + const Array< T , dim > &s8 , Op op ) { for( size_t i=0 ; i<dim ; ++i ) op( s1[i] , s2[i] , s3[i] , s4[i] , s5[i] , s6[i] , s7[i] , s8[i] ); } - template< typename T , size_t dim , class Op > - static void for_each9( boost::array< T , dim > &s1 , - const boost::array< T , dim > &s2 , - const boost::array< T , dim > &s3 , - const boost::array< T , dim > &s4 , - const boost::array< T , dim > &s5 , - const boost::array< T , dim > &s6 , - const boost::array< T , dim > &s7 , - const boost::array< T , dim > &s8 , - const boost::array< T , dim > &s9 , Op op ) + template < template < typename, size_t > class Array, typename T, + size_t dim, class Op > + static void for_each9( Array< T , dim > &s1 , + const Array< T , dim > &s2 , + const Array< T , dim > &s3 , + const Array< T , dim > &s4 , + const Array< T , dim > &s5 , + const Array< T , dim > &s6 , + const Array< T , dim > &s7 , + const Array< T , dim > &s8 , + const Array< T , dim > &s9 , Op op ) { for( size_t i=0 ; i<dim ; ++i ) op( s1[i] , s2[i] , s3[i] , s4[i] , s5[i] , s6[i] , s7[i] , s8[i] , s9[i] ); } - template< typename T , size_t dim , class Op > - static void for_each10( boost::array< T , dim > &s1 , - const boost::array< T , dim > &s2 , - const boost::array< T , dim > &s3 , - const boost::array< T , dim > &s4 , - const boost::array< T , dim > &s5 , - const boost::array< T , dim > &s6 , - const boost::array< T , dim > &s7 , - const boost::array< T , dim > &s8 , - const boost::array< T , dim > &s9 , - const boost::array< T , dim > &s10 , Op op ) + template < template < typename, size_t > class Array, typename T, + size_t dim, class Op > + static void for_each10( Array< T , dim > &s1 , + const Array< T , dim > &s2 , + const Array< T , dim > &s3 , + const Array< T , dim > &s4 , + const Array< T , dim > &s5 , + const Array< T , dim > &s6 , + const Array< T , dim > &s7 , + const Array< T , dim > &s8 , + const Array< T , dim > &s9 , + const Array< T , dim > &s10 , Op op ) { for( size_t i=0 ; i<dim ; ++i ) op( s1[i] , s2[i] , s3[i] , s4[i] , s5[i] , s6[i] , s7[i] , s8[i] , s9[i] , s10[i] ); } - template< typename T , size_t dim , class Op > - static void for_each11( boost::array< T , dim > &s1 , - const boost::array< T , dim > &s2 , - const boost::array< T , dim > &s3 , - const boost::array< T , dim > &s4 , - const boost::array< T , dim > &s5 , - const boost::array< T , dim > &s6 , - const boost::array< T , dim > &s7 , - const boost::array< T , dim > &s8 , - const boost::array< T , dim > &s9 , - const boost::array< T , dim > &s10 , - const boost::array< T , dim > &s11 , Op op ) + template < template < typename, size_t > class Array, typename T, + size_t dim, class Op > + static void for_each11( Array< T , dim > &s1 , + const Array< T , dim > &s2 , + const Array< T , dim > &s3 , + const Array< T , dim > &s4 , + const Array< T , dim > &s5 , + const Array< T , dim > &s6 , + const Array< T , dim > &s7 , + const Array< T , dim > &s8 , + const Array< T , dim > &s9 , + const Array< T , dim > &s10 , + const Array< T , dim > &s11 , Op op ) { for( size_t i=0 ; i<dim ; ++i ) op( s1[i] , s2[i] , s3[i] , s4[i] , s5[i] , s6[i] , s7[i] , s8[i] , s9[i] , s10[i] , s11[i] ); } - template< typename T , size_t dim , class Op > - static void for_each12( boost::array< T , dim > &s1 , - const boost::array< T , dim > &s2 , - const boost::array< T , dim > &s3 , - const boost::array< T , dim > &s4 , - const boost::array< T , dim > &s5 , - const boost::array< T , dim > &s6 , - const boost::array< T , dim > &s7 , - const boost::array< T , dim > &s8 , - const boost::array< T , dim > &s9 , - const boost::array< T , dim > &s10 , - const boost::array< T , dim > &s11 , - const boost::array< T , dim > &s12 , Op op ) + template < template < typename, size_t > class Array, typename T, + size_t dim, class Op > + static void for_each12( Array< T , dim > &s1 , + const Array< T , dim > &s2 , + const Array< T , dim > &s3 , + const Array< T , dim > &s4 , + const Array< T , dim > &s5 , + const Array< T , dim > &s6 , + const Array< T , dim > &s7 , + const Array< T , dim > &s8 , + const Array< T , dim > &s9 , + const Array< T , dim > &s10 , + const Array< T , dim > &s11 , + const Array< T , dim > &s12 , Op op ) { for( size_t i=0 ; i<dim ; ++i ) 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] ); } - template< typename T , size_t dim , class Op > - static void for_each13( boost::array< T , dim > &s1 , - const boost::array< T , dim > &s2 , - const boost::array< T , dim > &s3 , - const boost::array< T , dim > &s4 , - const boost::array< T , dim > &s5 , - const boost::array< T , dim > &s6 , - const boost::array< T , dim > &s7 , - const boost::array< T , dim > &s8 , - const boost::array< T , dim > &s9 , - const boost::array< T , dim > &s10 , - const boost::array< T , dim > &s11 , - const boost::array< T , dim > &s12 , - const boost::array< T , dim > &s13 , Op op ) + template < template < typename, size_t > class Array, typename T, + size_t dim, class Op > + static void for_each13( Array< T , dim > &s1 , + const Array< T , dim > &s2 , + const Array< T , dim > &s3 , + const Array< T , dim > &s4 , + const Array< T , dim > &s5 , + const Array< T , dim > &s6 , + const Array< T , dim > &s7 , + const Array< T , dim > &s8 , + const Array< T , dim > &s9 , + const Array< T , dim > &s10 , + const Array< T , dim > &s11 , + const Array< T , dim > &s12 , + const Array< T , dim > &s13 , Op op ) { for( size_t i=0 ; i<dim ; ++i ) 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] ); } - template< typename T , size_t dim , class Op > - static void for_each14( boost::array< T , dim > &s1 , - const boost::array< T , dim > &s2 , - const boost::array< T , dim > &s3 , - const boost::array< T , dim > &s4 , - const boost::array< T , dim > &s5 , - const boost::array< T , dim > &s6 , - const boost::array< T , dim > &s7 , - const boost::array< T , dim > &s8 , - const boost::array< T , dim > &s9 , - const boost::array< T , dim > &s10 , - const boost::array< T , dim > &s11 , - const boost::array< T , dim > &s12 , - const boost::array< T , dim > &s13 , - const boost::array< T , dim > &s14 , Op op ) + template < template < typename, size_t > class Array, typename T, + size_t dim, class Op > + static void for_each14( Array< T , dim > &s1 , + const Array< T , dim > &s2 , + const Array< T , dim > &s3 , + const Array< T , dim > &s4 , + const Array< T , dim > &s5 , + const Array< T , dim > &s6 , + const Array< T , dim > &s7 , + const Array< T , dim > &s8 , + const Array< T , dim > &s9 , + const Array< T , dim > &s10 , + const Array< T , dim > &s11 , + const Array< T , dim > &s12 , + const Array< T , dim > &s13 , + const Array< T , dim > &s14 , Op op ) { for( size_t i=0 ; i<dim ; ++i ) 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] ); } - template< typename T , size_t dim , class Op > - static void for_each15( boost::array< T , dim > &s1 , - const boost::array< T , dim > &s2 , - const boost::array< T , dim > &s3 , - const boost::array< T , dim > &s4 , - const boost::array< T , dim > &s5 , - const boost::array< T , dim > &s6 , - const boost::array< T , dim > &s7 , - const boost::array< T , dim > &s8 , - const boost::array< T , dim > &s9 , - const boost::array< T , dim > &s10 , - const boost::array< T , dim > &s11 , - const boost::array< T , dim > &s12 , - const boost::array< T , dim > &s13 , - const boost::array< T , dim > &s14 , - const boost::array< T , dim > &s15 , Op op ) + template < template < typename, size_t > class Array, typename T, + size_t dim, class Op > + static void for_each15( Array< T , dim > &s1 , + const Array< T , dim > &s2 , + const Array< T , dim > &s3 , + const Array< T , dim > &s4 , + const Array< T , dim > &s5 , + const Array< T , dim > &s6 , + const Array< T , dim > &s7 , + const Array< T , dim > &s8 , + const Array< T , dim > &s9 , + const Array< T , dim > &s10 , + const Array< T , dim > &s11 , + const Array< T , dim > &s12 , + const Array< T , dim > &s13 , + const Array< T , dim > &s14 , + const Array< T , dim > &s15 , Op op ) { for( size_t i=0 ; i<dim ; ++i ) 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] ); } - template< typename T , size_t dim > - static typename norm_result_type< boost::array< T , dim > >::type norm_inf( const boost::array< T , dim > &s ) + template < template < typename, size_t > class Array, typename T, + size_t dim> + static typename norm_result_type< Array< T , dim > >::type norm_inf( const Array< T , dim > &s ) { BOOST_USING_STD_MAX(); using std::abs; - typedef typename norm_result_type< boost::array< T , dim > >::type result_type; + typedef typename norm_result_type< Array< T , dim > >::type result_type; result_type init = static_cast< result_type >( 0 ); for( size_t i=0 ; i<dim ; ++i ) init = max BOOST_PREVENT_MACRO_SUBSTITUTION ( init , static_cast< result_type >(abs(s[i])) ); |