diff --git a/interfaces/cython/cantera/onedim.pyx b/interfaces/cython/cantera/onedim.pyx index 87964b2888..0394a5c75c 100644 --- a/interfaces/cython/cantera/onedim.pyx +++ b/interfaces/cython/cantera/onedim.pyx @@ -1137,6 +1137,7 @@ cdef class Sim1D: if isinstance(dom, _FlowBase): dom.set_transport(self.gas) + # Do initial solution steps with default tolerances have_user_tolerances = any(dom.have_user_tolerances for dom in self.domains) if have_user_tolerances: # Save the user-specified tolerances @@ -1145,6 +1146,14 @@ cdef class Sim1D: atol_ts_final = [dom.transient_abstol() for dom in self.domains] rtol_ts_final = [dom.transient_reltol() for dom in self.domains] + def restore_tolerances(): + if have_user_tolerances: + for i in range(len(self.domains)): + self.domains[i].set_steady_tolerances(abs=atol_ss_final[i], + rel=rtol_ss_final[i]) + self.domains[i].set_transient_tolerances(abs=atol_ts_final[i], + rel=rtol_ts_final[i]) + for dom in self.domains: dom.set_default_tolerances() @@ -1203,6 +1212,7 @@ cdef class Sim1D: # restore settings before re-raising exception set_transport(transport) set_soret(True) + restore_tolerances() raise e # If initial solve using energy equation fails, fall back on the @@ -1221,6 +1231,7 @@ cdef class Sim1D: # restore settings before re-raising exception set_transport(transport) set_soret(True) + restore_tolerances() raise e if solved: @@ -1236,6 +1247,7 @@ cdef class Sim1D: # restore settings before re-raising exception set_transport(transport) set_soret(True) + restore_tolerances() raise e if solved and not self.extinct() and refine_grid: @@ -1251,6 +1263,7 @@ cdef class Sim1D: # restore settings before re-raising exception set_transport(transport) set_soret(True) + restore_tolerances() raise e if solved and not self.extinct(): @@ -1276,11 +1289,7 @@ cdef class Sim1D: if have_user_tolerances: log('Solving with user-specified tolerances') - for i in range(len(self.domains)): - self.domains[i].set_steady_tolerances(abs=atol_ss_final[i], - rel=rtol_ss_final[i]) - self.domains[i].set_transient_tolerances(abs=atol_ts_final[i], - rel=rtol_ts_final[i]) + restore_tolerances() # Final call with expensive options enabled if have_user_tolerances or solve_multi or soret_doms: diff --git a/interfaces/cython/cantera/test/test_onedim.py b/interfaces/cython/cantera/test/test_onedim.py index dd6bd0f181..e0c8f889fe 100644 --- a/interfaces/cython/cantera/test/test_onedim.py +++ b/interfaces/cython/cantera/test/test_onedim.py @@ -205,10 +205,12 @@ def test_auto_width2(self): width=0.1) self.sim.set_refine_criteria(ratio=4, slope=0.8, curve=0.8) + self.sim.flame.set_steady_tolerances(T=(2e-4, 1e-8)) self.sim.solve(refine_grid=True, auto=True, loglevel=0) + self.assertNear(self.sim.velocity[0], 17.02, 1e-1) self.assertLess(self.sim.grid[-1], 2.0) # grid should not be too wide - + self.assertEqual(self.sim.flame.tolerances("T"), (2e-4, 1e-8)) @utilities.slow_test def test_converge_adiabatic(self):