headmyshoulder / odeint-v2

odeint - solving ordinary differential equations in c++ v2
http://headmyshoulder.github.com/odeint-v2/
Other
340 stars 101 forks source link

stiff_system + mutliprecision #115

Closed nblinov closed 10 years ago

nblinov commented 10 years ago

Hello,

I'm trying to combine a stiff solver with boost::multiprecision. Changing stiff_system.cpp example to

#include <iostream>
#include <fstream>
#include <utility>

#include "../odeint-v2/boost/numeric/odeint.hpp"
#include <boost/multiprecision/cpp_dec_float.hpp>

#include <boost/phoenix/core.hpp>

#include <boost/phoenix/core.hpp>
#include <boost/phoenix/operator.hpp>

using namespace std;
using namespace boost::numeric::odeint;
namespace phoenix = boost::phoenix;

typedef boost::multiprecision::cpp_dec_float_50 value_type;
typedef boost::array< value_type , 3 > state_type;
//typedef double value_type;

//[ stiff_system_definition

typedef boost::numeric::ublas::vector< value_type > vector_type;
typedef boost::numeric::ublas::matrix< value_type > matrix_type;

struct stiff_system
{
    void operator()( const vector_type &x , vector_type &dxdt , value_type /* t */ )
    {
        dxdt[ 0 ] = -101.0 * x[ 0 ] - 100.0 * x[ 1 ];
        dxdt[ 1 ] = x[ 0 ];
    }
};

struct stiff_system_jacobi
{
    void operator()( const vector_type & /* x */ , matrix_type &J , const value_type & /* t */ , vector_type &dfdt )
    {
        J( 0 , 0 ) = -101.0;
        J( 0 , 1 ) = -100.0;
        J( 1 , 0 ) = 1.0;
        J( 1 , 1 ) = 0.0;
        dfdt[0] = 0.0;
        dfdt[1] = 0.0;
    }
};
//]

int main( int argc , char **argv )
{
    //[ integrate_stiff_system
    vector_type x( 2 , 1.0 );

    size_t num_of_steps = integrate_const( make_dense_output< rosenbrock4< value_type > >( 1.0e-6 , 1.0e-6 ) ,
            make_pair( stiff_system() , stiff_system_jacobi() ) ,
            x , 0.0 , 50.0 , 0.01 ,
            cout << phoenix::arg_names::arg2 << " " << phoenix::arg_names::arg1[0] << "\n" );
    //]
    clog << num_of_steps << endl;

    return 0;
}

gives rise to the following (terribly long error)

In file included from ../odeint-v2/boost/numeric/odeint/integrate/integrate_adaptive.hpp:25,
                 from ../odeint-v2/boost/numeric/odeint/integrate/integrate.hpp:26,
                 from ../odeint-v2/boost/numeric/odeint.hpp:64,
                 from stiff_system.cpp:16:
