Skip to main content

rgpot

img

codecov

rgpot is a potential-energy library and Cap'n Proto RPC server for atomistic simulation codes. It gives clients one geometry carrier, one result carrier, and one extensible backend-configuration carrier:

  • ForceInput: positions, atomic numbers, box, and unit strings
  • PotentialResult: energy plus flat force array
  • PotentialConfig: backend setup, with arms such as none, nwchem, and cpmd

XC response kernels (rgpot::XcKernel, meson -Dwith_xckernel=true) are in-process only. They are not a Potential, and there is no PotentialConfig.xckernel arm: operands are collocation plus named Libxc arrays, not ForceInput. See docs/xckernel.md. pylibxc is not on PyPI (pylibxc2 is an unrelated stub); use the conda-forge libxc package via pixi install -e xckernel.

D3Pot and D4Pot (meson -Dwith_dftd3 / -Dwith_dftd4) are in-process Potential summands: construct them and evaluate ForceInput to energy and forces. There is no PotentialConfig.d3 or PotentialConfig.d4 arm. A DFT host sums XcKernel + VV10 + D4 itself; dispersion is not folded into the XC kernel.

ExprPot (meson -Dwith_expr=true) compiles a Lepton energy string over named child Potential objects. The parser is vendored OpenMM Lepton; there is no pixi muparser feature and no PotentialConfig.expr arm.

In-process LJPot vs pyeonclient Matter on the same LJ fixture is scripts/time_lj_rgpot_vs_pyeonclient.py (rg.terra). On rg.terra (2026-09-04, 1e6 calls) A (LJPot::operator()) was 31-33 ns/call and B (in-process pyeonclient Matter.forces, not potserv) was 687 to 791 ns/call. XcKernel is not a Potential and is not part of that race. See docs/orgmode/howto/exprpot.org.

The public wire schema lives in CppCore/rgpot/rpc/Potentials.capnp and is shared by the C++ server, Python integration tests, and the Rust core crate. Native rgpot units are eV and Angstrom. RPC clients may request compatible units through ForceInput.lengthUnit and ForceInput.energyUnit.

Python (PyPI)

Install the manylinux wheel (nanobind abi3, Python >= 3.12 for the stable ABI extension; requires-python is >= 3.10 for pure metadata):

pip install rgpot
# Metatomic path (engine libs resolve from these packages at runtime):
pip install 'rgpot[metatomic]'
# or: pip install torch metatomic-torch metatensor-torch metatensor-core vesin

The PyPI wheel compiles ExprPot (vendored Lepton), D3Pot, D4Pot, and XcKernel. s-dftd3 / dftd4 are linked and vendored; no conda install is required at pip install time. Lennard-Jones needs only numpy. Metatomic uses dlopen of a bundled engine:

  • layout: rgpot/lib/torch-X.Y/libmetatomic_engine.so
  • picker: installed torch major (same multi-ABI idea as metatomic-torch)
  • supported torch majors: 2.7 and newer (wheels ship 2.7–2.13 engines)
  • torch 2.6 and older are not supported for Metatomic dlopen
import numpy as np
import rgpot

print(rgpot.__version__)
print(rgpot.has_expr, rgpot.has_dftd3, rgpot.has_dftd4, rgpot.has_xckernel)
print(rgpot.available_metatomic_engine_abis())  # e.g. 2.7 .. 2.13
# energy, forces, variance = rgpot.LJPot()(positions, atom_types, box)
# energy, forces, variance = rgpot.D3Pot()(positions, atom_types, box)
# energy, forces, variance = rgpot.ExprPot(
#     "0.5*lj + d3", {"lj": "lj", "d3": "d3"})(positions, atom_types, box)
# print(rgpot.XcKernel.catalog())
# energy, forces, variance = rgpot.evaluate_metatomic(
#     positions, atom_types, box, model_path="model.pt")

See https://pypi.org/project/rgpot/.

Build And Test

Meson is the primary build path. Use the rpctest environment when running the RPC integration scripts because they need pycapnp.

pixi shell -e rpctest
meson setup bbdir -Dwith_tests=true -Dwith_rpc=true --buildtype=debug
meson compile -C bbdir
meson test -C bbdir --print-errorlogs
python tests/rpc_integ.py --server-bin ./bbdir/CppCore/potserv

CMake is supported as well:

cmake -B build \
  -DRGPOT_BUILD_TESTS=ON \
  -DRGPOT_BUILD_EXAMPLES=ON \
  -DRGPOT_WITH_RPC=ON
