def test_tolerances(self): gas = ct.Solution('h2o2.xml') left = ct.Inlet1D(gas) flame = ct.IdealGasFlow(gas) right = ct.Inlet1D(gas) # Some things don't work until the domains have been added to a Sim1D sim = ct.Sim1D((left, flame, right)) with self.assertRaisesRegex(ct.CanteraError, 'no component'): flame.set_steady_tolerances(foobar=(3e-4, 3e-6)) flame.set_steady_tolerances(default=(5e-3, 5e-5), T=(3e-4, 3e-6), Y=(7e-7, 7e-9)) flame.set_transient_tolerances(default=(6e-3, 6e-5), T=(4e-4, 4e-6), Y=(2e-7, 2e-9)) # Flow domain atol_ss = set(flame.steady_abstol()) atol_ts = set(flame.transient_abstol()) rtol_ss = set(flame.steady_reltol()) rtol_ts = set(flame.transient_reltol()) self.assertEqual(atol_ss, set((5e-5, 3e-6, 7e-9))) self.assertEqual(atol_ts, set((6e-5, 4e-6, 2e-9))) self.assertEqual(rtol_ss, set((5e-3, 3e-4, 7e-7))) self.assertEqual(rtol_ts, set((6e-3, 4e-4, 2e-7)))
def test_tolerances(self): gas = ct.Solution('h2o2.xml') left = ct.Inlet1D(gas) flame = ct.FreeFlow(gas) right = ct.Inlet1D(gas) # Some things don't work until the domains have been added to a Sim1D sim = ct.Sim1D((left, flame, right)) with self.assertRaises(Exception): flame.set_steady_tolerances(foobar=(3e-4, 3e-6)) flame.set_steady_tolerances(default=(5e-3, 5e-5), T=(3e-4, 3e-6), Y=(7e-7, 7e-9)) flame.set_transient_tolerances(default=(6e-3, 6e-5), T=(4e-4, 4e-6), Y=(2e-7, 2e-9)) # Flow domain atol_ss = set(flame.steady_abstol()) atol_ts = set(flame.transient_abstol()) rtol_ss = set(flame.steady_reltol()) rtol_ts = set(flame.transient_reltol()) self.assertEqual(atol_ss, set((5e-5, 3e-6, 7e-9))) self.assertEqual(atol_ts, set((6e-5, 4e-6, 2e-9))) self.assertEqual(rtol_ss, set((5e-3, 3e-4, 7e-7))) self.assertEqual(rtol_ts, set((6e-3, 4e-4, 2e-7))) with self.assertRaises(Exception): left.set_steady_tolerances(default=(5e-3, 5e-5), Y=(7e-7, 7e-9)) # Boundary domain left.set_steady_tolerances(default=(5e-3, 5e-5), temperature=(7e-7, 7e-9)) left.set_transient_tolerances(default=(6e-3, 6e-5), temperature=(2e-7, 2e-9)) atol_ss = set(left.steady_abstol()) atol_ts = set(left.transient_abstol()) rtol_ss = set(left.steady_reltol()) rtol_ts = set(left.transient_reltol()) self.assertEqual(atol_ss, set((5e-5, 7e-9))) self.assertEqual(atol_ts, set((6e-5, 2e-9))) self.assertEqual(rtol_ss, set((5e-3, 7e-7))) self.assertEqual(rtol_ts, set((6e-3, 2e-7)))
def test_boundaryProperties(self): gas1 = ct.Solution('h2o2.xml') gas2 = ct.Solution('h2o2.xml') inlet = ct.Inlet1D(name='something', phase=gas1) flame = ct.FreeFlow(gas1) sim = ct.Sim1D((inlet, flame)) self.assertEqual(inlet.name, 'something') gas2.TPX = 400, 101325, 'H2:0.3, O2:0.5, AR:0.2' Xref = gas2.X Yref = gas2.Y inlet.Y = Yref self.assertArrayNear(inlet.Y, Yref) self.assertArrayNear(inlet.X, Xref) gas2.TPX = 400, 101325, 'H2:0.5, O2:0.2, AR:0.3' Xref = gas2.X Yref = gas2.Y inlet.X = Xref self.assertArrayNear(inlet.X, Xref) self.assertArrayNear(inlet.Y, Yref) inlet.X = {'H2': 0.3, 'O2': 0.5, 'AR': 0.2} self.assertNear(inlet.X[gas2.species_index('H2')], 0.3)
def __init__(self, gas, profile=None): """ A domain of type IdealGasFlow named 'flame' will be created to represent the flame and set to free flow. The three domains comprising the stack are stored as ``self.inlet``, ``self.flame``, and ``self.outlet``. :param grid: A list of points to be used as the initial grid. Not recommended unless solving only on a fixed grid; Use the `width` parameter instead. :param width: Defines a grid on the interval [0, width] with internal points determined automatically by the solver. """ assert isinstance(profile, ProfileBase), 'invalid profile' self.inlet = ct.Inlet1D(name='inlet', phase=gas) self.outlet = ct.Outlet1D(name='outlet', phase=gas) if not hasattr(self, 'flame'): # Create flame domain if not already instantiated by a child class self.flame = ChannelFlow(gas, name='channel') # self.flame.set_free_flow() self.flame.set_wall_profile(profile) z_up, z_dn = profile.z_range grid = np.linspace(z_up, z_dn, 10) super(ChannelFlame, self).__init__( (self.inlet, self.flame, self.outlet), gas, grid) # Setting X needs to be deferred until linked to the flow domain self.inlet.T = gas.T self.inlet.X = gas.X
def test_invalid_property(self): gas1 = ct.Solution('h2o2.xml') inlet = ct.Inlet1D(name='something', phase=gas1) flame = ct.FreeFlow(gas1) sim = ct.Sim1D((inlet, flame)) for x in (inlet, flame, sim): with self.assertRaises(AttributeError): x.foobar = 300 with self.assertRaises(AttributeError): x.foobar
def __init__(self, gas, nextra=10, grid=None, width=None): """ see BurnerFlame """ self.burner = ct.Inlet1D(name='burner', phase=gas) self.outlet = ct.Outlet1D(name='outlet', phase=gas) if not hasattr(self, 'flame'): self.flame = NewFlow(gas, name='flame', nextra=nextra) self.flame.set_axisymmetric_flow() if width is not None: grid = np.array([0.0, 0.1, 0.2, 0.3, 0.5, 0.7, 1.0]) * width super(ct.BurnerFlame, self).__init__( (self.burner, self.flame, self.outlet), gas, grid) self.burner.T = gas.T self.burner.X = gas.X