../odeint-v2/boost/numeric/odeint/integrate/detail/integrate_adaptive.hpp: In function ‘size_t boost::numeric::odeint::detail::integrate_adaptive(Stepper, System, State&, Time, Time, Time, Observer, boost::numeric::odeint::dense_output_stepper_tag) [with Stepper = boost::numeric::odeint::rosenbrock4_dense_output<boost::numeric::odeint::rosenbrock4_controller<boost::numeric::odeint::rosenbrock4<boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<50u, int, void>, (boost::multiprecision::expression_template_option)1u>, boost::numeric::odeint::default_rosenbrock_coefficients<boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<50u, int, void>, (boost::multiprecision::expression_template_option)1u> >, boost::numeric::odeint::initially_resizer> > >, System = std::pair<stiff_system, stiff_system_jacobi>, State = boost::numeric::ublas::vector<boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<50u, int, void>, (boost::multiprecision::expression_template_option)1u>, boost::numeric::ublas::unbounded_array<boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<50u, int, void>, (boost::multiprecision::expression_template_option)1u>, std::allocator<boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<50u, int, void>, (boost::multiprecision::expression_template_option)1u> > > >, Time = double, Observer = boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_left, boost::proto::argsns_::list2<boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_left, boost::proto::argsns_::list2<boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_left, boost::proto::argsns_::list2<boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_left, boost::proto::argsns_::list2<boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<std::basic_ostream<char, std::char_traits<char> >&>, 0l> >, boost::phoenix::actor<boost::proto::exprns_::basic_expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<boost::phoenix::argument<2> >, 0l> > >, 2l> >, boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<char [2]>, 0l> > >, 2l> >, boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::subscript, boost::proto::argsns_::list2<boost::proto::exprns_::basic_expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<boost::phoenix::argument<1> >, 0l>, boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<int>, 0l> > >, 2l> > >, 2l> >, boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<char [2]>, 0l> > >, 2l> >]’:
../odeint-v2/boost/numeric/odeint/integrate/integrate_const.hpp:54:   instantiated from ‘size_t boost::numeric::odeint::integrate_const(Stepper, System, State&, Time, Time, Time, Observer) [with Stepper = boost::numeric::odeint::rosenbrock4_dense_output<boost::numeric::odeint::rosenbrock4_controller<boost::numeric::odeint::rosenbrock4<boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<50u, int, void>, (boost::multiprecision::expression_template_option)1u>, boost::numeric::odeint::default_rosenbrock_coefficients<boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<50u, int, void>, (boost::multiprecision::expression_template_option)1u> >, boost::numeric::odeint::initially_resizer> > >, System = std::pair<stiff_system, stiff_system_jacobi>, State = vector_type, Time = double, Observer = boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_left, boost::proto::argsns_::list2<boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_left, boost::proto::argsns_::list2<boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_left, boost::proto::argsns_::list2<boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_left, boost::proto::argsns_::list2<boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<std::basic_ostream<char, std::char_traits<char> >&>, 0l> >, boost::phoenix::actor<boost::proto::exprns_::basic_expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<boost::phoenix::argument<2> >, 0l> > >, 2l> >, boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<char [2]>, 0l> > >, 2l> >, boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::subscript, boost::proto::argsns_::list2<boost::proto::exprns_::basic_expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<boost::phoenix::argument<1> >, 0l>, boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<int>, 0l> > >, 2l> > >, 2l> >, boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<char [2]>, 0l> > >, 2l> >]’
stiff_system.cpp:72:   instantiated from here
../odeint-v2/boost/numeric/odeint/integrate/detail/integrate_adaptive.hpp:131: error: no matching function for call to ‘less_with_sign(boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<50u, int, void>, (boost::multiprecision::expression_template_option)1u>, double&, boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<50u, int, void>, (boost::multiprecision::expression_template_option)1u>)’
../odeint-v2/boost/numeric/odeint/integrate/integrate_const.hpp:54:   instantiated from ‘size_t boost::numeric::odeint::integrate_const(Stepper, System, State&, Time, Time, Time, Observer) [with Stepper = boost::numeric::odeint::rosenbrock4_dense_output<boost::numeric::odeint::rosenbrock4_controller<boost::numeric::odeint::rosenbrock4<boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<50u, int, void>, (boost::multiprecision::expression_template_option)1u>, boost::numeric::odeint::default_rosenbrock_coefficients<boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<50u, int, void>, (boost::multiprecision::expression_template_option)1u> >, boost::numeric::odeint::initially_resizer> > >, System = std::pair<stiff_system, stiff_system_jacobi>, State = vector_type, Time = double, Observer = boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_left, boost::proto::argsns_::list2<boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_left, boost::proto::argsns_::list2<boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_left, boost::proto::argsns_::list2<boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_left, boost::proto::argsns_::list2<boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<std::basic_ostream<char, std::char_traits<char> >&>, 0l> >, boost::phoenix::actor<boost::proto::exprns_::basic_expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<boost::phoenix::argument<2> >, 0l> > >, 2l> >, boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<char [2]>, 0l> > >, 2l> >, boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::subscript, boost::proto::argsns_::list2<boost::proto::exprns_::basic_expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<boost::phoenix::argument<1> >, 0l>, boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<int>, 0l> > >, 2l> > >, 2l> >, boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<char [2]>, 0l> > >, 2l> >]’
stiff_system.cpp:72:   instantiated from here
../odeint-v2/boost/numeric/odeint/integrate/detail/integrate_adaptive.hpp:133: error: invalid static_cast from type ‘boost::multiprecision::detail::expression<boost::multiprecision::detail::add_immediates, boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<50u, int, void>, (boost::multiprecision::expression_template_option)1u>, boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<50u, int, void>, (boost::multiprecision::expression_template_option)1u>, void, void>’ to type ‘double’
../odeint-v2/boost/numeric/odeint/integrate/integrate_const.hpp:54:   instantiated from ‘size_t boost::numeric::odeint::integrate_const(Stepper, System, State&, Time, Time, Time, Observer) [with Stepper = boost::numeric::odeint::rosenbrock4_dense_output<boost::numeric::odeint::rosenbrock4_controller<boost::numeric::odeint::rosenbrock4<boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<50u, int, void>, (boost::multiprecision::expression_template_option)1u>, boost::numeric::odeint::default_rosenbrock_coefficients<boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<50u, int, void>, (boost::multiprecision::expression_template_option)1u> >, boost::numeric::odeint::initially_resizer> > >, System = std::pair<stiff_system, stiff_system_jacobi>, State = vector_type, Time = double, Observer = boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_left, boost::proto::argsns_::list2<boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_left, boost::proto::argsns_::list2<boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_left, boost::proto::argsns_::list2<boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_left, boost::proto::argsns_::list2<boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<std::basic_ostream<char, std::char_traits<char> >&>, 0l> >, boost::phoenix::actor<boost::proto::exprns_::basic_expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<boost::phoenix::argument<2> >, 0l> > >, 2l> >, boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<char [2]>, 0l> > >, 2l> >, boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::subscript, boost::proto::argsns_::list2<boost::proto::exprns_::basic_expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<boost::phoenix::argument<1> >, 0l>, boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<int>, 0l> > >, 2l> > >, 2l> >, boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<char [2]>, 0l> > >, 2l> >]’
stiff_system.cpp:72:   instantiated from here
../odeint-v2/boost/numeric/odeint/integrate/detail/integrate_adaptive.hpp:142: error: invalid static_cast from type ‘boost::multiprecision::detail::expression<boost::multiprecision::detail::subtract_immediates, double, boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<50u, int, void>, (boost::multiprecision::expression_template_option)1u>, void, void>’ to type ‘double’
In file included from ../odeint-v2/boost/numeric/odeint/integrate/detail/integrate_adaptive.hpp:25,
                 from ../odeint-v2/boost/numeric/odeint/integrate/integrate_adaptive.hpp:25,
                 from ../odeint-v2/boost/numeric/odeint/integrate/integrate.hpp:26,
                 from ../odeint-v2/boost/numeric/odeint.hpp:64,
                 from stiff_system.cpp:16:
