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.1-cp313-cp313-macosx_15_0_arm64.whl (6.0 MB view details)

Uploaded CPython 3.13macOS 15.0+ ARM64

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

Uploaded CPython 3.12macOS 15.0+ ARM64

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

Uploaded CPython 3.11macOS 15.0+ ARM64

pyminichem-0.3.1-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.1-cp313-cp313-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for pyminichem-0.3.1-cp313-cp313-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 11340eed1e166ce80bb14f5880c32ab2784234f719120b751cbd5c6569354eb9
MD5 d0553524bb7e7f5552f7a1ae005af5be
BLAKE2b-256 83872940643c6e4230b4429e9bce2b81dfd5399934b9e38ddceb42a683b49a86

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyminichem-0.3.1-cp312-cp312-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 21405423b02ca34f54ea3cc5f148376dad5d404dee8b476b469280ce6401e56f
MD5 411eed3176715d1d6dcbf2782b1e0f2c
BLAKE2b-256 e9ef08247c400a4b3e0d4aa14e5d90e37b0f2dd567df013e7cafa21ece17c582

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyminichem-0.3.1-cp311-cp311-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 3d2209abc59dcdc40fae7f9b0ecfe26d696a619b46b732cc686f8a1b938f50fd
MD5 cf245f136cec6d0fccd870b9680fff41
BLAKE2b-256 f4d00e8180a5784adfe2ab7c3d6700729b68a311bc9ad1dae1e24ab903b0b6a0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for pyminichem-0.3.1-cp310-cp310-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 d03fbe1b1cf2e6a2f3eda8bd35693577290570a6b9f69cf9889a16f935e47a58
MD5 a82271338a06dafe52422a4db6264568
BLAKE2b-256 059223cc8a1f3d5652662ecde10d30ba058108bb947cc83b66dc06c49801a299

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