diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-27 18:24:20 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-27 18:24:20 +0000 |
commit | 483eb2f56657e8e7f419ab1a4fab8dce9ade8609 (patch) | |
tree | e5d88d25d870d5dedacb6bbdbe2a966086a0a5cf /src/boost/libs/numeric/odeint/examples/gmpxx | |
parent | Initial commit. (diff) | |
download | ceph-upstream.tar.xz ceph-upstream.zip |
Adding upstream version 14.2.21.upstream/14.2.21upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'src/boost/libs/numeric/odeint/examples/gmpxx')
-rw-r--r-- | src/boost/libs/numeric/odeint/examples/gmpxx/Makefile | 5 | ||||
-rw-r--r-- | src/boost/libs/numeric/odeint/examples/gmpxx/lorenz_gmpxx.cpp | 83 |
2 files changed, 88 insertions, 0 deletions
diff --git a/src/boost/libs/numeric/odeint/examples/gmpxx/Makefile b/src/boost/libs/numeric/odeint/examples/gmpxx/Makefile new file mode 100644 index 00000000..0a9f7cb0 --- /dev/null +++ b/src/boost/libs/numeric/odeint/examples/gmpxx/Makefile @@ -0,0 +1,5 @@ +CXXFLAGS = -I${BOOST_ROOT} -O2 -static +LDFLAGS = -lgmpxx -lgmp + +lorenz_gmpxx: lorenz_gmpxx.cpp + ${CXX} ${CXXFLAGS} lorenz_gmpxx.cpp ${LDFLAGS} -o lorenz_gmpxx diff --git a/src/boost/libs/numeric/odeint/examples/gmpxx/lorenz_gmpxx.cpp b/src/boost/libs/numeric/odeint/examples/gmpxx/lorenz_gmpxx.cpp new file mode 100644 index 00000000..39b4c72e --- /dev/null +++ b/src/boost/libs/numeric/odeint/examples/gmpxx/lorenz_gmpxx.cpp @@ -0,0 +1,83 @@ +/* + * lorenz_gmpxx.cpp + * + * This example demonstrates how odeint can be used with arbitrary precision types. + * + * Copyright 2011-2012 Karsten Ahnert + * Copyright 2011-2012 Mario Mulansky + * + * Distributed under the Boost Software License, Version 1.0. + * (See accompanying file LICENSE_1_0.txt or + * copy at http://www.boost.org/LICENSE_1_0.txt) + */ + + + +#include <iostream> +#include <boost/array.hpp> + +#include <gmpxx.h> + +#include <boost/numeric/odeint.hpp> + +using namespace std; +using namespace boost::numeric::odeint; + +//[ gmpxx_lorenz +typedef mpf_class value_type; +typedef boost::array< value_type , 3 > state_type; + +struct lorenz +{ + void operator()( const state_type &x , state_type &dxdt , value_type t ) const + { + const value_type sigma( 10.0 ); + const value_type R( 28.0 ); + const value_type b( value_type( 8.0 ) / value_type( 3.0 ) ); + + dxdt[0] = sigma * ( x[1] - x[0] ); + dxdt[1] = R * x[0] - x[1] - x[0] * x[2]; + dxdt[2] = -b * x[2] + x[0] * x[1]; + } +}; +//] + + + + +struct streaming_observer +{ + std::ostream& m_out; + + streaming_observer( std::ostream &out ) : m_out( out ) { } + + template< class State , class Time > + void operator()( const State &x , Time t ) const + { + m_out << t; + for( size_t i=0 ; i<x.size() ; ++i ) m_out << "\t" << x[i] ; + m_out << "\n"; + } +}; + + + + + + +int main( int argc , char **argv ) +{ + //[ gmpxx_integration + const int precision = 1024; + mpf_set_default_prec( precision ); + + state_type x = {{ value_type( 10.0 ) , value_type( 10.0 ) , value_type( 10.0 ) }}; + + cout.precision( 1000 ); + integrate_const( runge_kutta4< state_type , value_type >() , + lorenz() , x , value_type( 0.0 ) , value_type( 10.0 ) , value_type( value_type( 1.0 ) / value_type( 10.0 ) ) , + streaming_observer( cout ) ); + //] + + return 0; +} |