../odeint-v2/boost/numeric/odeint/integrate/detail/integrate_const.hpp: In function ‘size_t boost::numeric::odeint::detail::integrate_const(Stepper, System, State&, Time, Time, Time, Observer, boost::numeric::odeint::dense_output_stepper_tag) [with Stepper = boost::numeric::odeint::rosenbrock4_dense_output<boost::numeric::odeint::rosenbrock4_controller<boost::numeric::odeint::rosenbrock4<boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<50u, int, void>, (boost::multiprecision::expression_template_option)1u>, boost::numeric::odeint::default_rosenbrock_coefficients<boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<50u, int, void>, (boost::multiprecision::expression_template_option)1u> >, boost::numeric::odeint::initially_resizer> > >, System = std::pair<stiff_system, stiff_system_jacobi>, State = boost::numeric::ublas::vector<boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<50u, int, void>, (boost::multiprecision::expression_template_option)1u>, boost::numeric::ublas::unbounded_array<boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<50u, int, void>, (boost::multiprecision::expression_template_option)1u>, std::allocator<boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<50u, int, void>, (boost::multiprecision::expression_template_option)1u> > > >, Time = double, Observer = boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_left, boost::proto::argsns_::list2<boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_left, boost::proto::argsns_::list2<boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_left, boost::proto::argsns_::list2<boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_left, boost::proto::argsns_::list2<boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<std::basic_ostream<char, std::char_traits<char> >&>, 0l> >, boost::phoenix::actor<boost::proto::exprns_::basic_expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<boost::phoenix::argument<2> >, 0l> > >, 2l> >, boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<char [2]>, 0l> > >, 2l> >, boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::subscript, boost::proto::argsns_::list2<boost::proto::exprns_::basic_expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<boost::phoenix::argument<1> >, 0l>, boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<int>, 0l> > >, 2l> > >, 2l> >, boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<char [2]>, 0l> > >, 2l> >]’:
../odeint-v2/boost/numeric/odeint/integrate/integrate_const.hpp:60:   instantiated from ‘size_t boost::numeric::odeint::integrate_const(Stepper, System, State&, Time, Time, Time, Observer) [with Stepper = boost::numeric::odeint::rosenbrock4_dense_output<boost::numeric::odeint::rosenbrock4_controller<boost::numeric::odeint::rosenbrock4<boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<50u, int, void>, (boost::multiprecision::expression_template_option)1u>, boost::numeric::odeint::default_rosenbrock_coefficients<boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<50u, int, void>, (boost::multiprecision::expression_template_option)1u> >, boost::numeric::odeint::initially_resizer> > >, System = std::pair<stiff_system, stiff_system_jacobi>, State = vector_type, Time = double, Observer = boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_left, boost::proto::argsns_::list2<boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_left, boost::proto::argsns_::list2<boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_left, boost::proto::argsns_::list2<boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_left, boost::proto::argsns_::list2<boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<std::basic_ostream<char, std::char_traits<char> >&>, 0l> >, boost::phoenix::actor<boost::proto::exprns_::basic_expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<boost::phoenix::argument<2> >, 0l> > >, 2l> >, boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<char [2]>, 0l> > >, 2l> >, boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::subscript, boost::proto::argsns_::list2<boost::proto::exprns_::basic_expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<boost::phoenix::argument<1> >, 0l>, boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<int>, 0l> > >, 2l> > >, 2l> >, boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<char [2]>, 0l> > >, 2l> >]’
stiff_system.cpp:72:   instantiated from here
../odeint-v2/boost/numeric/odeint/integrate/detail/integrate_const.hpp:120: error: no matching function for call to ‘less_eq_with_sign(double&, boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<50u, int, void>, (boost::multiprecision::expression_template_option)1u>, double&)’
../odeint-v2/boost/numeric/odeint/integrate/integrate_const.hpp:60:   instantiated from ‘size_t boost::numeric::odeint::integrate_const(Stepper, System, State&, Time, Time, Time, Observer) [with Stepper = boost::numeric::odeint::rosenbrock4_dense_output<boost::numeric::odeint::rosenbrock4_controller<boost::numeric::odeint::rosenbrock4<boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<50u, int, void>, (boost::multiprecision::expression_template_option)1u>, boost::numeric::odeint::default_rosenbrock_coefficients<boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<50u, int, void>, (boost::multiprecision::expression_template_option)1u> >, boost::numeric::odeint::initially_resizer> > >, System = std::pair<stiff_system, stiff_system_jacobi>, State = vector_type, Time = double, Observer = boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_left, boost::proto::argsns_::list2<boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_left, boost::proto::argsns_::list2<boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_left, boost::proto::argsns_::list2<boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_left, boost::proto::argsns_::list2<boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<std::basic_ostream<char, std::char_traits<char> >&>, 0l> >, boost::phoenix::actor<boost::proto::exprns_::basic_expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<boost::phoenix::argument<2> >, 0l> > >, 2l> >, boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<char [2]>, 0l> > >, 2l> >, boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::subscript, boost::proto::argsns_::list2<boost::proto::exprns_::basic_expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<boost::phoenix::argument<1> >, 0l>, boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<int>, 0l> > >, 2l> > >, 2l> >, boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<char [2]>, 0l> > >, 2l> >]’
stiff_system.cpp:72:   instantiated from here
../odeint-v2/boost/numeric/odeint/integrate/detail/integrate_const.hpp:130: error: invalid static_cast from type ‘boost::multiprecision::detail::expression<boost::multiprecision::detail::add_immediates, boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<50u, int, void>, (boost::multiprecision::expression_template_option)1u>, boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<50u, int, void>, (boost::multiprecision::expression_template_option)1u>, void, void>’ to type ‘double’
../odeint-v2/boost/numeric/odeint/integrate/detail/integrate_const.hpp:134: error: no matching function for call to ‘less_eq_with_sign(boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<50u, int, void>, (boost::multiprecision::expression_template_option)1u>, double&, double&)’
../odeint-v2/boost/numeric/odeint/integrate/detail/integrate_const.hpp:140: error: no matching function for call to ‘less_with_sign(boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<50u, int, void>, (boost::multiprecision::expression_template_option)1u>, double&, boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<50u, int, void>, (boost::multiprecision::expression_template_option)1u>)’
In file included from ../odeint-v2/boost/numeric/odeint.hpp:55,
                 from stiff_system.cpp:16:
