summaryrefslogtreecommitdiff
path: root/boost/numeric/odeint/algebra
diff options
context:
space:
mode:
Diffstat (limited to 'boost/numeric/odeint/algebra')
-rw-r--r--boost/numeric/odeint/algebra/algebra_dispatcher.hpp29
-rw-r--r--boost/numeric/odeint/algebra/array_algebra.hpp309
-rw-r--r--boost/numeric/odeint/algebra/multi_array_algebra.hpp4
3 files changed, 193 insertions, 149 deletions
diff --git a/boost/numeric/odeint/algebra/algebra_dispatcher.hpp b/boost/numeric/odeint/algebra/algebra_dispatcher.hpp
index df5aabac96..88cf159e03 100644
--- a/boost/numeric/odeint/algebra/algebra_dispatcher.hpp
+++ b/boost/numeric/odeint/algebra/algebra_dispatcher.hpp
@@ -17,8 +17,9 @@
#ifndef BOOST_NUMERIC_ODEINT_ALGEBRA_ALGEBRA_DISPATCHER_HPP_INCLUDED
#define BOOST_NUMERIC_ODEINT_ALGEBRA_ALGEBRA_DISPATCHER_HPP_INCLUDED
-#include <complex>
+#include <boost/numeric/odeint/config.hpp>
+#include <complex>
#include <boost/type_traits/is_floating_point.hpp>
#include <boost/numeric/ublas/vector.hpp>
@@ -38,14 +39,14 @@ namespace odeint {
template< class StateType , class Enabler = void >
struct algebra_dispatcher_sfinae
{
- // range_algebra is the standard algebra^
+ // range_algebra is the standard algebra
typedef range_algebra algebra_type;
};
template< class StateType >
struct algebra_dispatcher : algebra_dispatcher_sfinae< StateType > { };
-//specialize for array
+// specialize for array
template< class T , size_t N >
struct algebra_dispatcher< boost::array< T , N > >
{
@@ -84,4 +85,26 @@ struct algebra_dispatcher< boost::numeric::ublas::matrix< T , L , A > >
}
}
+#ifdef BOOST_NUMERIC_ODEINT_CXX11
+
+// c++11 mode: specialization for std::array if available
+
+#include <array>
+
+namespace boost {
+namespace numeric {
+namespace odeint {
+
+// specialize for std::array
+template< class T , size_t N >
+struct algebra_dispatcher< std::array< T , N > >
+{
+ typedef array_algebra algebra_type;
+};
+
+} } }
+
+#endif
+
+
#endif
diff --git a/boost/numeric/odeint/algebra/array_algebra.hpp b/boost/numeric/odeint/algebra/array_algebra.hpp
index c565d6dd76..471e866fe5 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])) );
diff --git a/boost/numeric/odeint/algebra/multi_array_algebra.hpp b/boost/numeric/odeint/algebra/multi_array_algebra.hpp
index 4d1fc16c3a..0bc476e631 100644
--- a/boost/numeric/odeint/algebra/multi_array_algebra.hpp
+++ b/boost/numeric/odeint/algebra/multi_array_algebra.hpp
@@ -113,13 +113,13 @@ struct multi_array_algebra
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 >
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 )
{
- detail::for_each14( s1.data() , s1.data() + s1.num_elements() , s2.data() , s3.data() , s4.data() , s5.data() , s6.data() , s7.data() , s8.data() , s9.data() , s10.data() , s11.data() , s12.data() , s14.data() , op );
+ detail::for_each14( s1.data() , s1.data() + s1.num_elements() , s2.data() , s3.data() , s4.data() , s5.data() , s6.data() , s7.data() , s8.data() , s9.data() , s10.data() , s11.data() , s12.data() , s13.data() , s14.data() , op );
}
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 >
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 )
{
- detail::for_each15( s1.data() , s1.data() + s1.num_elements() , s2.data() , s3.data() , s4.data() , s5.data() , s6.data() , s7.data() , s8.data() , s9.data() , s10.data() , s11.data() , s12.data() , s14.data() , s15.data() , op );
+ detail::for_each15( s1.data() , s1.data() + s1.num_elements() , s2.data() , s3.data() , s4.data() , s5.data() , s6.data() , s7.data() , s8.data() , s9.data() , s10.data() , s11.data() , s12.data() , s13.data() , s14.data() , s15.data() , op );
}
template< typename S >