示例#1
0
    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)))
示例#2
0
    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)))
示例#3
0
    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)
示例#4
0
    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
示例#5
0
    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
示例#6
0
    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