Skip to main content

Atmospheric Chemistry and Thermodynamics Library

Project description

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

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

Project details


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.3.6-cp313-cp313-manylinux_2_27_x86_64.whl (33.1 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.27+ x86-64

kintera-2.3.6-cp313-cp313-macosx_15_0_arm64.whl (3.8 MB view details)

Uploaded CPython 3.13macOS 15.0+ ARM64

kintera-2.3.6-cp312-cp312-manylinux_2_27_x86_64.whl (33.0 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.27+ x86-64

kintera-2.3.6-cp312-cp312-macosx_15_0_arm64.whl (3.8 MB view details)

Uploaded CPython 3.12macOS 15.0+ ARM64

kintera-2.3.6-cp311-cp311-manylinux_2_27_x86_64.whl (32.9 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.27+ x86-64

kintera-2.3.6-cp311-cp311-macosx_15_0_arm64.whl (3.8 MB view details)

Uploaded CPython 3.11macOS 15.0+ ARM64

kintera-2.3.6-cp310-cp310-manylinux_2_27_x86_64.whl (32.8 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.27+ x86-64

kintera-2.3.6-cp310-cp310-macosx_15_0_arm64.whl (3.8 MB view details)

Uploaded CPython 3.10macOS 15.0+ ARM64

File details

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

File metadata

File hashes

Hashes for kintera-2.3.6-cp313-cp313-manylinux_2_27_x86_64.whl
Algorithm Hash digest
SHA256 9559fe37647cf82b161212d9f8287a5b466e86b18404470944c16ac423a79317
MD5 a54b9aa9332582b03ece36f55b50d15e
BLAKE2b-256 8b88cf96949e79f8ec6289bce2a10fd25560443d1afb51f42ceed2de095b29eb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for kintera-2.3.6-cp313-cp313-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 751f0fb142dcddb540f3b776edd51fca234edfcafbd98f09d5cf8e7a901c6453
MD5 1d1470fae390b1e8261cf49f784fb2f4
BLAKE2b-256 852f8793dac8bf1ea7b47c6b7af979b4c9fae765d167a4502d1bb254a9f5784a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for kintera-2.3.6-cp312-cp312-manylinux_2_27_x86_64.whl
Algorithm Hash digest
SHA256 51b11c32e33e815c93898e5738018a21e112a5b7dd2a3457a08a5d275bc32e4f
MD5 b29425e75cd86d2a26d1b33bea2733a6
BLAKE2b-256 dfa13e8bdd6f2181031774922e24cd3478e3e4342f7f0e04ffb2730f5f9c397f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for kintera-2.3.6-cp312-cp312-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 1af2a0c1400c3b80d8377e8c3c1f7cf64736772dd71ed968ff510b660faf4c1e
MD5 37536e8d9d276ce00b4f6dfaf4ccdb01
BLAKE2b-256 3453045ab8c01277365d8f86a18bea3b5db84a1f06415316d3938a7d6b34b3bc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for kintera-2.3.6-cp311-cp311-manylinux_2_27_x86_64.whl
Algorithm Hash digest
SHA256 6d9eff791676ff6748901ac2b6239cc9ed7da4fd35ac4b3786c67ffc51fb3aff
MD5 3cf9830bd8c5b888d7d2652c111bb3e1
BLAKE2b-256 a929a00b9360b70c386031bd48e1a25c2ac1246fc6b00a4ec257139c54bd4c05

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for kintera-2.3.6-cp311-cp311-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 7ccaee9d1e77de01094ca499d69d3307df863b7aa773c08999e18fd21eb8b318
MD5 75d5767ac08b5178a39f1de39b1e3dae
BLAKE2b-256 58d93a4092777152053199712873fd427bdc58dbb80ef0c5f6802a04461ac0cd

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for kintera-2.3.6-cp310-cp310-manylinux_2_27_x86_64.whl
Algorithm Hash digest
SHA256 360624754204b24537a1c76d4301e9ea8bf687d8d7adf62c87aca1a9c7ea9203
MD5 859c397535589b932fb3cbb9f96b2887
BLAKE2b-256 2f32eb3928a4cf330c345c3908991fe897cf50d02796604961bb9436665d9947

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for kintera-2.3.6-cp310-cp310-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 05d8629493578da3ce3947569c1cf52ec6fbf84dfc0753ec6b3b333aefe93f26
MD5 e50a2165b231270d3d98cea9a5d664e4
BLAKE2b-256 6c27d63e8939036484c1697bb9a3248ce21580d746a03405f3eb992291df03e8

See more details on using hashes here.

Supported by

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