Skip to main content

Torch-based Python bindings for the minichem Fortran chemistry solver.

Project description

pyminichem

pyminichem is a standalone Python package and Torch-based C++ wrapper around the Fortran mini_chem code base. The repository follows the same broad layout used by pydisort, pyharp, and kintera:

  • src/: native C, C++, and wrapper code
  • python/: Python package, pybind11 bindings, and packaged resources
  • patches/: upstream minichem patch set
  • tests/: C++ and Python validation

The build flow is:

  1. Fetch upstream mini_chem with CMake.
  2. Apply the same mini_ch_i_dlsode.f90 patch used by canoe.
  3. Link the patched Fortran implementation into a thin C shim.
  4. Wrap that shim in a Torch-based C++ API.
  5. Expose the C++ API to Python with pybind11.

Build

CPU build

Use the default GNU toolchain for the CPU-only path:

cmake -S . -B build-cpu -DBUILD_TESTS=ON
cmake --build build-cpu -j
ctest --test-dir build-cpu -R '^test_minichem.release$' --output-on-failure

If you want the editable Python package to use the CPU build, copy the native library into the package locations and reinstall:

cp build-cpu/lib/libpyminichem_release.so build/lib/libpyminichem_release.so
cp build-cpu/lib/libpyminichem_release.so python/lib/libpyminichem_release.so
python -m pip install -e .

CUDA/OpenACC build with NVHPC

The CUDA path in this repo uses GNU C/C++ for the Torch wrapper and the NVIDIA HPC SDK Fortran compiler for the OpenACC minichem backend. Do not use GNU Fortran with -DCUDA=ON: it can link through libgomp, but the resulting build fails at runtime on NVIDIA GPUs with device type nvidia not supported.

First put the NVIDIA HPC SDK compilers on PATH:

export NVHPC=/opt/nvidia/hpc_sdk
export NVHPC_BIN=$(find "$NVHPC/Linux_x86_64" \
  -mindepth 3 -maxdepth 3 -path '*/compilers/bin' -type d \
  | sort -V | tail -n 1)
export PATH="$NVHPC_BIN:$PATH"

gcc --version
g++ --version
nvfortran --version

Then configure CMake with CUDA enabled. When -DCUDA=ON, CMake defaults to gcc, g++, and nvfortran unless compilers are explicitly provided with -DCMAKE_*_COMPILER=....

cmake -S . -B build-nvhpc \
  -DBUILD_TESTS=OFF \
  -DCUDA=ON

cmake --build build-nvhpc -j

For a test-enabled local CUDA build:

cmake -S . -B build-nvhpc \
  -DBUILD_TESTS=ON \
  -DCUDA=ON

cmake --build build-nvhpc -j
ctest --test-dir build-nvhpc -R '^test_minichem.release$' --output-on-failure

To make the editable Python package use the NVHPC/CUDA build:

cp build-nvhpc/lib/libpyminichem_release.so build/lib/libpyminichem_release.so
cp build-nvhpc/lib/libpyminichem_release.so python/lib/libpyminichem_release.so
python -m pip install -e .

After installing the editable package, the CUDA example should run with CUDA tensors:

python examples/minichem.py

For PyPI/release wheels, the Linux cibuildwheel job uses docker.io/luminoctum/manylinux2_28-cuda12.8-nvhpc:2026-04-28. That image already provides CUDA Toolkit and NVIDIA HPC SDK. The release workflow discovers /opt/nvidia/hpc_sdk/Linux_x86_64/<version>/compilers/bin, exports CC=gcc, CXX=g++, FC=nvfortran, and passes those compilers to CMake.

To avoid installing CUDA/NVHPC during every release build, see docs/nvhpc-cuda-manylinux-image.md for instructions to build a manylinux_2_28 image with CUDA Toolkit and NVHPC, then push it to Docker Hub.

Test

Python tests

After installing the editable package:

pytest tests

GPU smoke test

Run the live CUDA test from a directory outside the repo root, so Python imports the editable package instead of treating the top-level pyminichem/ repo directory as a namespace package:

cd /tmp
python - <<'PY'
import torch
import pyminichem

print('cuda_enabled', pyminichem.cuda_enabled())
print('torch_cuda_available', torch.cuda.is_available())
print('device_count', torch.cuda.device_count())

base_vmr = torch.tensor(
    [[0.0, 0.9975, 0.001074, 0.0, 0.0, 0.0, 0.0, 0.00059024, 0.0, 0.00014159, 0.0, 0.0]],
    dtype=torch.float64,
)

outputs = []
for dev in [0, 1]:
    device = f'cuda:{dev}'
    mc = pyminichem.MiniChem()
    mc.initialize()
    temp = torch.tensor([1500.0], dtype=torch.float64, device=device)
    pres = torch.tensor([1.0e5], dtype=torch.float64, device=device)
    vmr = base_vmr.to(device)
    out = mc.forward(temp, pres, vmr, 60.0)
    torch.cuda.synchronize(dev)
    out_cpu = out.detach().cpu()
    outputs.append(out_cpu)
    print('device', dev, 'out_device', out.device, 'shape', tuple(out.shape))
    print('finite', bool(torch.isfinite(out).all().item()), 'sum', float(out_cpu.sum().item()))

if len(outputs) == 2:
    diff = (outputs[0] - outputs[1]).abs().max().item()
    print('max_abs_diff_between_gpu0_gpu1', diff)
PY

Expected behavior for the current working NVHPC build:

  • cuda_enabled True
  • torch_cuda_available True
  • device_count 2 on this machine
  • finite output tensors on both cuda:0 and cuda:1
  • max_abs_diff_between_gpu0_gpu1 0.0 for the smoke test above

NVIDIA HPC SDK

