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

Uploaded CPython 3.13manylinux: glibc 2.27+ x86-64

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

Uploaded CPython 3.13macOS 15.0+ ARM64

kintera-2.3.5-cp312-cp312-manylinux_2_27_x86_64.whl (31.8 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.27+ x86-64

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

Uploaded CPython 3.12macOS 15.0+ ARM64

kintera-2.3.5-cp311-cp311-manylinux_2_27_x86_64.whl (31.7 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.27+ x86-64

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

Uploaded CPython 3.11macOS 15.0+ ARM64

kintera-2.3.5-cp310-cp310-manylinux_2_27_x86_64.whl (31.6 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.27+ x86-64

kintera-2.3.5-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.5-cp313-cp313-manylinux_2_27_x86_64.whl.

File metadata

File hashes

Hashes for kintera-2.3.5-cp313-cp313-manylinux_2_27_x86_64.whl
Algorithm Hash digest
SHA256 fdddd64815f2c9455773dc58943ebed9bb6623df5805471aadd798901e012abb
MD5 bfe1fd493a58cfd443ac5f072ce51f3d
BLAKE2b-256 2805c25a8f7beda13a896ee73ee125f78e1ff7db74ff7e8d350c532aacf88c35

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for kintera-2.3.5-cp313-cp313-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 5f4c036bd746e0c5358e14e131a3e91c36d3c63c2bd730d5fba9922771252a32
MD5 a11b8b662e07229d2c28f3536128fd1c
BLAKE2b-256 d5032704702ca24438cee285d43a22a84a59b935b362c337f908737dd97105b9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for kintera-2.3.5-cp312-cp312-manylinux_2_27_x86_64.whl
Algorithm Hash digest
SHA256 3bcbedfa814b76902ba911917541646fa3bf7ccfe49853448827542d14131c99
MD5 ce1ca077115fcc4266712160c1dcc71f
BLAKE2b-256 40da787a856663224d7ccebe8d7ed9b341e256777af987913b06c99142b0d3ec

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for kintera-2.3.5-cp312-cp312-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 7f6eaadb51ad2bdf9d56a662ad3b47a08ae9286490c7b3810c66797b2b1f3d10
MD5 e77b215744ae747facd781d40e3ec455
BLAKE2b-256 367c6d5aef73fd83b4ea4a986fbefa0ab0d38446b18045d1af07e531b5a3aff9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for kintera-2.3.5-cp311-cp311-manylinux_2_27_x86_64.whl
Algorithm Hash digest
SHA256 c38c270bbdda75951d583722fe645be40618cd8109d5e18ea5738e9324cc2532
MD5 67af7f5e1d1a16fe220934597fc516e1
BLAKE2b-256 86a250e432f7caae3d183fa6ff6f3006c31d663393415ee7d204ba8f71724968

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for kintera-2.3.5-cp311-cp311-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 3725d335bf73bc7831ccdb1c0f12f56799ec23049ebb3d17733109a0c4c35292
MD5 27730fc405adf90cc9d08feb35864233
BLAKE2b-256 eab22b4d153df11b2a0ea665e06e4343bfa38c2672ec9fe34b1c6aafba4f6526

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for kintera-2.3.5-cp310-cp310-manylinux_2_27_x86_64.whl
Algorithm Hash digest
SHA256 da512807005c43899dde2a9db85561248d5fdb5e1a5e5a1271035398906e32a6
MD5 55dc79ba079179357d169dc0f8118715
BLAKE2b-256 b4ae33637cc942814691e7a1e340b3b84ec937327f6362c7419bdafe6ca5f376

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for kintera-2.3.5-cp310-cp310-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 ad4feb2f64fc86f378d867344fc15883f87cd67880ed34b4fb4953ca29d019cf
MD5 38389cf20ad78c1c38bde8783c91b460
BLAKE2b-256 bb84c97a0409905f3326729c9624cf9cf026d9c7bbab12268e1d8047937bfef9

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