../odeint-v2/boost/numeric/odeint/stepper/rosenbrock4_controller.hpp: In member function ‘boost::numeric::odeint::controlled_step_result boost::numeric::odeint::rosenbrock4_controller<Stepper>::try_step(System, const typename Stepper::state_type&, typename Stepper::time_type&, typename Stepper::state_type&, typename Stepper::time_type&) [with System = std::pair<stiff_system, stiff_system_jacobi>, Stepper = boost::numeric::odeint::rosenbrock4<boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<50u, int, void>, (boost::multiprecision::expression_template_option)1u>, boost::numeric::odeint::default_rosenbrock_coefficients<boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<50u, int, void>, (boost::multiprecision::expression_template_option)1u> >, boost::numeric::odeint::initially_resizer>]’:
../odeint-v2/boost/numeric/odeint/stepper/rosenbrock4_dense_output.hpp:82:   instantiated from ‘std::pair<typename Stepper::stepper_type::time_type, typename Stepper::stepper_type::time_type> boost::numeric::odeint::rosenbrock4_dense_output<ControlledStepper>::do_step(System) [with System = std::pair<stiff_system, stiff_system_jacobi>, ControlledStepper = boost::numeric::odeint::rosenbrock4_controller<boost::numeric::odeint::rosenbrock4<boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<50u, int, void>, (boost::multiprecision::expression_template_option)1u>, boost::numeric::odeint::default_rosenbrock_coefficients<boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<50u, int, void>, (boost::multiprecision::expression_template_option)1u> >, boost::numeric::odeint::initially_resizer> >]’
../odeint-v2/boost/numeric/odeint/integrate/detail/integrate_adaptive.hpp:138:   instantiated from ‘size_t boost::numeric::odeint::detail::integrate_adaptive(Stepper, System, State&, Time, Time, Time, Observer, boost::numeric::odeint::dense_output_stepper_tag) [with Stepper = boost::numeric::odeint::rosenbrock4_dense_output<boost::numeric::odeint::rosenbrock4_controller<boost::numeric::odeint::rosenbrock4<boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<50u, int, void>, (boost::multiprecision::expression_template_option)1u>, boost::numeric::odeint::default_rosenbrock_coefficients<boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<50u, int, void>, (boost::multiprecision::expression_template_option)1u> >, boost::numeric::odeint::initially_resizer> > >, System = std::pair<stiff_system, stiff_system_jacobi>, State = boost::numeric::ublas::vector<boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<50u, int, void>, (boost::multiprecision::expression_template_option)1u>, boost::numeric::ublas::unbounded_array<boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<50u, int, void>, (boost::multiprecision::expression_template_option)1u>, std::allocator<boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<50u, int, void>, (boost::multiprecision::expression_template_option)1u> > > >, Time = double, Observer = boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_left, boost::proto::argsns_::list2<boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_left, boost::proto::argsns_::list2<boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_left, boost::proto::argsns_::list2<boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_left, boost::proto::argsns_::list2<boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<std::basic_ostream<char, std::char_traits<char> >&>, 0l> >, boost::phoenix::actor<boost::proto::exprns_::basic_expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<boost::phoenix::argument<2> >, 0l> > >, 2l> >, boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<char [2]>, 0l> > >, 2l> >, boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::subscript, boost::proto::argsns_::list2<boost::proto::exprns_::basic_expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<boost::phoenix::argument<1> >, 0l>, boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<int>, 0l> > >, 2l> > >, 2l> >, boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<char [2]>, 0l> > >, 2l> >]’
../odeint-v2/boost/numeric/odeint/integrate/integrate_const.hpp:54:   instantiated from ‘size_t boost::numeric::odeint::integrate_const(Stepper, System, State&, Time, Time, Time, Observer) [with Stepper = boost::numeric::odeint::rosenbrock4_dense_output<boost::numeric::odeint::rosenbrock4_controller<boost::numeric::odeint::rosenbrock4<boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<50u, int, void>, (boost::multiprecision::expression_template_option)1u>, boost::numeric::odeint::default_rosenbrock_coefficients<boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<50u, int, void>, (boost::multiprecision::expression_template_option)1u> >, boost::numeric::odeint::initially_resizer> > >, System = std::pair<stiff_system, stiff_system_jacobi>, State = vector_type, Time = double, Observer = boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_left, boost::proto::argsns_::list2<boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_left, boost::proto::argsns_::list2<boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_left, boost::proto::argsns_::list2<boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_left, boost::proto::argsns_::list2<boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<std::basic_ostream<char, std::char_traits<char> >&>, 0l> >, boost::phoenix::actor<boost::proto::exprns_::basic_expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<boost::phoenix::argument<2> >, 0l> > >, 2l> >, boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<char [2]>, 0l> > >, 2l> >, boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::subscript, boost::proto::argsns_::list2<boost::proto::exprns_::basic_expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<boost::phoenix::argument<1> >, 0l>, boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<int>, 0l> > >, 2l> > >, 2l> >, boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<char [2]>, 0l> > >, 2l> >]’
stiff_system.cpp:72:   instantiated from here
../odeint-v2/boost/numeric/odeint/stepper/rosenbrock4_controller.hpp:116: error: no matching function for call to ‘min(const boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<50u, int, void>, (boost::multiprecision::expression_template_option)1u>&, boost::multiprecision::detail::expression<boost::multiprecision::detail::divides, boost::multiprecision::detail::expression<boost::multiprecision::detail::function, boost::multiprecision::detail::pow_funct<boost::multiprecision::backends::cpp_dec_float<50u, int, void> >, boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<50u, int, void>, (boost::multiprecision::expression_template_option)1u>, double, void>, boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<50u, int, void>, (boost::multiprecision::expression_template_option)1u>, void, void>)’
../odeint-v2/boost/numeric/odeint/stepper/rosenbrock4_dense_output.hpp:82:   instantiated from ‘std::pair<typename Stepper::stepper_type::time_type, typename Stepper::stepper_type::time_type> boost::numeric::odeint::rosenbrock4_dense_output<ControlledStepper>::do_step(System) [with System = std::pair<stiff_system, stiff_system_jacobi>, ControlledStepper = boost::numeric::odeint::rosenbrock4_controller<boost::numeric::odeint::rosenbrock4<boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<50u, int, void>, (boost::multiprecision::expression_template_option)1u>, boost::numeric::odeint::default_rosenbrock_coefficients<boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<50u, int, void>, (boost::multiprecision::expression_template_option)1u> >, boost::numeric::odeint::initially_resizer> >]’
../odeint-v2/boost/numeric/odeint/integrate/detail/integrate_adaptive.hpp:138:   instantiated from ‘size_t boost::numeric::odeint::detail::integrate_adaptive(Stepper, System, State&, Time, Time, Time, Observer, boost::numeric::odeint::dense_output_stepper_tag) [with Stepper = boost::numeric::odeint::rosenbrock4_dense_output<boost::numeric::odeint::rosenbrock4_controller<boost::numeric::odeint::rosenbrock4<boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<50u, int, void>, (boost::multiprecision::expression_template_option)1u>, boost::numeric::odeint::default_rosenbrock_coefficients<boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<50u, int, void>, (boost::multiprecision::expression_template_option)1u> >, boost::numeric::odeint::initially_resizer> > >, System = std::pair<stiff_system, stiff_system_jacobi>, State = boost::numeric::ublas::vector<boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<50u, int, void>, (boost::multiprecision::expression_template_option)1u>, boost::numeric::ublas::unbounded_array<boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<50u, int, void>, (boost::multiprecision::expression_template_option)1u>, std::allocator<boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<50u, int, void>, (boost::multiprecision::expression_template_option)1u> > > >, Time = double, Observer = boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_left, boost::proto::argsns_::list2<boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_left, boost::proto::argsns_::list2<boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_left, boost::proto::argsns_::list2<boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_left, boost::proto::argsns_::list2<boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<std::basic_ostream<char, std::char_traits<char> >&>, 0l> >, boost::phoenix::actor<boost::proto::exprns_::basic_expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<boost::phoenix::argument<2> >, 0l> > >, 2l> >, boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<char [2]>, 0l> > >, 2l> >, boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::subscript, boost::proto::argsns_::list2<boost::proto::exprns_::basic_expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<boost::phoenix::argument<1> >, 0l>, boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<int>, 0l> > >, 2l> > >, 2l> >, boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<char [2]>, 0l> > >, 2l> >]’
../odeint-v2/boost/numeric/odeint/integrate/integrate_const.hpp:54:   instantiated from ‘size_t boost::numeric::odeint::integrate_const(Stepper, System, State&, Time, Time, Time, Observer) [with Stepper = boost::numeric::odeint::rosenbrock4_dense_output<boost::numeric::odeint::rosenbrock4_controller<boost::numeric::odeint::rosenbrock4<boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<50u, int, void>, (boost::multiprecision::expression_template_option)1u>, boost::numeric::odeint::default_rosenbrock_coefficients<boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<50u, int, void>, (boost::multiprecision::expression_template_option)1u> >, boost::numeric::odeint::initially_resizer> > >, System = std::pair<stiff_system, stiff_system_jacobi>, State = vector_type, Time = double, Observer = boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_left, boost::proto::argsns_::list2<boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_left, boost::proto::argsns_::list2<boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_left, boost::proto::argsns_::list2<boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::shift_left, boost::proto::argsns_::list2<boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<std::basic_ostream<char, std::char_traits<char> >&>, 0l> >, boost::phoenix::actor<boost::proto::exprns_::basic_expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<boost::phoenix::argument<2> >, 0l> > >, 2l> >, boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<char [2]>, 0l> > >, 2l> >, boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::subscript, boost::proto::argsns_::list2<boost::proto::exprns_::basic_expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<boost::phoenix::argument<1> >, 0l>, boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<int>, 0l> > >, 2l> > >, 2l> >, boost::phoenix::actor<boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<char [2]>, 0l> > >, 2l> >]’
stiff_system.cpp:72:   instantiated from here
../odeint-v2/boost/numeric/odeint/stepper/rosenbrock4_controller.hpp:133: error: no matching function for call to ‘max(double, boost::multiprecision::number<boost::multiprecision::backends::cpp_dec_float<50u, int, void>, (boost::multiprecision::expression_template_option)1u>&)’

