Skip to main content

Kintera: Atmospheric Chemistry and Thermodynamics Library

KINTERA is a library for atmospheric chemistry and equation of state calculations, combining C++ performance with Python accessibility through pybind11 bindings.

Table of Contents

Overview

KINTERA provides efficient implementations of:

  • Chemical kinetics calculations (Arrhenius, coagulation, evaporation)
  • Photochemistry and photolysis reactions
  • Thermodynamic equation of state
  • Phase equilibrium computations
  • Atmospheric chemistry models

Multiphase Equilibrium

EquilibriumTP is a fixed-temperature, fixed-pressure constrained chemistry solver. The C++/CUDA core accepts component moles and precomputed logarithmic equilibrium constants; the module derives phase membership and stoichiometry from its options. Case-specific thermodynamics remains in Python under kintera.equilibrium.

Equilibrium networks use the repository's top-level phases, species, and reactions YAML layout. Phase species determine component ordering, species compositions validate elemental balance, and reactions with type: equilibrium generate the module's stoichiometric buffer:

from kintera import EquilibriumOptions, EquilibriumTP

options = EquilibriumOptions.from_yaml("equilibrium.yaml")
solver = EquilibriumTP(options)

Nasa9LogK evaluates ideal-gas equilibrium constants from the bundled NASA-9 database. See examples/equilibrium_nasa9.yaml and examples/equilibrium_nasa9.py for a complete YAML-defined sample:

python examples/equilibrium_nasa9.py

The library is written in C++17 with Python bindings, leveraging PyTorch for tensor operations and providing GPU acceleration support via CUDA.

Features

  • High Performance: C++17 core with optional CUDA support
  • Python Interface: Full Python API via pybind11
  • PyTorch Integration: Native tensor operations using PyTorch
  • Chemical Kinetics: Comprehensive reaction mechanism support
  • Photochemistry: Wavelength-dependent photolysis with multi-branch products
  • Thermodynamics: Advanced equation of state calculations
  • Cloud Physics: Nucleation and condensation modeling

Prerequisites

System Requirements

  • C++ Compiler: Support for C++17 (GCC 9+, Clang 5+, or MSVC 2017+)
  • CMake: Version 3.18 or higher
  • Python: Version 3.10 or higher
  • NetCDF: NetCDF C library

