From fa6621e43cd16b5762b4d6834c8d00aec055fab9 Mon Sep 17 00:00:00 2001 From: Valentin Hartmann Date: Thu, 6 Jul 2017 18:23:17 +0200 Subject: [PATCH] updated order selection --- .../controlled_adams_bashforth_moulton.hpp | 28 +++++++++++++++---- 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/include/boost/numeric/odeint/stepper/controlled_adams_bashforth_moulton.hpp b/include/boost/numeric/odeint/stepper/controlled_adams_bashforth_moulton.hpp index 9d0cf0c3..f01f7bfd 100644 --- a/include/boost/numeric/odeint/stepper/controlled_adams_bashforth_moulton.hpp +++ b/include/boost/numeric/odeint/stepper/controlled_adams_bashforth_moulton.hpp @@ -41,18 +41,33 @@ public: void adjust_order(size_t &order, const boost::array & xerr) { - if(order == 1 && m_algebra.norm_inf(xerr[2].m_v) < 0.5 * m_algebra.norm_inf(xerr[1].m_v)) + value_type errm = fabs(m_algebra.norm_inf(xerr[0].m_v)); + value_type errc = fabs(m_algebra.norm_inf(xerr[1].m_v)); + value_type errp = fabs(m_algebra.norm_inf(xerr[2].m_v)); + + if(order == 1) + { + if(errp < errc) + { + order ++; + } + } + else if(order == MaxOrder) { - order ++; + if(errm < errc) + { + order --; + } } else { - if(m_algebra.norm_inf(xerr[0].m_v) < m_algebra.norm_inf(xerr[1].m_v) && - m_algebra.norm_inf(xerr[0].m_v) < m_algebra.norm_inf(xerr[2].m_v)) + if(errm < errc && + errm < errp) { order--; } - else if(order < MaxOrder && m_algebra.norm_inf(xerr[2].m_v) < m_algebra.norm_inf(xerr[1].m_v)) + else if(errp < errm && + errp < errc) { order++; } @@ -69,7 +84,7 @@ class StepAdjuster = detail::pid_step_adjuster< typename ErrorStepper::state_typ typename ErrorStepper::value_type, typename ErrorStepper::time_type, typename ErrorStepper::algebra_type, - detail::H312PID + detail::BASIC >, class OrderAdjuster = default_order_adjuster< ErrorStepper::order_value, typename ErrorStepper::state_type, @@ -169,6 +184,7 @@ public: coeff.confirm(); t += dtPrev; + return success; } else