diff --git a/interfaces/cython/cantera/composite.py b/interfaces/cython/cantera/composite.py index 29ae219eca..0fed004f57 100644 --- a/interfaces/cython/cantera/composite.py +++ b/interfaces/cython/cantera/composite.py @@ -513,9 +513,15 @@ def __init__(self, phase, shape=(0,), states=None, extra=None): self._indices = list(np.ndindex(self._shape)) self._output_dummy = self._states[..., 0] + reserved = self.__dir__() + self._extra = {} if isinstance(extra, dict): for name, v in extra.items(): + if name in reserved: + raise ValueError( + "Unable to create extra column '{}': name is already " + "used by SolutionArray objects.".format(name)) if not np.shape(v): self._extra[name] = [v]*self._shape[0] elif len(v) == self._shape[0]: @@ -526,6 +532,10 @@ def __init__(self, phase, shape=(0,), states=None, extra=None): elif extra and self._shape == (0,): for name in extra: + if name in reserved: + raise ValueError( + "Unable to create extra column '{}': name is already " + "used by SolutionArray objects.".format(name)) self._extra[name] = [] elif extra: diff --git a/interfaces/cython/cantera/examples/reactors/ic_engine.py b/interfaces/cython/cantera/examples/reactors/ic_engine.py index 4dbf527be3..8da6a3c565 100644 --- a/interfaces/cython/cantera/examples/reactors/ic_engine.py +++ b/interfaces/cython/cantera/examples/reactors/ic_engine.py @@ -155,7 +155,7 @@ def piston_speed(t): # set up output data arrays states = ct.SolutionArray( cyl.thermo, - extra=('t', 'ca', 'V', 'm', 'mdot_in', 'mdot_out', 'dWv_dt', 'heat_release_rate'), + extra=('t', 'ca', 'V', 'm', 'mdot_in', 'mdot_out', 'dWv_dt'), ) # simulate with a maximum resolution of 1 deg crank angle @@ -169,8 +169,6 @@ def piston_speed(t): # calculate results to be stored dWv_dt = - (cyl.thermo.P - ambient_air.thermo.P) * A_piston * \ piston_speed(sim.time) - heat_release_rate = - cyl.volume * ct.gas_constant * cyl.T * \ - np.sum(gas.standard_enthalpies_RT * cyl.thermo.net_production_rates, 0) # append output data states.append(cyl.thermo.state, @@ -178,8 +176,7 @@ def piston_speed(t): V=cyl.volume, m=cyl.mass, mdot_in=inlet_valve.mdot(sim.time), mdot_out=outlet_valve.mdot(sim.time), - dWv_dt=dWv_dt, - heat_release_rate=heat_release_rate) + dWv_dt=dWv_dt) ####################################################################### @@ -221,7 +218,7 @@ def ca_ticks(t): # heat of reaction and expansion work fig, ax = plt.subplots() -ax.plot(t, 1.e-3 * states.heat_release_rate, label=r'$\dot{Q}$') +ax.plot(t, 1.e-3 * states.heat_release_rate * states.V, label=r'$\dot{Q}$') ax.plot(t, 1.e-3 * states.dWv_dt, label=r'$\dot{W}_v$') ax.set_ylim(-1e2, 1e3) ax.legend(loc=0) @@ -247,7 +244,7 @@ def ca_ticks(t): ###################################################################### # heat release -Q = trapz(states.heat_release_rate, t) +Q = trapz(states.heat_release_rate * states.V, t) print('{:45s}{:>4.1f} kW'.format('Heat release rate per cylinder (estimate):', Q / t[-1] / 1000.)) diff --git a/interfaces/cython/cantera/test/test_thermo.py b/interfaces/cython/cantera/test/test_thermo.py index b9b8bc7e52..e8bd85f1e8 100644 --- a/interfaces/cython/cantera/test/test_thermo.py +++ b/interfaces/cython/cantera/test/test_thermo.py @@ -1641,6 +1641,10 @@ def test_slicing_ndim(self): self.assertArrayNear(col3.T, 900*np.ones(2)) self.assertArrayNear(row2.T, 900*np.ones(5)) + def test_extra(self): + with self.assertRaises(ValueError): + states = ct.SolutionArray(self.gas, extra=['creation_rates']) + def test_append(self): states = ct.SolutionArray(self.gas, 5) states.TPX = np.linspace(500, 1000, 5), 2e5, 'H2:0.5, O2:0.4'