File indexing completed on 2025-07-05 08:40:05
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018 #ifndef BOOST_NUMERIC_ODEINT_ALGEBRA_VECTOR_SPACE_ALGEBRA_HPP_INCLUDED
0019 #define BOOST_NUMERIC_ODEINT_ALGEBRA_VECTOR_SPACE_ALGEBRA_HPP_INCLUDED
0020
0021 #include <complex>
0022
0023 namespace boost {
0024 namespace numeric {
0025 namespace odeint {
0026
0027
0028
0029
0030 template< class State, class Enabler = void > struct vector_space_norm_inf;
0031
0032
0033
0034
0035 template<>
0036 struct vector_space_norm_inf< double >
0037 {
0038 typedef double result_type;
0039 double operator()( double x ) const
0040 {
0041 using std::abs;
0042 return abs(x);
0043 }
0044 };
0045
0046 template<>
0047 struct vector_space_norm_inf< float >
0048 {
0049 typedef float result_type;
0050 result_type operator()( float x ) const
0051 {
0052 using std::abs;
0053 return abs(x);
0054 }
0055 };
0056
0057 template< typename T >
0058 struct vector_space_norm_inf< std::complex<T> >
0059 {
0060 typedef T result_type;
0061 result_type operator()( std::complex<T> x ) const
0062 {
0063 using std::abs;
0064 return abs( x );
0065 }
0066 };
0067
0068 struct vector_space_algebra
0069 {
0070 template< class S1 , class Op >
0071 static void for_each1( S1 &s1 , Op op )
0072 {
0073
0074 op( s1 );
0075 }
0076
0077 template< class S1 , class S2 , class Op >
0078 static void for_each2( S1 &s1 , S2 &s2 , Op op )
0079 {
0080 op( s1 , s2 );
0081 }
0082
0083 template< class S1 , class S2 , class S3 , class Op >
0084 static void for_each3( S1 &s1 , S2 &s2 , S3 &s3 , Op op )
0085 {
0086 op( s1 , s2 , s3 );
0087 }
0088
0089 template< class S1 , class S2 , class S3 , class S4 , class Op >
0090 static void for_each4( S1 &s1 , S2 &s2 , S3 &s3 , S4 &s4 , Op op )
0091 {
0092 op( s1 , s2 , s3 , s4 );
0093 }
0094
0095 template< class S1 , class S2 , class S3 , class S4 , class S5 , class Op >
0096 static void for_each5( S1 &s1 , S2 &s2 , S3 &s3 , S4 &s4 , S5 &s5 , Op op )
0097 {
0098 op( s1 , s2 , s3 , s4 , s5 );
0099 }
0100
0101 template< class S1 , class S2 , class S3 , class S4 , class S5 , class S6 , class Op >
0102 static void for_each6( S1 &s1 , S2 &s2 , S3 &s3 , S4 &s4 , S5 &s5 , S6 &s6 , Op op )
0103 {
0104 op( s1 , s2 , s3 , s4 , s5 , s6 );
0105 }
0106
0107 template< class S1 , class S2 , class S3 , class S4 , class S5 , class S6 ,class S7 , class Op >
0108 static void for_each7( S1 &s1 , S2 &s2 , S3 &s3 , S4 &s4 , S5 &s5 , S6 &s6 , S7 &s7 , Op op )
0109 {
0110 op( s1 , s2 , s3 , s4 , s5 , s6 , s7 );
0111 }
0112
0113 template< class S1 , class S2 , class S3 , class S4 , class S5 , class S6 ,class S7 , class S8 , class Op >
0114 static void for_each8( S1 &s1 , S2 &s2 , S3 &s3 , S4 &s4 , S5 &s5 , S6 &s6 , S7 &s7 , S8 &s8 , Op op )
0115 {
0116 op( s1 , s2 , s3 , s4 , s5 , s6 , s7 , s8 );
0117 }
0118
0119 template< class S1 , class S2 , class S3 , class S4 , class S5 , class S6 ,class S7 , class S8 , class S9 , class Op >
0120 static void for_each9( S1 &s1 , S2 &s2 , S3 &s3 , S4 &s4 , S5 &s5 , S6 &s6 , S7 &s7 , S8 &s8 , S9 &s9 , Op op )
0121 {
0122 op( s1 , s2 , s3 , s4 , s5 , s6 , s7 , s8 , s9 );
0123 }
0124
0125 template< class S1 , class S2 , class S3 , class S4 , class S5 , class S6 ,class S7 , class S8 , class S9 , class S10 , class Op >
0126 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 )
0127 {
0128 op( s1 , s2 , s3 , s4 , s5 , s6 , s7 , s8 , s9 , s10 );
0129 }
0130
0131 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 >
0132 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 )
0133 {
0134 op( s1 , s2 , s3 , s4 , s5 , s6 , s7 , s8 , s9 , s10 , s11 );
0135 }
0136
0137 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 >
0138 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 )
0139 {
0140 op( s1 , s2 , s3 , s4 , s5 , s6 , s7 , s8 , s9 , s10 , s11 , s12 );
0141 }
0142
0143 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 >
0144 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 )
0145 {
0146 op( s1 , s2 , s3 , s4 , s5 , s6 , s7 , s8 , s9 , s10 , s11 , s12 , s13 );
0147 }
0148
0149 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 >
0150 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 )
0151 {
0152 op( s1 , s2 , s3 , s4 , s5 , s6 , s7 , s8 , s9 , s10 , s11 , s12 , s13 , s14 );
0153 }
0154
0155 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 >
0156 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 )
0157 {
0158 op( s1 , s2 , s3 , s4 , s5 , s6 , s7 , s8 , s9 , s10 , s11 , s12 , s13 , s14 , s15 );
0159 }
0160
0161 template< class S >
0162 static typename boost::numeric::odeint::vector_space_norm_inf< S >::result_type norm_inf( const S &s )
0163 {
0164 boost::numeric::odeint::vector_space_norm_inf< S > n;
0165 return n( s );
0166 }
0167 };
0168
0169
0170 }
0171 }
0172 }
0173
0174
0175 #endif