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.3.2-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.2-cp313-cp313-macosx_15_0_arm64.whl (3.7 MB view details)

Uploaded CPython 3.13macOS 15.0+ ARM64

kintera-2.3.2-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.2-cp312-cp312-macosx_15_0_arm64.whl (3.7 MB view details)

Uploaded CPython 3.12macOS 15.0+ ARM64

kintera-2.3.2-cp311-cp311-manylinux_2_27_x86_64.whl (31.6 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.27+ x86-64

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

Uploaded CPython 3.11macOS 15.0+ ARM64

kintera-2.3.2-cp310-cp310-manylinux_2_27_x86_64.whl (31.5 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.27+ x86-64

kintera-2.3.2-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.3.2-cp313-cp313-manylinux_2_27_x86_64.whl.

File metadata

File hashes

Hashes for kintera-2.3.2-cp313-cp313-manylinux_2_27_x86_64.whl
Algorithm Hash digest
SHA256 b9a5250694074e6f22d1eb0382a31babbde3975685837e5fb5db17817ce1a99d
MD5 7c1ea7b6d3f107b294dbc61e2f908384
BLAKE2b-256 c8f0bee44f848753d95b22ff63fe02f2a8ef0ffe3c31e449d3f584538db080db

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for kintera-2.3.2-cp313-cp313-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 c869b4e6df5557fed9771becbc07f86f3e79de2bd997e03e3b060acefdace4eb
MD5 801c31101d0f93a1e3aa1a3d769e9b6c
BLAKE2b-256 3280a02c29868b54a590fe814191a2a326ad18f4a9be3dc5ec6c8d3f4334367f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for kintera-2.3.2-cp312-cp312-manylinux_2_27_x86_64.whl
Algorithm Hash digest
SHA256 d31048329a20cd15bcda502ffd251f171849c9b9b93666e556b2611842a05164
MD5 ef8dbd51c8dd16533a692238dca401eb
BLAKE2b-256 1f9499c38ed841d041cda2bc75192104c387ce2528f9919b7b1ede0b27920304

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for kintera-2.3.2-cp312-cp312-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 7fc0ae78bf785ae25ac35c8810b03d18709a92102438671ad8d1da9092769743
MD5 4c59e7fcb38caecd20856245b2537368
BLAKE2b-256 ba7b3f57d18461626c8caf24b973b4b475f4b0994c58cfdcebcd3b3e68fb8522

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for kintera-2.3.2-cp311-cp311-manylinux_2_27_x86_64.whl
Algorithm Hash digest
SHA256 e838a60ea0b5f96b7ef287bfa088888350818fca1b0c9fabcdbf855a57c44f60
MD5 5da072b5b01ad3470e64804b733152ed
BLAKE2b-256 d2033debc6cff7ddde0d58165774d995551d72797bead3fbc13f2c6a81800e44

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for kintera-2.3.2-cp311-cp311-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 600baf2c1a06e1b0e2e311d91db5edfdac90705e66ff7f665db8f6fbb5139b8c
MD5 dc05d64b96a45184bea854930c864cc3
BLAKE2b-256 e369819108d5aff0ebf78bbb1b651d4d0b457d87c8913b4ae129b32f224d8b95

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for kintera-2.3.2-cp310-cp310-manylinux_2_27_x86_64.whl
Algorithm Hash digest
SHA256 2c00b98bce5fd1568d44a6695b1629f3ca4d5e4ee5f0277c489b2d82e0c934f6
MD5 d6422b71db97329fb545f702fbbddfbe
BLAKE2b-256 fc8ca8098ccaa65e5ebc05ec200a6a6e3ca0af89d8659d630f90be913b9134eb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for kintera-2.3.2-cp310-cp310-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 4fb1ccfdbefcfc5f55342b652a3a4abd5cd4b3a5eeaca9101a062e8eb5e1a8de
MD5 6f0b4513e849b70c2f1f03218003e6e0
BLAKE2b-256 6fe18123982b270624794556c7da7fc92749b7bfae488f86c0f712d79804c2b5

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