Chris@16: /* Chris@16: [auto_generated] Chris@16: boost/numeric/odeint/algebra/default_operations.hpp Chris@16: Chris@16: [begin_description] Chris@16: Default operations. They work with the default numerical types, like float, double, complex< double> ... Chris@16: [end_description] Chris@16: Chris@101: Copyright 2010-2012 Karsten Ahnert Chris@101: Copyright 2010-2013 Mario Mulansky Chris@16: Chris@16: Distributed under the Boost Software License, Version 1.0. Chris@16: (See accompanying file LICENSE_1_0.txt or Chris@16: copy at http://www.boost.org/LICENSE_1_0.txt) Chris@16: */ Chris@16: Chris@16: Chris@16: #ifndef BOOST_NUMERIC_ODEINT_ALGEBRA_DEFAULT_OPERATIONS_HPP_INCLUDED Chris@16: #define BOOST_NUMERIC_ODEINT_ALGEBRA_DEFAULT_OPERATIONS_HPP_INCLUDED Chris@16: Chris@16: #include Chris@16: Chris@16: #include Chris@16: #include Chris@16: Chris@16: #include Chris@16: Chris@16: Chris@16: namespace boost { Chris@16: namespace numeric { Chris@16: namespace odeint { Chris@16: Chris@16: Chris@16: Chris@16: /* Chris@16: * Notes: Chris@16: * Chris@16: * * the results structs are needed in order to work with fusion_algebra Chris@16: */ Chris@16: struct default_operations Chris@16: { Chris@16: Chris@16: template< class Fac1 = double > Chris@16: struct scale Chris@16: { Chris@16: const Fac1 m_alpha1; Chris@16: Chris@16: scale( Fac1 alpha1 ) : m_alpha1( alpha1 ) { } Chris@16: Chris@16: template< class T1 > Chris@16: void operator()( T1 &t1 ) const Chris@16: { Chris@16: t1 *= m_alpha1; Chris@16: } Chris@16: Chris@16: typedef void result_type; Chris@16: }; Chris@16: Chris@16: template< class Fac1 = double > Chris@16: struct scale_sum1 Chris@16: { Chris@16: const Fac1 m_alpha1; Chris@16: Chris@16: scale_sum1( Fac1 alpha1 ) : m_alpha1( alpha1 ) { } Chris@16: Chris@16: template< class T1 , class T2 > Chris@16: void operator()( T1 &t1 , const T2 &t2 ) const Chris@16: { Chris@16: t1 = m_alpha1 * t2; Chris@16: } Chris@16: Chris@16: typedef void result_type; Chris@16: }; Chris@16: Chris@16: Chris@16: template< class Fac1 = double , class Fac2 = Fac1 > Chris@16: struct scale_sum2 Chris@16: { Chris@16: const Fac1 m_alpha1; Chris@16: const Fac2 m_alpha2; Chris@16: Chris@16: scale_sum2( Fac1 alpha1 , Fac2 alpha2 ) : m_alpha1( alpha1 ) , m_alpha2( alpha2 ) { } Chris@16: Chris@16: template< class T1 , class T2 , class T3 > Chris@16: void operator()( T1 &t1 , const T2 &t2 , const T3 &t3) const Chris@16: { Chris@16: t1 = m_alpha1 * t2 + m_alpha2 * t3; Chris@16: } Chris@16: Chris@16: typedef void result_type; Chris@16: }; Chris@16: Chris@16: Chris@16: template< class Fac1 = double , class Fac2 = Fac1 , class Fac3 = Fac2 > Chris@16: struct scale_sum3 Chris@16: { Chris@16: const Fac1 m_alpha1; Chris@16: const Fac2 m_alpha2; Chris@16: const Fac3 m_alpha3; Chris@16: Chris@16: scale_sum3( Fac1 alpha1 , Fac2 alpha2 , Fac3 alpha3 ) Chris@16: : m_alpha1( alpha1 ) , m_alpha2( alpha2 ) , m_alpha3( alpha3 ) { } Chris@16: Chris@16: template< class T1 , class T2 , class T3 , class T4 > Chris@16: void operator()( T1 &t1 , const T2 &t2 , const T3 &t3 , const T4 &t4 ) const Chris@16: { Chris@16: t1 = m_alpha1 * t2 + m_alpha2 * t3 + m_alpha3 * t4; Chris@16: } Chris@16: Chris@16: typedef void result_type; Chris@16: }; Chris@16: Chris@16: Chris@16: template< class Fac1 = double , class Fac2 = Fac1 , class Fac3 = Fac2 , class Fac4 = Fac3 > Chris@16: struct scale_sum4 Chris@16: { Chris@16: const Fac1 m_alpha1; Chris@16: const Fac2 m_alpha2; Chris@16: const Fac3 m_alpha3; Chris@16: const Fac4 m_alpha4; Chris@16: Chris@16: scale_sum4( Fac1 alpha1 , Fac2 alpha2 , Fac3 alpha3 , Fac4 alpha4 ) Chris@16: : m_alpha1( alpha1 ) , m_alpha2( alpha2 ) , m_alpha3( alpha3 ) , m_alpha4( alpha4 ) { } Chris@16: Chris@16: template< class T1 , class T2 , class T3 , class T4 , class T5 > Chris@16: void operator()( T1 &t1 , const T2 &t2 , const T3 &t3 , const T4 &t4 , const T5 &t5) const Chris@16: { Chris@16: t1 = m_alpha1 * t2 + m_alpha2 * t3 + m_alpha3 * t4 + m_alpha4 * t5; Chris@16: } Chris@16: Chris@16: typedef void result_type; Chris@16: }; Chris@16: Chris@16: Chris@16: template< class Fac1 = double , class Fac2 = Fac1 , class Fac3 = Fac2 , class Fac4 = Fac3 , class Fac5 = Fac4 > Chris@16: struct scale_sum5 Chris@16: { Chris@16: const Fac1 m_alpha1; Chris@16: const Fac2 m_alpha2; Chris@16: const Fac3 m_alpha3; Chris@16: const Fac4 m_alpha4; Chris@16: const Fac5 m_alpha5; Chris@16: Chris@16: scale_sum5( Fac1 alpha1 , Fac2 alpha2 , Fac3 alpha3 , Fac4 alpha4 , Fac5 alpha5 ) Chris@16: : m_alpha1( alpha1 ) , m_alpha2( alpha2 ) , m_alpha3( alpha3 ) , m_alpha4( alpha4 ) , m_alpha5( alpha5 ) { } Chris@16: Chris@16: template< class T1 , class T2 , class T3 , class T4 , class T5 , class T6 > Chris@16: void operator()( T1 &t1 , const T2 &t2 , const T3 &t3 , const T4 &t4 , const T5 &t5 , const T6 &t6) const Chris@16: { Chris@16: t1 = m_alpha1 * t2 + m_alpha2 * t3 + m_alpha3 * t4 + m_alpha4 * t5 + m_alpha5 * t6; Chris@16: } Chris@16: Chris@16: typedef void result_type; Chris@16: }; Chris@16: Chris@16: Chris@16: template< class Fac1 = double , class Fac2 = Fac1 , class Fac3 = Fac2 , class Fac4 = Fac3 , class Fac5 = Fac4 , class Fac6 = Fac5 > Chris@16: struct scale_sum6 Chris@16: { Chris@16: const Fac1 m_alpha1; Chris@16: const Fac2 m_alpha2; Chris@16: const Fac3 m_alpha3; Chris@16: const Fac4 m_alpha4; Chris@16: const Fac5 m_alpha5; Chris@16: const Fac6 m_alpha6; Chris@16: Chris@16: scale_sum6( Fac1 alpha1 , Fac2 alpha2 , Fac3 alpha3 , Fac4 alpha4 , Fac5 alpha5 , Fac6 alpha6 ) Chris@16: : m_alpha1( alpha1 ) , m_alpha2( alpha2 ) , m_alpha3( alpha3 ) , m_alpha4( alpha4 ) , m_alpha5( alpha5 ) , m_alpha6( alpha6 ){ } Chris@16: Chris@16: template< class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 > Chris@16: 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: { Chris@16: t1 = m_alpha1 * t2 + m_alpha2 * t3 + m_alpha3 * t4 + m_alpha4 * t5 + m_alpha5 * t6 + m_alpha6 * t7; Chris@16: } Chris@16: Chris@16: typedef void result_type; Chris@16: }; Chris@16: Chris@16: Chris@16: template< class Fac1 = double , class Fac2 = Fac1 , class Fac3 = Fac2 , class Fac4 = Fac3 , class Fac5 = Fac4 , class Fac6 = Fac5 , class Fac7 = Fac6 > Chris@16: struct scale_sum7 Chris@16: { Chris@16: const Fac1 m_alpha1; Chris@16: const Fac2 m_alpha2; Chris@16: const Fac3 m_alpha3; Chris@16: const Fac4 m_alpha4; Chris@16: const Fac5 m_alpha5; Chris@16: const Fac6 m_alpha6; Chris@16: const Fac7 m_alpha7; Chris@16: Chris@16: scale_sum7( Fac1 alpha1 , Fac2 alpha2 , Fac3 alpha3 , Fac4 alpha4 , Chris@16: Fac5 alpha5 , Fac6 alpha6 , Fac7 alpha7 ) Chris@16: : m_alpha1( alpha1 ) , m_alpha2( alpha2 ) , m_alpha3( alpha3 ) , m_alpha4( alpha4 ) , m_alpha5( alpha5 ) , m_alpha6( alpha6 ) , m_alpha7( alpha7 ) { } Chris@16: Chris@16: template< class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 > Chris@16: 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: { Chris@16: t1 = m_alpha1 * t2 + m_alpha2 * t3 + m_alpha3 * t4 + m_alpha4 * t5 + m_alpha5 * t6 + m_alpha6 * t7 + m_alpha7 * t8; Chris@16: } Chris@16: Chris@16: typedef void result_type; Chris@16: }; Chris@16: Chris@16: Chris@16: 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: struct scale_sum8 Chris@16: { Chris@16: const Fac1 m_alpha1; Chris@16: const Fac2 m_alpha2; Chris@16: const Fac3 m_alpha3; Chris@16: const Fac4 m_alpha4; Chris@16: const Fac5 m_alpha5; Chris@16: const Fac6 m_alpha6; Chris@16: const Fac7 m_alpha7; Chris@16: const Fac8 m_alpha8; Chris@16: Chris@16: scale_sum8( Fac1 alpha1 , Fac2 alpha2 , Fac3 alpha3 , Fac4 alpha4 , Chris@16: Fac5 alpha5 , Fac6 alpha6 , Fac7 alpha7 , Fac8 alpha8 ) Chris@16: : 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: Chris@16: template< class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 > Chris@16: 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: { Chris@16: 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: } Chris@16: Chris@16: typedef void result_type; Chris@16: }; Chris@16: Chris@16: 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: struct scale_sum9 Chris@16: { Chris@16: const Fac1 m_alpha1; Chris@16: const Fac2 m_alpha2; Chris@16: const Fac3 m_alpha3; Chris@16: const Fac4 m_alpha4; Chris@16: const Fac5 m_alpha5; Chris@16: const Fac6 m_alpha6; Chris@16: const Fac7 m_alpha7; Chris@16: const Fac8 m_alpha8; Chris@16: const Fac9 m_alpha9; Chris@16: Chris@16: scale_sum9( Fac1 alpha1 , Fac2 alpha2 , Fac3 alpha3 , Fac4 alpha4 , Chris@16: Fac5 alpha5 , Fac6 alpha6 , Fac7 alpha7 , Fac8 alpha8 , Fac9 alpha9 ) Chris@16: : 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: Chris@16: template< class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 > Chris@16: 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: { Chris@16: 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: } Chris@16: Chris@16: typedef void result_type; Chris@16: }; Chris@16: Chris@16: 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: struct scale_sum10 Chris@16: { Chris@16: const Fac1 m_alpha1; Chris@16: const Fac2 m_alpha2; Chris@16: const Fac3 m_alpha3; Chris@16: const Fac4 m_alpha4; Chris@16: const Fac5 m_alpha5; Chris@16: const Fac6 m_alpha6; Chris@16: const Fac7 m_alpha7; Chris@16: const Fac8 m_alpha8; Chris@16: const Fac9 m_alpha9; Chris@16: const Fac10 m_alpha10; Chris@16: Chris@16: scale_sum10( Fac1 alpha1 , Fac2 alpha2 , Fac3 alpha3 , Fac4 alpha4 , Chris@16: Fac5 alpha5 , Fac6 alpha6 , Fac7 alpha7 , Fac8 alpha8 , Fac9 alpha9 , Fac10 alpha10 ) Chris@16: : 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: Chris@16: 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: 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: { Chris@16: 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: } Chris@16: Chris@16: typedef void result_type; Chris@16: }; Chris@16: Chris@16: Chris@16: 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: struct scale_sum11 Chris@16: { Chris@16: const Fac1 m_alpha1; Chris@16: const Fac2 m_alpha2; Chris@16: const Fac3 m_alpha3; Chris@16: const Fac4 m_alpha4; Chris@16: const Fac5 m_alpha5; Chris@16: const Fac6 m_alpha6; Chris@16: const Fac7 m_alpha7; Chris@16: const Fac8 m_alpha8; Chris@16: const Fac9 m_alpha9; Chris@16: const Fac10 m_alpha10; Chris@16: const Fac11 m_alpha11; Chris@16: Chris@16: scale_sum11( Fac1 alpha1 , Fac2 alpha2 , Fac3 alpha3 , Fac4 alpha4 , Chris@16: Fac5 alpha5 , Fac6 alpha6 , Fac7 alpha7 , Fac8 alpha8 , Fac9 alpha9 , Chris@16: Fac10 alpha10 , Fac11 alpha11 ) Chris@16: : 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: Chris@16: 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: 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: { Chris@16: 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: } Chris@16: Chris@16: typedef void result_type; Chris@16: }; Chris@16: Chris@16: 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: struct scale_sum12 Chris@16: { Chris@16: const Fac1 m_alpha1; Chris@16: const Fac2 m_alpha2; Chris@16: const Fac3 m_alpha3; Chris@16: const Fac4 m_alpha4; Chris@16: const Fac5 m_alpha5; Chris@16: const Fac6 m_alpha6; Chris@16: const Fac7 m_alpha7; Chris@16: const Fac8 m_alpha8; Chris@16: const Fac9 m_alpha9; Chris@16: const Fac10 m_alpha10; Chris@16: const Fac11 m_alpha11; Chris@16: const Fac12 m_alpha12; Chris@16: Chris@16: scale_sum12( Fac1 alpha1 , Fac2 alpha2 , Fac3 alpha3 , Fac4 alpha4 , Chris@16: Fac5 alpha5 , Fac6 alpha6 , Fac7 alpha7 , Fac8 alpha8 , Fac9 alpha9 , Chris@16: Fac10 alpha10 , Fac11 alpha11 , Fac12 alpha12 ) Chris@16: : 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: Chris@16: 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: 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: { Chris@16: 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: } Chris@16: Chris@16: typedef void result_type; Chris@16: }; Chris@16: Chris@16: 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: struct scale_sum13 Chris@16: { Chris@16: const Fac1 m_alpha1; Chris@16: const Fac2 m_alpha2; Chris@16: const Fac3 m_alpha3; Chris@16: const Fac4 m_alpha4; Chris@16: const Fac5 m_alpha5; Chris@16: const Fac6 m_alpha6; Chris@16: const Fac7 m_alpha7; Chris@16: const Fac8 m_alpha8; Chris@16: const Fac9 m_alpha9; Chris@16: const Fac10 m_alpha10; Chris@16: const Fac11 m_alpha11; Chris@16: const Fac12 m_alpha12; Chris@16: const Fac13 m_alpha13; Chris@16: Chris@16: scale_sum13( Fac1 alpha1 , Fac2 alpha2 , Fac3 alpha3 , Fac4 alpha4 , Chris@16: Fac5 alpha5 , Fac6 alpha6 , Fac7 alpha7 , Fac8 alpha8 , Fac9 alpha9 , Chris@16: Fac10 alpha10 , Fac11 alpha11 , Fac12 alpha12 , Fac13 alpha13 ) Chris@16: : 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: Chris@16: 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: 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: { Chris@16: 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: } Chris@16: Chris@16: typedef void result_type; Chris@16: }; Chris@16: Chris@16: 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: struct scale_sum14 Chris@16: { Chris@16: const Fac1 m_alpha1; Chris@16: const Fac2 m_alpha2; Chris@16: const Fac3 m_alpha3; Chris@16: const Fac4 m_alpha4; Chris@16: const Fac5 m_alpha5; Chris@16: const Fac6 m_alpha6; Chris@16: const Fac7 m_alpha7; Chris@16: const Fac8 m_alpha8; Chris@16: const Fac9 m_alpha9; Chris@16: const Fac10 m_alpha10; Chris@16: const Fac11 m_alpha11; Chris@16: const Fac12 m_alpha12; Chris@16: const Fac13 m_alpha13; Chris@16: const Fac14 m_alpha14; Chris@16: Chris@16: scale_sum14( Fac1 alpha1 , Fac2 alpha2 , Fac3 alpha3 , Fac4 alpha4 , Chris@16: Fac5 alpha5 , Fac6 alpha6 , Fac7 alpha7 , Fac8 alpha8 , Fac9 alpha9 , Chris@16: Fac10 alpha10 , Fac11 alpha11 , Fac12 alpha12 , Fac13 alpha13 , Fac14 alpha14 ) Chris@16: : 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: Chris@16: 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: 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: { Chris@16: 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: } Chris@16: Chris@16: typedef void result_type; Chris@16: }; Chris@16: Chris@16: template< class Fac1 = double , class Fac2 = Fac1 > Chris@16: struct scale_sum_swap2 Chris@16: { Chris@16: const Fac1 m_alpha1; Chris@16: const Fac2 m_alpha2; Chris@16: Chris@16: scale_sum_swap2( Fac1 alpha1 , Fac2 alpha2 ) : m_alpha1( alpha1 ) , m_alpha2( alpha2 ) { } Chris@16: Chris@16: template< class T1 , class T2 , class T3 > Chris@16: void operator()( T1 &t1 , T2 &t2 , const T3 &t3) const Chris@16: { Chris@16: const T1 tmp( t1 ); Chris@16: t1 = m_alpha1 * t2 + m_alpha2 * t3; Chris@16: t2 = tmp; Chris@16: } Chris@16: Chris@16: typedef void result_type; Chris@16: }; Chris@16: Chris@16: /* Chris@16: * for usage in for_each2 Chris@16: * Chris@16: * Works with boost::units by eliminating the unit Chris@16: */ Chris@16: template< class Fac1 = double > Chris@16: struct rel_error Chris@16: { Chris@16: const Fac1 m_eps_abs , m_eps_rel , m_a_x , m_a_dxdt; Chris@16: Chris@16: rel_error( Fac1 eps_abs , Fac1 eps_rel , Fac1 a_x , Fac1 a_dxdt ) Chris@16: : m_eps_abs( eps_abs ) , m_eps_rel( eps_rel ) , m_a_x( a_x ) , m_a_dxdt( a_dxdt ) { } Chris@16: Chris@16: Chris@16: template< class T1 , class T2 , class T3 > Chris@16: void operator()( T3 &t3 , const T1 &t1 , const T2 &t2 ) const Chris@16: { Chris@16: using std::abs; Chris@16: 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: } Chris@16: Chris@16: typedef void result_type; Chris@16: }; Chris@16: Chris@16: Chris@16: /* Chris@16: * for usage in for_each3 Chris@16: * Chris@16: * used in the controller for the rosenbrock4 method Chris@16: * Chris@16: * Works with boost::units by eliminating the unit Chris@16: */ Chris@16: template< class Fac1 = double > Chris@16: struct default_rel_error Chris@16: { Chris@16: const Fac1 m_eps_abs , m_eps_rel ; Chris@16: Chris@16: default_rel_error( Fac1 eps_abs , Fac1 eps_rel ) Chris@16: : m_eps_abs( eps_abs ) , m_eps_rel( eps_rel ) { } Chris@16: Chris@16: Chris@16: /* Chris@16: * xerr = xerr / ( eps_abs + eps_rel * max( x , x_old ) ) Chris@16: */ Chris@16: template< class T1 , class T2 , class T3 > Chris@16: void operator()( T3 &t3 , const T1 &t1 , const T2 &t2 ) const Chris@16: { Chris@16: BOOST_USING_STD_MAX(); Chris@16: using std::abs; Chris@16: Fac1 x1 = abs( get_unit_value( t1 ) ) , x2 = abs( get_unit_value( t2 ) ); Chris@16: set_unit_value( t3 , abs( get_unit_value( t3 ) ) / ( m_eps_abs + m_eps_rel * max BOOST_PREVENT_MACRO_SUBSTITUTION ( x1 , x2 ) ) ); Chris@16: } Chris@16: Chris@16: typedef void result_type; Chris@16: }; Chris@16: Chris@16: Chris@16: Chris@16: /* Chris@16: * for usage in reduce Chris@16: */ Chris@16: Chris@16: template< class Value > Chris@16: struct maximum Chris@16: { Chris@16: template< class Fac1 , class Fac2 > Chris@16: Value operator()( Fac1 t1 , const Fac2 t2 ) const Chris@16: { Chris@16: using std::abs; Chris@16: Value a1 = abs( get_unit_value( t1 ) ) , a2 = abs( get_unit_value( t2 ) ); Chris@16: return ( a1 < a2 ) ? a2 : a1 ; Chris@16: } Chris@16: Chris@16: typedef Value result_type; Chris@16: }; Chris@16: Chris@16: Chris@16: template< class Fac1 = double > Chris@16: struct rel_error_max Chris@16: { Chris@16: const Fac1 m_eps_abs , m_eps_rel; Chris@16: Chris@16: rel_error_max( Fac1 eps_abs , Fac1 eps_rel ) Chris@16: : m_eps_abs( eps_abs ) , m_eps_rel( eps_rel ) Chris@16: { } Chris@16: Chris@16: template< class Res , class T1 , class T2 , class T3 > Chris@16: Res operator()( Res r , const T1 &x_old , const T2 &x , const T3 &x_err ) Chris@16: { Chris@16: BOOST_USING_STD_MAX(); Chris@16: using std::abs; Chris@16: 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: return max BOOST_PREVENT_MACRO_SUBSTITUTION ( r , tmp ); Chris@16: } Chris@16: }; Chris@16: Chris@16: Chris@16: template< class Fac1 = double > Chris@16: struct rel_error_max2 Chris@16: { Chris@16: const Fac1 m_eps_abs , m_eps_rel , m_a_x , m_a_dxdt; Chris@16: Chris@16: rel_error_max2( Fac1 eps_abs , Fac1 eps_rel , Fac1 a_x , Fac1 a_dxdt ) Chris@16: : m_eps_abs( eps_abs ) , m_eps_rel( eps_rel ) , m_a_x( a_x ) , m_a_dxdt( a_dxdt ) Chris@16: { } Chris@16: Chris@16: template< class Res , class T1 , class T2 , class T3 , class T4 > Chris@16: Res operator()( Res r , const T1 &x_old , const T2 &x , const T3 &dxdt_old , const T4 &x_err ) Chris@16: { Chris@16: BOOST_USING_STD_MAX(); Chris@16: using std::abs; Chris@16: Res tmp = abs( get_unit_value( x_err ) ) / Chris@16: ( 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: return max BOOST_PREVENT_MACRO_SUBSTITUTION ( r , tmp ); Chris@16: } Chris@16: }; Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: template< class Fac1 = double > Chris@16: struct rel_error_l2 Chris@16: { Chris@16: const Fac1 m_eps_abs , m_eps_rel; Chris@16: Chris@16: rel_error_l2( Fac1 eps_abs , Fac1 eps_rel ) Chris@16: : m_eps_abs( eps_abs ) , m_eps_rel( eps_rel ) Chris@16: { } Chris@16: Chris@16: template< class Res , class T1 , class T2 , class T3 > Chris@16: Res operator()( Res r , const T1 &x_old , const T2 &x , const T3 &x_err ) Chris@16: { Chris@16: BOOST_USING_STD_MAX(); Chris@16: using std::abs; Chris@16: 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: return r + tmp * tmp; Chris@16: } Chris@16: }; Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: template< class Fac1 = double > Chris@16: struct rel_error_l2_2 Chris@16: { Chris@16: const Fac1 m_eps_abs , m_eps_rel , m_a_x , m_a_dxdt; Chris@16: Chris@16: rel_error_l2_2( Fac1 eps_abs , Fac1 eps_rel , Fac1 a_x , Fac1 a_dxdt ) Chris@16: : m_eps_abs( eps_abs ) , m_eps_rel( eps_rel ) , m_a_x( a_x ) , m_a_dxdt( a_dxdt ) Chris@16: { } Chris@16: Chris@16: template< class Res , class T1 , class T2 , class T3 , class T4 > Chris@16: Res operator()( Res r , const T1 &x_old , const T2 &x , const T3 &dxdt_old , const T4 &x_err ) Chris@16: { Chris@16: using std::abs; Chris@16: Res tmp = abs( get_unit_value( x_err ) ) / Chris@16: ( 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: return r + tmp * tmp; Chris@16: } Chris@16: }; Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: }; Chris@16: Chris@16: Chris@16: } // odeint Chris@16: } // numeric Chris@16: } // boost Chris@16: Chris@16: Chris@16: #endif // BOOST_NUMERIC_ODEINT_ALGEBRA_DEFAULT_OPERATIONS_HPP_INCLUDED