Any idea as to what's going on? Thanks for your help.

headmyshoulder commented 10 years ago

Hi, I fixed some small bugs in rosenbrock4_controller.hpp and commited it into the master branch.

Furhtermore you need to change the line with integrate_const to

size_t num_of_steps = integrate_const( make_dense_output< rosenbrock4< value_type > >( 1.0e-6 , 1.0e-6 ) , make_pair( stiff_system() , stiff_system_jacobi() ) , x , static_cast< value_type >( 0.0 ) , static_cast< value_type

( 50.0 ) , static_cast< value_type >( 0.01 ) , cout << phoenix::arg_names::arg2 << " " << phoenix::arg_names::arg1[0] << "\n" );

Can you check if it is working for you?

On 09.11.2013 04:51, nblinov wrote:

|#include

include

include

include "../odeint-v2/boost/numeric/odeint.hpp"

include <boost/multiprecision/cpp_dec_float.hpp>

include <boost/phoenix/core.hpp>

include <boost/phoenix/core.hpp>

include <boost/phoenix/operator.hpp>

using namespace std; using namespace boost::numeric::odeint; namespace phoenix = boost::phoenix;

typedef boost::multiprecision::cpp_dec_float_50 value_type; typedef boost::array< value_type , 3 > state_type; //typedef double value_type;

