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.

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

Uploaded CPython 3.13manylinux: glibc 2.27+ x86-64

kintera-2.2.0-cp313-cp313-macosx_15_0_arm64.whl (3.7 MB view details)

Uploaded CPython 3.13macOS 15.0+ ARM64

kintera-2.2.0-cp312-cp312-manylinux_2_27_x86_64.whl (29.9 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.27+ x86-64

kintera-2.2.0-cp312-cp312-macosx_15_0_arm64.whl (3.7 MB view details)

Uploaded CPython 3.12macOS 15.0+ ARM64

kintera-2.2.0-cp311-cp311-manylinux_2_27_x86_64.whl (29.7 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.27+ x86-64

kintera-2.2.0-cp311-cp311-macosx_15_0_arm64.whl (3.7 MB view details)

Uploaded CPython 3.11macOS 15.0+ ARM64

kintera-2.2.0-cp310-cp310-manylinux_2_27_x86_64.whl (29.6 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.27+ x86-64

kintera-2.2.0-cp310-cp310-macosx_15_0_arm64.whl (3.7 MB view details)

Uploaded CPython 3.10macOS 15.0+ ARM64

File details

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

File metadata

File hashes

Hashes for kintera-2.2.0-cp313-cp313-manylinux_2_27_x86_64.whl
Algorithm Hash digest
SHA256 1b139cd090822e73ad2d566de49a3e8f04c6c8b7f9736aa0a4b406590582efce
MD5 0c1556c1d5c78d4fecbcb7a837c70e76
BLAKE2b-256 98bc6a2724f91c9c318ca896a2274266b6d29eb660c0b00ad9731b3a57a06a62

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for kintera-2.2.0-cp313-cp313-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 3c21ae43da0e6832d521ec833123680487b3f204c6fe667f403e832f05b2f8dd
MD5 339a4b3dd5362358fc7f34d76a9e78f0
BLAKE2b-256 f7c79081d96d3e7f298c37280d72cbe366b2180b564095936cd2dab073443d1f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for kintera-2.2.0-cp312-cp312-manylinux_2_27_x86_64.whl
Algorithm Hash digest
SHA256 3cb42090012f127e941b828bca9628802caa181ff98dd2240a676e3a4e2c0984
MD5 c29229ac892c5e25ca8f0beed4d559d5
BLAKE2b-256 38733a96700603a77c3d0b56e12bc365c51c3a6d5b11ef766c445452d20da8aa

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for kintera-2.2.0-cp312-cp312-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 f5974afc04b24ba0a28d1102cf4d1e6c290d7cce70a77302c6e561f3eb018645
MD5 542bd20a6e03e85cfc56437c26d830cb
BLAKE2b-256 5788c040792b13f850abd3a2c3675eacb9e5267576bf430dc01f88cec32e2047

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for kintera-2.2.0-cp311-cp311-manylinux_2_27_x86_64.whl
Algorithm Hash digest
SHA256 94703e94bf111450fdca4a8d69dbfc7699df6eac65813eebf1a773ae9333c446
MD5 1b1378084b06baee7a80b0b9b199274b
BLAKE2b-256 1813222a969402207f940c833faa3879e86fdeedaf347c55669415fdb5257368

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for kintera-2.2.0-cp311-cp311-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 aebd87835f5cfd539b5b4df89919a3263cbf1c1ee6caa47c61a8f7103a2d512e
MD5 d322d9c3249690426feeb98c8e182ecd
BLAKE2b-256 715258d224cadb3aafff9342f03a1e11e804de162789e051e6d9c3d1aabe46b5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for kintera-2.2.0-cp310-cp310-manylinux_2_27_x86_64.whl
Algorithm Hash digest
SHA256 e6918f76db6972d84cf0f4cc8a8ced219e3303340e762801eff90220fb9b5326
MD5 e52bd962a4c8fedef21529be8eb5fe55
BLAKE2b-256 1ca6ceef9cf6d1c29c45817deaabaadab072367b472738ee11e8c8096dcf2997

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for kintera-2.2.0-cp310-cp310-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 98476f30a6c7f6b6b9c1bb928c86e7649c9c871ee700e8b924ec491850fa80b3
MD5 e4482a15901d32185b8b7c2bf87c7271
BLAKE2b-256 467ec33ebdfb4fda5b9f64bd015410790c237d52bb9114d254686a718120bbf1

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