cmake --build build
ctest --test-dir build --output-on-failure

For client-only consumers that only need the Cap'n Proto schema and generated RPC client types:

cmake -B build_client \
  -DRGPOT_RPC_CLIENT_ONLY=ON \
  -DRGPOT_BUILD_TESTS=ON
cmake --build build_client
ctest --test-dir build_client --output-on-failure

Backends

Backend Server selector Build / runtime notes
LJ LJ Built-in 12-6 Lennard-Jones reference potential
CuH2Pot CuH2 Built-in Cu-H EAM potential
XTBPot XTB, GFNFF, GFN0xTB, GFN1xTB Enable with -Dwith_xtb=true; use pixi env xtbbld or tbbld; linked XTBPot + dlopen libxtb_engine.so (see docs/xtb_backends.md)
TBLitePot TBLite, TBLiteGFN1, TBLiteIPEA1 Enable with -Dwith_tblite=true; use pixi env tblitebld or tbbld
D3Pot D3 In-process Potential summand. Enable with -Dwith_dftd3=true; use pixi env dftd3 or dftd. BJ/zero damping, functional key, explicit ATM flag. No PotentialConfig.d3. Goldens: meson test --suite dftd
D4Pot D4 In-process Potential summand. Enable with -Dwith_dftd4=true; use pixi env dftd4 or dftd. Functional key, charge, explicit ATM/many-body flag. No PotentialConfig.d4. Goldens: meson test --suite dftd
ExprPot in-process Enable with -Dwith_expr=true. Vendored OpenMM Lepton (no pixi muparser). Named Potential children; construct-time fail-closed names. No PotentialConfig.expr.
MetatomicPot Metatomic:<model_path> Enable with -Dwith_metatomic=true; use pixi env metatomicbld. Pip engines: torch 2.7+
UmaPot Uma:<model_path>, Uma:<model_path>:omol Enable with -Dwith_metatomic=true. AOTInductor .pt2 plus vesin neighbor lists; charge/spin are per-call tensor inputs
NWChemPot NWChem Frontend always builds; load libnwchemc from the split nwchemc project at runtime
CPMDPot CPMD Frontend always builds; load libcpmdc from the split cpmdc project at runtime
UmaPot Uma:<model.pt2> UMA / OMol AOTInductor .pt2. Vesin neighbors, one package per composition. See CppCore/rgpot/UmaPot/README.md.
SkalaPot Skala Skala XC on NWChem DFT via libnwchemc.
MOPACPot MOPAC Frontend always builds; load libmopacc from the split mopacc project at runtime (OpenMOPAC). Packed params. Default model AM1.

Copyable construct-and-evaluate (meson -Dwith_expr=true). PotentialHandle::from_impl / rgpot_potential_new_eindir wraps that one ExprPot as one eindir objective for rgmin, rgsaddle, and anneal.

#include "rgpot/ExprPot/ExprPot.hpp"
#include "rgpot/LennardJones/LJPot.hpp"
#include "rgpot/Morse/MorsePot.hpp"
#include "rgpot/types/AtomMatrix.hpp"

#include <array>
#include <memory>
#include <vector>

int main() {
  std::vector<rgpot::ExprPot::Term> terms;
  terms.emplace_back("lj", std::make_unique<rgpot::LJPot>());
  terms.emplace_back("morse", std::make_unique<rgpot::MorsePot>());
  rgpot::ExprPot pot("0.5*lj + morse", std::move(terms));

  rgpot::types::AtomMatrix positions{{1.0, 2.0, 3.0}, {1.5, 2.5, 3.5}};
  std::vector<int> atomTypes{0, 0};
  std::array<std::array<double, 3>, 3> box{{
      {15.0, 0.0, 0.0},
      {0.0, 20.0, 0.0},
      {0.0, 0.0, 30.0},
  }};
  auto [energy, forces, variance] = pot(positions, atomTypes, box);
  (void)forces;
  (void)variance;
  (void)energy;
}

When the build also has -Dwith_dftd3=true, swap the Morse child for D3Pot and the string "0.5*lj + d3".

Example server commands:

./bbdir/CppCore/potserv 12345 LJ
./bbdir/CppCore/potserv 12345 Metatomic:CppCore/tests/data/lj38/lennard-jones.pt
CPMDC_LIBRARY=/path/to/libcpmdc.so ./bbdir/CppCore/potserv 12345 CPMD
NWCHEMC_LIBRARY=/path/to/libnwchemc.so ./bbdir/CppCore/potserv 12345 NWChem

