—
Steady LTE arc column: Cantera 1D solver vs analytical Elenbaas-Heller#
ThermalPlasmaColumn solves the
steady radial Elenbaas-Heller equation
\[\frac{1}{r}\frac{d}{dr}\!\left(r\,\kappa(T)\frac{dT}{dr}\right)
+ \sigma(T) E^2 = 0\]
numerically with a custom Cantera Domain1D (Newton + adaptive grid), and is
validated against the analytical
ElenbaasHeller solution. Fed the
same tabulated LTE properties, the two agree to within the analytical model’s
piecewise-linear linearization error.
Import the required libraries.#
import matplotlib.pyplot as plt
import numpy as np
from rizer.cantera_ext import ThermalPlasmaColumn
from rizer.misc.plt_utils import set_mpl_style
from rizer.thermal_plasma.elenbaas_heller import ElenbaasHeller
from rizer.thermal_plasma.fit_LTE_data import FitLTEData
set_mpl_style()
Load H2 LTE data and build both models for the same field.#
column_radius = 10e-3 # Column radius [m]
electric_field = 5000.0 # Electric field [V/m]
lte_data = FitLTEData(
gas_name_transport="H2",
gas_name_radiation="H2",
pressure_atm=1,
source_transport="Boulos2023",
source_radiation="Gueye2017",
emission_radius_mm=0,
max_temperature_fit=12000.0,
)
column = ThermalPlasmaColumn(
R=column_radius, electric_field=electric_field, gas_data=lte_data, n_points=61
)
elenbaas_heller = ElenbaasHeller(
R=column_radius, electric_field=electric_field, current=None, gas_data=lte_data
)
Compare the radial temperature profiles, then plot the results.#
radius, temperature_numerical = column.temperature_profile()
temperature_analytical = np.array(
[elenbaas_heller.get_temperature_vs_radius(ri) for ri in radius]
)
print(
f"T_center: numerical {temperature_numerical[0]:.0f} K vs analytical "
f"{elenbaas_heller.get_temperature_vs_radius(0.0):.0f} K"
)
print(
f"current : numerical {column.current():.1f} A vs analytical "
f"{elenbaas_heller.analytical_current():.1f} A"
)
fig, ax = plt.subplots()
ax.set_title(
f"H2 arc column, E = {electric_field:.0f} V/m, R = {column_radius * 1e3:.0f} mm"
)
ax.set_xlabel("Radius [mm]")
ax.set_ylabel("Temperature [K]")
ax.plot(radius * 1e3, temperature_numerical, label="Numerical (Cantera Domain1D)")
ax.plot(radius * 1e3, temperature_analytical, "--", label="Analytical Elenbaas-Heller")
ax.legend()
fig.tight_layout()
plt.show()