114 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			114 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
/*
 | 
						|
 [auto_generated]
 | 
						|
 boost/numeric/odeint/integrate/max_step_checker.hpp
 | 
						|
 | 
						|
 [begin_description]
 | 
						|
 Throws exception if too many steps are performed.
 | 
						|
 [end_description]
 | 
						|
 | 
						|
 Copyright 2015 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)
 | 
						|
 */
 | 
						|
 | 
						|
 | 
						|
#ifndef BOOST_NUMERIC_ODEINT_INTEGRATE_MAX_STEP_CHECKER_HPP_INCLUDED
 | 
						|
#define BOOST_NUMERIC_ODEINT_INTEGRATE_MAX_STEP_CHECKER_HPP_INCLUDED
 | 
						|
 | 
						|
#include <stdexcept>
 | 
						|
#include <cstdio>
 | 
						|
 | 
						|
#include <boost/throw_exception.hpp>
 | 
						|
#include <boost/numeric/odeint/util/odeint_error.hpp>
 | 
						|
 | 
						|
 | 
						|
namespace boost {
 | 
						|
namespace numeric {
 | 
						|
namespace odeint {
 | 
						|
 | 
						|
/**
 | 
						|
 * \brief A class for performing overflow checks on the step count in integrate functions.
 | 
						|
 *
 | 
						|
 * Provide an instance of this class to integrate functions if you want to throw a runtime error if
 | 
						|
 * too many steps are performed without progress during the integrate routine.
 | 
						|
 */
 | 
						|
class max_step_checker
 | 
						|
{
 | 
						|
public:
 | 
						|
 | 
						|
protected:
 | 
						|
    const int m_max_steps;
 | 
						|
    int m_steps;
 | 
						|
 | 
						|
public:
 | 
						|
    /**
 | 
						|
     * \brief Construct the max_step_checker.
 | 
						|
     * max_steps is the maximal number of iterations allowed before runtime_error is thrown.
 | 
						|
     */
 | 
						|
    max_step_checker(const int max_steps = 500)
 | 
						|
        : m_max_steps(max_steps)
 | 
						|
    {
 | 
						|
        reset();
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * \brief Resets the max_step_checker by setting the internal counter to 0.
 | 
						|
     */
 | 
						|
    void reset()
 | 
						|
    {
 | 
						|
        m_steps = 0;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * \brief Increases the counter and performs the iteration check
 | 
						|
     */
 | 
						|
    void operator()(void)
 | 
						|
    {
 | 
						|
        if( m_steps++ >= m_max_steps )
 | 
						|
        {
 | 
						|
            char error_msg[200];
 | 
						|
            sprintf(error_msg, "Max number of iterations exceeded (%d).", m_max_steps);
 | 
						|
            BOOST_THROW_EXCEPTION( no_progress_error(error_msg) );
 | 
						|
        }
 | 
						|
    }
 | 
						|
};
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
 * \brief A class for performing overflow checks on the failed step count in step size adjustments.
 | 
						|
 *
 | 
						|
 * Used internally within the dense output stepper and integrate routines.
 | 
						|
 */
 | 
						|
class failed_step_checker : public max_step_checker
 | 
						|
{
 | 
						|
 | 
						|
public:
 | 
						|
    /**
 | 
						|
     * \brief Construct the failed_step_checker.
 | 
						|
     * max_steps is the maximal number of iterations allowed before runtime_error is thrown.
 | 
						|
     */
 | 
						|
    failed_step_checker(const int max_steps = 500)
 | 
						|
            : max_step_checker(max_steps)
 | 
						|
    {}
 | 
						|
 | 
						|
    /**
 | 
						|
     * \brief Increases the counter and performs the iteration check
 | 
						|
     */
 | 
						|
    void operator()(void)
 | 
						|
    {
 | 
						|
        if( m_steps++ >= m_max_steps )
 | 
						|
        {
 | 
						|
            char error_msg[200];
 | 
						|
            sprintf(error_msg, "Max number of iterations exceeded (%d). A new step size was not found.", m_max_steps);
 | 
						|
            BOOST_THROW_EXCEPTION( step_adjustment_error(error_msg) );
 | 
						|
        }
 | 
						|
    }
 | 
						|
};
 | 
						|
 | 
						|
} // namespace odeint
 | 
						|
} // namespace numeric
 | 
						|
} // namespace boost
 | 
						|
 | 
						|
#endif |