Computes Cp(T), H°(T), S°(T) from NASA polynomial coefficients stored in a SQLite database, converted from FORTRAN thermo.inp files.
Author: Dr. Reginaldo G. Leão Jr. — prof.reginaldo.leao@gmail.com
📖 Documentation: profleao.github.io/pyglenn
- Parse NASA-format
thermo.inp(FORTRAN Appendix C) → SQLite3 database - Query species by name, phase, molecular weight
- Calculate Cp(T), H°(T), S°(T) at any valid temperature
- Sensible enthalpy, analytical dCp/dT and Cp/Cv (γ)
- Mixture properties (molar and mass basis) for a fixed composition
- Enthalpy of formation lookup
- Enthalpy change between two temperatures
- Command-line interface
- 2,035 species, 3,779 temperature intervals
pip install pyglenngit clone https://github.com/ProfLeao/pyglenn.git
cd pyglenn
pip install .conda install conda-forge::pyglennThe database is bundled with the package — no manual build step needed.
from pyglenn import ThermochemicalCalculator
# No need to specify a DB file — uses the bundled thermo.db
calc = ThermochemicalCalculator()
calc.connect()
# Find O2 (exact match — returns only O2, not Be3N2 or Al2O2)
species = calc.get_available_species('O2', exact_match=True)
o2 = species[0]
# Calculate properties at 1000 K
props = calc.calculate_properties(o2.id, 1000.0)
print(f"Cp = {props.cp:.2f} J/(mol·K)")
print(f"H° = {props.h_relative:.1f} J/mol")
print(f"S° = {props.s:.3f} J/(mol·K)")
calc.close()Or use the context manager for automatic cleanup:
from pyglenn import ThermochemicalCalculator
with ThermochemicalCalculator() as calc:
# exact_match=True guarantees the correct species (case-insensitive)
species = calc.get_available_species('CH4', exact_match=True)
props = calc.calculate_properties(species[0].id, 500.0)
print(f"Cp = {props.cp:.2f} J/(mol·K)")Compute mixture properties (e.g. dry air) from mole fractions, on both the molar and mass basis:
from pyglenn import Mixture, ThermochemicalCalculator
with ThermochemicalCalculator() as calc:
n2 = calc.get_available_species('N2', exact_match=True)[0]
o2 = calc.get_available_species('O2', exact_match=True)[0]
air = Mixture(((n2.id, 0.79), (o2.id, 0.21))) # mole fractions
mix = calc.mixture_properties(air, 1000.0)
print(f"mean molar mass = {mix.molar_mass * 1000.0:.3f} g/mol")
print(f"cp_mass = {mix.cp_mass:.2f} J/(kg·K)")pyglenn query -s O2Only needed if the database is corrupted or you modify thermo.inp manually:
pyglenn build -i thermo.inp -o thermo.db| Table | Description |
|---|---|
species |
Chemical species (name, formula, phase, MW, ΔH°f) |
temperature_intervals |
Valid T ranges per species |
coefficients |
NASA-7 polynomial coefficients (a1–a7, b1, b2) |
file_metadata |
Global file metadata |
metadata |
Dataset metadata, including its reference gas constant |
R_UNIVERSAL = 8.31446261815324 J/(mol·K) is the universal CODATA value and
remains available through the compatibility alias R. NASA Glenn/CEA
polynomials in newly built databases declare their fitted reference constant as
R_GLENN = 8.314510 J/(mol·K) in SQLite metadata. The calculator reads that
value automatically when it connects; legacy databases fall back to
R_UNIVERSAL until explicitly migrated.
If you use pyglenn in your research, please cite it as:
@software{goncalves_leao_junior_2026_21324586,
author = {Gonçalves Leão Junior, Reginaldo},
title = {pyglenn: A Python Toolkit for Thermochemical
Properties Calculation from NASA Polynomials},
month = jul,
year = 2026,
publisher = {Zenodo},
doi = {10.5281/zenodo.21324586},
url = {https://doi.org/10.5281/zenodo.21324586},
}- Python ≥ 3.9
- NumPy ≥ 1.21
- SQLite3 (stdlib)
MIT — see LICENSE file.