//[ stiff_system_definition

typedef boost::numeric::ublas::vector< value_type > vector_type; typedef boost::numeric::ublas::matrix< value_type > matrix_type;

struct stiff_system { void operator()( const vector_type &x , vector_type &dxdt , value_type /* t / ) { dxdt[ 0 ] = -101.0 * x[ 0 ] - 100.0 \ x[ 1 ]; dxdt[ 1 ] = x[ 0 ]; } };

struct stiff_system_jacobi { void operator()( const vectortype & /* x / , matrix_type &J , const valuetype & / t */ , vector_type &dfdt ) { J( 0 , 0 ) = -101.0; J( 0 , 1 ) = -100.0; J( 1 , 0 ) = 1.0; J( 1 , 1 ) = 0.0; dfdt[0] = 0.0; dfdt[1] = 0.0; } }; //]

int main( int argc , char **argv ) { //[ integrate_stiff_system vector_type x( 2 , 1.0 );

size_t num_of_steps = integrate_const( make_dense_output< rosenbrock4< value_type > >( 1.0e-6 , 1.0e-6 ) ,
        make_pair( stiff_system() , stiff_system_jacobi() ) ,
        x , 0.0 , 50.0 , 0.01 ,
        cout << phoenix::arg_names::arg2 << " " << phoenix::arg_names::arg1[0] << "\n" );
//]
clog << num_of_steps << endl;

return 0;

}|

mariomulansky commented 10 years ago

I've added a test case for rosenbrock4+multiprecision and it runs fine with 56b4613. However, with the Rosenbrock stepper itself it is not possible to gain further accuracy by using multiprecision types because the internal constants of the stepper are only given with double precision. So you will not get a solution better than double precision with this stepper! This can only be overcome if you change the stepper to use constants defined with higher precision, but it might be even hard to find the constants with that accuracy in the literature. For the dopri5 stepper, for example, this is different as the internal constants there are given as rationals and thus in principle exactly and one benefits from using higher precision types!

nblinov commented 10 years ago

Karsten, thanks, the example now runs fine. I wonder why you need to explicitly type cast though, can't boost::multiprecision do this implicitly?

Mario, yeah thanks for pointing that out. I also noticed that the constants were just written down as floats. I only need the extra precision for stability of the solution - increasing the working precision seemed to help out the mathematica stiff solver a bit for a similar system, so this is why i'm trying to get this working. I guess I'll have to dig around for more precise coefficients...

Thanks again!