diff --git a/interfaces/cython/cantera/examples/onedim/adiabatic_flame.py b/interfaces/cython/cantera/examples/onedim/adiabatic_flame.py index f0625a7a6b..75890d8135 100644 --- a/interfaces/cython/cantera/examples/onedim/adiabatic_flame.py +++ b/interfaces/cython/cantera/examples/onedim/adiabatic_flame.py @@ -8,6 +8,7 @@ import cantera as ct try: import pandas as pd + import tables except: pd = None diff --git a/interfaces/cython/cantera/onedim.py b/interfaces/cython/cantera/onedim.py index 61b4123005..d9bfd3fce3 100644 --- a/interfaces/cython/cantera/onedim.py +++ b/interfaces/cython/cantera/onedim.py @@ -4,7 +4,6 @@ import numpy as np from ._cantera import * from .composite import Solution, SolutionArray -import csv as _csv from math import erf from os import path from email.utils import formatdate @@ -363,19 +362,9 @@ def write_csv(self, filename, species='X', quiet=True): mole fractions or ``Y`` for mass fractions. """ - z = self.grid - T = self.T - u = self.velocity - V = self.spread_rate - - with open(filename, 'w', newline='') as csvfile: - writer = _csv.writer(csvfile) - writer.writerow(['z (m)', 'u (m/s)', 'V (1/s)', - 'T (K)', 'rho (kg/m3)'] + self.gas.species_names) - for n in range(self.flame.n_points): - self.set_gas_state(n) - writer.writerow([z[n], u[n], V[n], T[n], self.gas.density] + - list(getattr(self.gas, species))) + # save data + cols = ('extra', 'T', 'D', species) + self.to_solution_array().write_csv(filename, cols=cols) if not quiet: print("Solution saved to '{0}'.".format(filename)) @@ -542,7 +531,7 @@ def from_pandas(self, df, restore_boundaries=True, settings=None): settings=settings) def write_hdf(self, filename, key=None, species='X', - mode=None, complevel=None): + mode=None, complevel=None, quiet=True): """ Write the solution vector to a HDF container file. Note that it is possible to write multiple data entries to a single HDF container file. @@ -597,6 +586,9 @@ def write_hdf(self, filename, key=None, species='X', df.to_hdf(filename, key='settings', format='table', append=True) + if not quiet: + print("Solution saved to '{0}'.".format(filename)) + def read_hdf(self, filename, key=None, restore_boundaries=True, restore_settings=True): """ @@ -997,34 +989,6 @@ def perturb(sim, i, dp): class IonFlameBase(FlameBase): - def write_csv(self, filename, species='X', quiet=True): - """ - Write the velocity, temperature, density, electric potential, - electric field strength, and species profiles to a CSV file. - :param filename: - Output file name - :param species: - Attribute to use obtaining species profiles, e.g. ``X`` for - mole fractions or ``Y`` for mass fractions. - """ - z = self.grid - T = self.T - u = self.velocity - V = self.spread_rate - E = self.E - - with open(filename, 'w', newline='') as csvfile: - writer = _csv.writer(csvfile) - writer.writerow(['z (m)', 'velocity (m/s)', 'V (1/s)', 'T (K)', - 'E (V/m)', 'rho (kg/m3)'] + self.gas.species_names) - for n in range(self.flame.n_points): - self.set_gas_state(n) - writer.writerow([z[n], u[n], V[n], T[n], E[n], self.gas.density] + - list(getattr(self.gas, species))) - - if not quiet: - print("Solution saved to '{0}'.".format(filename)) - @property def electric_field_enabled(self): """ Get/Set whether or not to solve the Poisson's equation.""" diff --git a/interfaces/cython/cantera/test/test_onedim.py b/interfaces/cython/cantera/test/test_onedim.py index 5fc912538e..530af7e01f 100644 --- a/interfaces/cython/cantera/test/test_onedim.py +++ b/interfaces/cython/cantera/test/test_onedim.py @@ -603,11 +603,12 @@ def test_write_csv(self): self.create_sim(2e5, 350, 'H2:1.0, O2:2.0', mech='h2o2.xml') self.sim.write_csv(filename) - data = np.genfromtxt(filename, delimiter=',', skip_header=1) - self.assertArrayNear(data[:,0], self.sim.grid) - self.assertArrayNear(data[:,3], self.sim.T) + data = ct.SolutionArray(self.gas) + data.read_csv(filename) + self.assertArrayNear(data.grid[1:], self.sim.grid) + self.assertArrayNear(data.T[1:], self.sim.T) k = self.gas.species_index('H2') - self.assertArrayNear(data[:,5+k], self.sim.X[k,:]) + self.assertArrayNear(data.X[1:,k], self.sim.X[k,:]) def test_refine_criteria_boundscheck(self): self.create_sim(ct.one_atm, 300.0, 'H2:1.1, O2:1, AR:5')