CPMD And NWChem Configuration

CPMD and NWChem do not use ad hoc rgpot config files. They use the PotentialConfig union over RPC:

  • PotentialConfig.cpmd carries CPMDParams for CPMDPot
  • PotentialConfig.nwchem carries NWChemParams for NWChemPot
  • geometry still arrives through ForceInput on every calculate() call

For CPMD, tests/cpmd_params.py contains pycapnp helpers for building CPMDParams and PotentialConfig.cpmd messages. The helper covers scalar fields, raw inputBlocks, and every structured CPMDInputSection arm. See CppCore/rgpot/CPMDPot/README.md for the engine lookup order and schema field mapping.

The CPMD runtime path is:

  1. Build libcpmdc.so in the split cpmdc repository (or use the in-tree libcpmdc_fake_engine.so from a -Dwith_tests=true build for CI).
  2. Start potserv <port> CPMD with CPMDC_LIBRARY, RGPOT_CPMDC_ENGINE, or RGPOT_CPMD_ENGINE pointing at that shared library.
  3. Send configure(PotentialConfig.cpmd) once for method setup.
  4. Send ForceInput on each calculate() call for geometry and requested output units.

For NWChem, tests/nwchem_params.py builds NWChemParams / PotentialConfig.nwchem. Engine lookup order is NWCHEMC_LIBRARY, RGPOT_NWCHEMC_ENGINE, RGPOT_NWCHEM_ENGINE, then enginePath on params. See CppCore/rgpot/NWChemPot/README.md. The NWChem runtime path mirrors CPMD:

  1. Build libnwchemc.so in the split nwchemc repository (or libnwchemc_fake_engine.so from a tests build).
  2. Start potserv <port> NWChem with the library env vars above.
  3. configure(PotentialConfig.nwchem) once, then calculate(ForceInput).

potctl drives the same Potential Cap'n Proto RPC against potserv (bridge stress and CI legs pass the potential name such as NWChem or CPMD).

Developer Tasks

Hooks use prek through prek.toml. Common commands:

pixi r prek-install
pixi r prek
pixi r rust-test
pixi r -e rpctest python tests/test_cpmd_params.py
pixi r -e rpctest python tests/test_nwchem_params.py
pixi r -e rpctest python tests/test_rpc_integ_cpmd.py
pixi r -e rpctest python tests/test_rpc_integ_nwchem.py
# Full RPC + C ABI E2E (point env at built fake engines + potserv)
export RGPOT_POTSERV=/path/to/bbdir/CppCore/potserv
export NWCHEMC_LIBRARY=/path/to/bbdir/CppCore/libnwchemc_fake_engine.so
export RGPOT_CPMD_ENGINE=/path/to/bbdir/CppCore/libcpmdc_fake_engine.so
pixi r -e rpctest python tests/test_rpc_e2e_c_abi.py
pixi r -e rpctest python tests/rpc_integ.py \
  --server-bin ./bbdir/CppCore/potserv \
  --nwchem-smoke \
  --cpmd-smoke

The root README is generated from readme_src.org. Project documentation sources live under docs/orgmode/.

License

MIT, with backend-specific notes: some potentials are adapted from eOn under BSD-3-Clause terms. The unit expression parser in CppCore/rgpot/units.cc is derived from metatomic-torch (BSD-3-Clause, metatensor developers).

Metadata

Release files for rgpot 3.5.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for rgpot 3.5.0
File Size Uploaded
rgpot-3.5.0.tar.gz 37.9 MB Details

Built distributions (wheels)

Table of built distributions (wheels) for rgpot 3.5.0
File
rgpot-3.5.0-cp312-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl CPython 3.12 abi3 Linux glibc 2.28+ x86-64, Linux glibc 2.27+ x86-64 Details
rgpot-3.5.0-cp312-abi3-macosx_14_0_arm64.whl CPython 3.12 abi3 macOS 14.0+ ARM64 Details
rgpot-3.5.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl CPython 3.11 CPython 3.11 Linux glibc 2.28+ x86-64, Linux glibc 2.27+ x86-64 Details
rgpot-3.5.0-cp311-cp311-macosx_14_0_arm64.whl CPython 3.11 CPython 3.11 macOS 14.0+ ARM64 Details
rgpot-3.5.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl CPython 3.10 CPython 3.10 Linux glibc 2.27+ x86-64, Linux glibc 2.28+ x86-64 Details
rgpot-3.5.0-cp310-cp310-macosx_14_0_arm64.whl CPython 3.10 CPython 3.10 macOS 14.0+ ARM64 Details