For the CUDA/OpenACC build, install the NVIDIA HPC SDK from NVIDIA's official Linux x86_64 packages:

  1. Download the SDK tarball from the NVIDIA HPC SDK download page.
  2. Extract the archive.
  3. Run the installer.
  4. Add the compiler bin directory to PATH.

Official references:

  • OpenACC getting started guide: https://docs.nvidia.com/hpc-sdk/archive/25.3/compilers/openacc-gs/index.html
  • NVIDIA HPC SDK download page: https://developer.nvidia.com/hpc-sdk

Typical installation flow:

wget <official-nvhpc-tarball-url>
tar -xpf nvhpc_<version>_Linux_x86_64_cuda_multi.tar.gz
cd nvhpc_<version>_Linux_x86_64_cuda_multi
sudo ./install

The default install location is typically:

/opt/nvidia/hpc_sdk/Linux_x86_64/<version>/compilers/bin

Add the compilers to your shell environment:

export NVHPC=/opt/nvidia/hpc_sdk
export PATH=$NVHPC/Linux_x86_64/<version>/compilers/bin:$PATH

Verify the installation with:

nvfortran --version
nvc++ --version
nvaccelinfo

Notes:

  • Replace <version> with the installed SDK version, for example 25.3.
  • nvaccelinfo is NVIDIA's recommended check that the driver and GPU-facing toolchain are visible.
  • The default /opt installation path usually requires sudo.

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.

pyminichem-0.3.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (26.5 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

pyminichem-0.3.0-cp313-cp313-macosx_15_0_arm64.whl (6.0 MB view details)

Uploaded CPython 3.13macOS 15.0+ ARM64

pyminichem-0.3.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (26.5 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

pyminichem-0.3.0-cp312-cp312-macosx_15_0_arm64.whl (6.0 MB view details)

Uploaded CPython 3.12macOS 15.0+ ARM64

pyminichem-0.3.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (26.4 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

pyminichem-0.3.0-cp311-cp311-macosx_15_0_arm64.whl (6.0 MB view details)

Uploaded CPython 3.11macOS 15.0+ ARM64

pyminichem-0.3.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (26.4 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

pyminichem-0.3.0-cp310-cp310-macosx_15_0_arm64.whl (6.0 MB view details)

Uploaded CPython 3.10macOS 15.0+ ARM64

File details

Details for the file pyminichem-0.3.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for pyminichem-0.3.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 323429c98587aee069437df7fd64d1a8c7cd6519739796e5cbbb74324c9fdb6d
MD5 6f9bbbde2a8a9b5cd93ef6f18073ae43
BLAKE2b-256 13d54ff9bdb84b096d2d9dff68ce2f189514f51f0730290b4d23679d3cd6932b

See more details on using hashes here.

File details

Details for the file pyminichem-0.3.0-cp313-cp313-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for pyminichem-0.3.0-cp313-cp313-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 c459aebfcbfba1f5a6b240b941c64c2fda440d4f69de8a3c623f95be7892f50a
MD5 2a25d5336c7c0c56614353633173ddd9
BLAKE2b-256 41afe6a3d164dd4b3148d9132c33f2467a5f0b37ecfd4a83a0360647f0558e81

See more details on using hashes here.

File details

Details for the file pyminichem-0.3.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for pyminichem-0.3.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 dcc764afbdf317d0cfad20f5dc053abf4fa14e31afc5ad45f3eac93849c9425e
MD5 aa889c9cdfd1a9f7e7c2182cd92c32f6
BLAKE2b-256 2c697cff0c909fe06d46d665f6988cf374a0ebfa86d5030d34197d47d0186a91

See more details on using hashes here.

File details

Details for the file pyminichem-0.3.0-cp312-cp312-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for pyminichem-0.3.0-cp312-cp312-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 8138262ee8b023d411c599b0aad6192c5ab84139bc556547178139a7159c49ed
MD5 7b15d3f76982a6f156e3cfee962e2bff
BLAKE2b-256 b9a41dae39a088d80f4338e6dac2268006195a1e7f859b7169178651db7268e5

See more details on using hashes here.

File details

Details for the file pyminichem-0.3.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for pyminichem-0.3.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 11f2f651a5da9ed6d3321566f98adb9ed3ed6b14045061f3a97bbd81035a8721
MD5 64a1a064482f9d4aa3d9246e0a96bb4d
BLAKE2b-256 41b65de844de8ddff63074f8f48a276f47957283adff89bdbe02b2804cd65471

See more details on using hashes here.

File details

Details for the file pyminichem-0.3.0-cp311-cp311-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for pyminichem-0.3.0-cp311-cp311-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 24d211fec5e2843d66994750bf09c846dff1971499c98767fdf2be7f4acee09b
MD5 6732218f4a1be46910640798da0d5b38
BLAKE2b-256 9ce5c28466c154ea205dbf50a674fcf2f605ec99bf29de11872c24f983cf0e79

See more details on using hashes here.

File details

Details for the file pyminichem-0.3.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for pyminichem-0.3.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 653ef1f24a202bdf47bc0dfde565abbd557cf5b2187079c17241050fdf83c947
MD5 0699c41526664ded4fbff705b966fa2e
BLAKE2b-256 88a28b0fbc44249aa0e8a09d0a92641cc5db30295219cbbb7730debe5c51a364

See more details on using hashes here.

File details

Details for the file pyminichem-0.3.0-cp310-cp310-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for pyminichem-0.3.0-cp310-cp310-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 cf03b13beb7658a593eefd2a30b73bdfb79e9026b23fa6f326e6779d6548c0c6
MD5 7d277ccf05a93a6f5e0c061355e8ef67
BLAKE2b-256 388dce90be75a9210ab7fca2bd50a38ccb0000a7f7c6d436dc5e07399a5c4b58

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