Python Dependencies

  • numpy
  • torch (version 2.10.0)
  • pyharp (version 2.2.0+
  • pytest (for testing)

Platform-Specific Setup

Linux (Ubuntu/Debian)

sudo apt-get update
sudo apt-get install -y build-essential cmake libnetcdf-dev

macOS

brew update
brew install cmake netcdf

Installation

Quick Start

# 1. Install Python dependencies
pip install numpy 'torch==2.10.0' 'pyharp>=2.2.0'

# 2. Clone the repository
git clone https://github.com/chengcli/kintera.git
cd kintera

# 3. Configure and build the C++ library
cmake -B build
cmake --build build --parallel

# 4. Install the Python toolkit
pip install .

Photochemistry Module

KINTERA includes a complete photochemistry module for modeling photolysis reactions in planetary atmospheres.

Architecture

src/photolysis/
├── photolysis.hpp           # PhotolysisOptions and PhotolysisImpl definitions
├── photolysis.cpp           # Implementation with YAML parsing and rate computation
├── actinic_flux.hpp         # Actinic flux helper functions
├── load_xsection_kin7.cpp   # KINETICS7 cross-section loader
├── load_xsection_yaml.cpp   # YAML cross-section loader
├── jacobian_photolysis.hpp  # Photolysis Jacobian declarations
└── jacobian_photolysis.cpp  # Species-space Jacobian helper implementation

Key Components

Component Description
PhotolysisOptions Configuration: wavelength grid, cross-sections, branches
Photolysis PyTorch module computing rates via wavelength integration
actinic_flux.hpp helpers Flux construction and wavelength interpolation helpers
jacobian_photolysis_species() Species-space Jacobian helper for implicit solvers

Thermochemistry Data

NASA-9 polynomial data is stored with SpeciesThermoImpl as structured per-species coefficient tables and converted to tensors on demand when reversible kinetics needs equilibrium constants. KineticsImpl no longer owns separate cached NASA-9 buffers.

Kinetics Species Layout

KineticsOptions.from_yaml(...) registers kinetics species using reaction-active vapors plus cloud species, rather than every species listed in the YAML file. In practice this means inert dry carrier species are not included in the concentration tensor passed to Kinetics.forward(...) or Kinetics.forward_nogil(...) unless they also participate in the reaction mechanism. Callers that derive kinetics concentrations from a larger thermo state should narrow or reorder species explicitly to the kinetics species list.

Rate Calculation

Photolysis rates are computed by integrating cross-sections weighted by actinic flux:

k = ∫ σ(λ,T) · F(λ) dλ

where σ is the cross-section [cm² molecule⁻¹], F is the actinic flux [photons cm⁻² s⁻¹ nm⁻¹], and λ is wavelength [nm].

YAML Configuration

Photolysis reactions are defined in YAML format:

reactions:
- equation: CH4 => CH3 + H + (1)CH2 + H2
  type: photolysis
  branches:
    - "CH4:1"           # photoabsorption
    - "CH3:1 H:1"       # CH3 + H branch
    - "(1)CH2:1 H2:1"   # singlet CH2 + H2 branch
  cross-section:
    - format: KINETICS7
      filename: "CH4.dat2"
    # Or inline YAML format:
    - format: YAML
      temperature: 300.
      data:
        - [100., 1.e-18, 0.5e-18]
        - [150., 2.e-18, 1.0e-18]

C++ Usage

#include <kintera/photolysis/photolysis.hpp>
#include <kintera/photolysis/actinic_flux.hpp>

// Create options
auto opts = PhotolysisOptionsImpl::create();
opts->wavelength() = {100., 150., 200.};
opts->reactions().push_back(Reaction("N2 => N2"));
opts->cross_section() = {1.e-18, 2.e-18, 1.e-18};

// Create module and move to GPU
Photolysis module(opts);
module->to(torch::kCUDA, torch::kFloat64);

auto temp = torch::tensor({300.0}, module->wavelength.options());

// Create actinic flux on the module wavelength grid
auto flux = create_solar_flux(module->wavelength, 1.e14);

// Refresh the temperature-dependent cache before forward()
module->update_xs_diss_stacked(temp);
auto rate = module->forward(temp, flux);

Python Usage

from kintera import (
    PhotolysisOptions, Photolysis, Reaction,
    create_solar_flux, set_species_names
)
import torch

# Initialize species list
set_species_names(["N2", "O2", "CH4"])

# Configure photolysis
opts = PhotolysisOptions()
opts.wavelength([100., 150., 200.])
opts.reactions([Reaction("N2 => N2")])
opts.cross_section([1e-18, 2e-18, 1e-18])

# Create module
module = Photolysis(opts)

temp = torch.tensor([300.0], dtype=module.wavelength.dtype,
                    device=module.wavelength.device)

# Create flux on the module wavelength grid and compute rates
flux = create_solar_flux(module.wavelength, 1e14)
module.update_xs_diss_stacked(temp)
rate = module.forward(temp, flux)

Cross-Section File Formats

The module supports multiple cross-section formats:

Format Description
YAML Inline wavelength/cross-section data
KINETICS7 NCAR KINETICS7 format files
VULCAN VULCAN photochemistry format

Testing

KINTERA includes comprehensive C++ and Python tests.

Running All Tests

ctest --test-dir build/tests --output-on-failure

Photochemistry Tests

Run photochemistry-specific tests:

# Focused C++ tests
./build/tests/test_photolysis_options.release
./build/tests/test_ch4_photolysis.release

# Python tests
pytest tests/test_photolysis.py -v

Device Coverage

Parameterized C++ tests are generated for CPU and CUDA builds. MPS test instantiations have been removed from the default test matrix.

Test Coverage

Test File Coverage
test_photolysis_options.cpp YAML parsing, cross-section loading
test_photolysis_kinetics.cpp Kinetics integration, stoichiometry
test_actinic_flux.cpp Flux interpolation, tensor shapes
test_ch4_photolysis.cpp End-to-end CH4 photolysis, Jacobian
test_photolysis.py Python bindings integration

Documentation

Full documentation is available at: https://kintera.readthedocs.io

To build documentation locally:

cd docs
pip install -r requirements.txt
make html

Dependency Cache

A successful build saves cache files in .cache/. To force a clean rebuild:

rm -rf .cache build

Development

Project Structure

kintera/
├── src/
│   ├── kinetics/       # Kinetics modules (Arrhenius, falloff, three-body, etc.)
│   ├── photolysis/     # Photolysis, actinic flux, and Jacobian helpers
│   ├── diffusion/      # Diffusion operators
│   ├── units/          # Unit conversion helpers
│   ├── thermo/         # Thermodynamics
│   └── math/           # Interpolation utilities
├── python/
│   ├── csrc/           # pybind11 bindings
│   ├── kintera.pyi     # Type stubs
│   └── py.typed        # PEP 561 marker
├── tests/              # C++ and Python tests
├── examples/           # Usage examples
└── data/               # Test data (cross-sections, YAML configs)

Code Style

pip install pre-commit
pre-commit install
pre-commit run --all-files

Type Hints

KINTERA provides full type hint support through Python stub files:

  • IDE autocomplete in VS Code, PyCharm
  • Type checking with mypy or pyright

See python/STUB_FILES.md for details.

Continuous Integration

GitHub Actions CI pipeline:

  1. Pre-commit checks (formatting, linting)
  2. Build on Linux and macOS
  3. Run all C++ and Python tests

License

See LICENSE file for details.

Authors

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

kintera-2.4.5-cp313-cp313-manylinux_2_27_x86_64.whl (39.6 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.27+ x86-64

kintera-2.4.5-cp313-cp313-macosx_15_0_arm64.whl (4.1 MB view details)

Uploaded CPython 3.13macOS 15.0+ ARM64

kintera-2.4.5-cp312-cp312-manylinux_2_27_x86_64.whl (39.5 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.27+ x86-64

kintera-2.4.5-cp312-cp312-macosx_15_0_arm64.whl (4.1 MB view details)

Uploaded CPython 3.12macOS 15.0+ ARM64

kintera-2.4.5-cp311-cp311-manylinux_2_27_x86_64.whl (39.4 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.27+ x86-64

kintera-2.4.5-cp311-cp311-macosx_15_0_arm64.whl (4.1 MB view details)

Uploaded CPython 3.11macOS 15.0+ ARM64

kintera-2.4.5-cp310-cp310-manylinux_2_27_x86_64.whl (39.3 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.27+ x86-64

kintera-2.4.5-cp310-cp310-macosx_15_0_arm64.whl (4.1 MB view details)

Uploaded CPython 3.10macOS 15.0+ ARM64

File details

Details for the file kintera-2.4.5-cp313-cp313-manylinux_2_27_x86_64.whl.

File metadata

File hashes

Hashes for kintera-2.4.5-cp313-cp313-manylinux_2_27_x86_64.whl
Algorithm Hash digest
SHA256 e39a0fced80b1cb28c148f540f38a373e51c46f6144199578b7d49e735a0bb8b
MD5 6ea8271d8a493f2a059dc411a9258e03
BLAKE2b-256 65ae478dc1e8c3d225682d6ae7e558ae46ac0ad71345ad35a67a8d4fd58a45ea

See more details on using hashes here.

File details

Details for the file kintera-2.4.5-cp313-cp313-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for kintera-2.4.5-cp313-cp313-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 f1ff65a04406c988a20990a143c81dc0ef42a265c5689e6f8278a0bc0b906c44
MD5 ca61acfdad1fcaac9d7a39674ed0fbde
BLAKE2b-256 d325714a722ea597c7604e323a2cd0fcd621b09730c0a7661401d719035316a9

See more details on using hashes here.

File details

Details for the file kintera-2.4.5-cp312-cp312-manylinux_2_27_x86_64.whl.

File metadata

File hashes

Hashes for kintera-2.4.5-cp312-cp312-manylinux_2_27_x86_64.whl
Algorithm Hash digest
SHA256 e3d0b9e92f1144bf40cb1ccce1515e13c1cdfbe99f99fd2a22341213255f1c00
MD5 be6f4ef7d3f2b59bfcababae24ac1b28
BLAKE2b-256 dc9a3fd9d41316b816998ce79f2974634c9f53080e5a0f04a1ade19de0d70c16

See more details on using hashes here.

File details

Details for the file kintera-2.4.5-cp312-cp312-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for kintera-2.4.5-cp312-cp312-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 14770969b31808acb48c710b65d9abf7d5d2234173d8a9045a99858247038044
MD5 239bef21a4c5a2b031e6887ef58b6306
BLAKE2b-256 09777f358d1f2220ed9289753ce37fbb9012efa838c93f5b26d2671a02837bae

See more details on using hashes here.

File details

Details for the file kintera-2.4.5-cp311-cp311-manylinux_2_27_x86_64.whl.

File metadata

File hashes

Hashes for kintera-2.4.5-cp311-cp311-manylinux_2_27_x86_64.whl
Algorithm Hash digest
SHA256 3986569c684e3d4bada81f2fca370727ed55d757a244de76f16a45ecfaf2393b
MD5 34befc199d87158c1c7ad61c9c399a27
BLAKE2b-256 ea3c9264e7020c807aabe2a8227200d25d454e123e7d9635bb1d86e815133ec2

See more details on using hashes here.

File details

Details for the file kintera-2.4.5-cp311-cp311-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for kintera-2.4.5-cp311-cp311-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 9ddc655272296587723ca02db85aaa60df4fa0e541b0d806d255ca8fffa6b034
MD5 772f7319759e6e49418028254212705d
BLAKE2b-256 a41c5171f636a0ad5bb352989f3b8253fdaf8f9c802f649290c07b6f42b860ef

See more details on using hashes here.

File details

Details for the file kintera-2.4.5-cp310-cp310-manylinux_2_27_x86_64.whl.

File metadata

File hashes

Hashes for kintera-2.4.5-cp310-cp310-manylinux_2_27_x86_64.whl
Algorithm Hash digest
SHA256 fa3619acf8451127eb2c16e64d91ae6b51e62070ee0dafe680cd36fb1db7307d
MD5 8f7aad9472bb21aba6180a24c8e4b379
BLAKE2b-256 42eb58dd471efa48388cf84aeda49b647fe0b36f55d5618732297beb242e7f5e

See more details on using hashes here.

File details

Details for the file kintera-2.4.5-cp310-cp310-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for kintera-2.4.5-cp310-cp310-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 fa75adc4a9e311278bba8af2cae165ab78483dfc32c048656ca357c1a4d06606
MD5 d8fe69d889d6faf9eb446f46fd3c0aa4
BLAKE2b-256 86112c0ba98ce1a5050aa84257d75cbf351c5205690b91e44a7a39310b6a5bdf

See more details on using hashes here.

Release history Release notifications | RSS feed

2.4.8

8 files

2.4.7

8 files

2.4.6

8 files

This release

2.4.5 This release

8 files

2.4.3

8 files

2.4.2

6 files

2.4.1

4 files

2.4.0

8 files

2.3.6

8 files

2.3.5

8 files

2.3.4

8 files

2.3.3

8 files

2.3.2

8 files

2.3.1

5 files

2.2.0

8 files

2.1.1

8 files

2.1.0

8 files

2.0.1

10 files

2.0.0

10 files

1.4.0

8 files

1.3.4

15 files

1.3.2

10 files

1.3.1

10 files

1.3.0

10 files

1.2.9

10 files

1.2.8

10 files

1.2.7

10 files

1.2.6

10 files

1.2.3

10 files

1.2.2

10 files

1.2.1

10 files

1.1.5

10 files

1.1.4

10 files

1.1.2

10 files

1.1.1

10 files

1.1.0

10 files

1.0.1

10 files

1.0.0

10 files

0.9.6

10 files

0.9.4

5 files

0.9.3

5 files

0.9.1

5 files

0.9.0

10 files

0.8.7

10 files

0.8.6

10 files

0.8.5

10 files

0.8.4

10 files

0.8.3

10 files

0.8.2

10 files

0.8.1

10 files

0.8.0

10 files

0.7.9

10 files

0.7.8

10 files

0.7.7

10 files

0.7.6

10 files

0.7.5

10 files

0.7.4

10 files

0.7.3

10 files

0.7.2

10 files

0.7.1

10 files

0.7.0

5 files

0.5.1

10 files

0.5.0

10 files

0.3.0

10 files

0.0.2

2 files

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page