Total release size: 122.5 MB

Release files / rgpot-3.5.0.tar.gz

Download URL rgpot-3.5.0.tar.gz
Size 37.9 MB
Tags Source
SHA-256 checksum
How to use checksums
f8c3434fcfa5be783596b3ec851b95119351d8cefa4ed305f2c9534dddd17ce0
BLAKE2b-256 checksum
How to use checksums
eb78ebf0c6fa630edb3e629b56713519213d24bbbabc592995c2875f80a3ae5c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / rgpot-3.5.0-cp312-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl

Download URL rgpot-3.5.0-cp312-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Size 17.8 MB
Tags CPython 3.12 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64 abi3
SHA-256 checksum
How to use checksums
6884a0c870c84155ac16e470bb82de9a30511bf0bce5bafac84097eee0842e1c
BLAKE2b-256 checksum
How to use checksums
37df2a49db5186e045f825ff891377eeec516ceccdbf761003ebbdb8e9a022d1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / rgpot-3.5.0-cp312-abi3-macosx_14_0_arm64.whl

Download URL rgpot-3.5.0-cp312-abi3-macosx_14_0_arm64.whl
Size 10.4 MB
Tags CPython 3.12 abi3 macOS 14.0+ ARM64
SHA-256 checksum
How to use checksums
8435d1be1631b7da8db19046a3d1c6026b91d7b9d9a81e1f3b48c6e3e87d8a16
BLAKE2b-256 checksum
How to use checksums
c4aa1aedb8963e28778ee14efeef6ac787f4a7358f92f5367ed20d2b86c80987
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / rgpot-3.5.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl

Download URL rgpot-3.5.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Size 17.8 MB
Tags CPython 3.11 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
c6dd91037e4f846f399375fe7564a9f1d9eb32c6131c23eabc73c2072d575572
BLAKE2b-256 checksum
How to use checksums
da6828549753aa4ab3ad4770756292f8eab96a8307e5faf2613e75eca5d95fd6
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / rgpot-3.5.0-cp311-cp311-macosx_14_0_arm64.whl

Download URL rgpot-3.5.0-cp311-cp311-macosx_14_0_arm64.whl
Size 10.4 MB
Tags CPython 3.11 macOS 14.0+ ARM64
SHA-256 checksum
How to use checksums
376fac0bb8250ccf7988fa10c67dfe60a3a843273e4b1af3e7f7ae095e72a29a
BLAKE2b-256 checksum
How to use checksums
b56e4d1d676e34bfc059e7eb22eb09748071a5f494d96c7ba7f1a3b9392a40aa
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / rgpot-3.5.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl

Download URL rgpot-3.5.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Size 17.8 MB
Tags CPython 3.10 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
126aef371d6457c8a829ce16ccc55b68338f96c1a029041f9a12d247e5e9255a
BLAKE2b-256 checksum
How to use checksums
ab408a3b9a95c768ed4554e3af912109353331084eb0e31cd3a004f4e50b337f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / rgpot-3.5.0-cp310-cp310-macosx_14_0_arm64.whl

Download URL rgpot-3.5.0-cp310-cp310-macosx_14_0_arm64.whl
Size 10.4 MB
Tags CPython 3.10 macOS 14.0+ ARM64
SHA-256 checksum
How to use checksums
3a1a5cfbf8790c7558ef1f2b41e782422becadea643e5ee14929f1612128b325
BLAKE2b-256 checksum
How to use checksums
b20a0668bf9a1d31ec901eb1b789086498a587de83567c2b5fb6e72685f40039
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release history Release notifications | RSS feed

3.5.1

7 release files

This release

3.5.0 This release

7 release files

3.4.0

7 release files

3.3.0

7 release files

3.2.0

7 release files

3.1.2

7 release files

3.1.0

7 release files

3.0.2

8 release files

2.5.4

1 release file

2.5.3

1 release file

2.5.2

1 release file

2.5.1

2 release files

2.4.2

2 release files

2.4.1

2 release files

2.4.0

2 release files

2.3.1

2 release files

2.3.0

2 release files

2.2.1

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page