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 | 
