diff --git a/pyradau13.c b/pyradau13.c index 2b0d2a03795bdd2af0f7282614d242827022554e..21405b0260eba910b4221eb71c429ec32d6976d6 100644 --- a/pyradau13.c +++ b/pyradau13.c @@ -423,7 +423,7 @@ static PyObject *radau13(PyObject *self, PyObject *args, PyObject *kwargs) { Py_DECREF(abstol_array); if(mass_matrix_array) Py_DECREF(mass_matrix_array); - if(idid != 1 || y_out == NULL) { + if((idid != 1 && (idid != 2 || PyErr_Occurred() != NULL)) || y_out == NULL) { if(PyErr_Occurred() == NULL) { int i; for(i=sizeof(errbuf)-1; i>0 && (errbuf[i] == ' ' || errbuf[i] == '\n' || errbuf[i] == 0 || errbuf[i] == '\t'); i--) { diff --git a/test.py b/test.py index 2c84165bfa0f31dcd57b1951c02c5637c279f168..388723ac3ff27aaf5021a1ff4ec82ead1451c2f4 100755 --- a/test.py +++ b/test.py @@ -21,6 +21,18 @@ class TestIntegration(unittest.TestCase): self.assertRaises(_TestException, lambda: radau13(lambda t, x: 1, 0, 1, dense_callback=_dense_cb)) + def test_intentional_abort(self): + """radau13 should not raise if dense callback returns True, but it should + if an exception occurs there.""" + def _rhs(t, x): + return 1 + def _dense_cb(told, t, x, cont): + return True + def _dense_cb_err(told, t, x, cont): + return 1/0 + self.assertEqual(radau13(_rhs, 0, 1, dense_callback=_dense_cb), 0) + self.assertRaises(ZeroDivisionError, lambda: radau13(_rhs, 0, 1, dense_callback=_dense_cb_err)) + def test_exp(self): self.assertAlmostEqual(float(radau13(lambda t, x: x, 1, 1)), np.exp(1))