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

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.available_metatomic_engine_abis())  # e.g. 2.7 .. 2.13
# 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+
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

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).

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

rgpot-3.1.0.tar.gz (36.3 MB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

rgpot-3.1.0-cp312-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (2.1 MB view details)

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

rgpot-3.1.0-cp312-abi3-macosx_14_0_arm64.whl (1.4 MB view details)

Uploaded CPython 3.12+macOS 14.0+ ARM64

rgpot-3.1.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (2.1 MB view details)

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

rgpot-3.1.0-cp311-cp311-macosx_14_0_arm64.whl (1.4 MB view details)

Uploaded CPython 3.11macOS 14.0+ ARM64

rgpot-3.1.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (2.1 MB view details)

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

rgpot-3.1.0-cp310-cp310-macosx_14_0_arm64.whl (1.4 MB view details)

Uploaded CPython 3.10macOS 14.0+ ARM64

File details

Details for the file rgpot-3.1.0.tar.gz.

File metadata

  • Download URL: rgpot-3.1.0.tar.gz
  • Upload date:
  • Size: 36.3 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for rgpot-3.1.0.tar.gz
Algorithm Hash digest
SHA256 4dad35a1d686599418f1033236043e440df78be5c12368095a611309c6abed32
MD5 c3b45136fd8e139cfae2c7929f9dc89d
BLAKE2b-256 1a1d4a23ed2619a4c9fa7ecd598080efc1b62121a98c0662bc4d632e13fea382

See more details on using hashes here.

File details

Details for the file rgpot-3.1.0-cp312-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for rgpot-3.1.0-cp312-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 7155348500a35eadb04c236b840a9f32940e10b8fec6ec379b8d2b6245dc9e7b
MD5 dbd5074115761ab9e30c1aa7d6e49e03
BLAKE2b-256 83ccba1232d475a6c8d424d53e9b8f40d11697532779cbb1c4e61035c32d5394

See more details on using hashes here.

File details

Details for the file rgpot-3.1.0-cp312-abi3-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for rgpot-3.1.0-cp312-abi3-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 38eb2eb2c9bccde1b20101b0d0732e72f97e9c20d3aebd898f7e14352eb521a0
MD5 07fd25d34e9b8135b1d2d5bfd1b74419
BLAKE2b-256 0655c9bb78b6add1d9c1b3d81758362359a896db3a9bb898cddfa7c3104ac10a

See more details on using hashes here.

File details

Details for the file rgpot-3.1.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for rgpot-3.1.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 be2ca353695257e1d0a4e82a3e55f634c2e0e4111cad0a069a88bec9bfad368b
MD5 976412a3c324f30fdb448bf4286940fb
BLAKE2b-256 3c6c80d55c4036740f0e65d4d569b8f15f2abb548c88a964ec329146773f2427

See more details on using hashes here.

File details

Details for the file rgpot-3.1.0-cp311-cp311-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for rgpot-3.1.0-cp311-cp311-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 960e437f38197696779e9da1c0ea2a3ad57d595b8501c80d9372475ee9ae3e58
MD5 b11b7740564f31595a7d18f701cf30dd
BLAKE2b-256 832aab5cc3a17cc08968af8669d540721330587650e488a0847af7ee165609f7

See more details on using hashes here.

File details

Details for the file rgpot-3.1.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for rgpot-3.1.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 bfcc67be92ef0569fe475539debafaaf84e3ddf549606e3369fa806b15b55956
MD5 44bbec4fc2fe517270933b1d1a2400bf
BLAKE2b-256 0a41801dc8912697246f3eb581f2f4b4a60cd30895b15291fb95053ad0d5d78c

See more details on using hashes here.

File details

Details for the file rgpot-3.1.0-cp310-cp310-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for rgpot-3.1.0-cp310-cp310-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 edc75628080bd066be3049c98f4ff1078ebbc40c55b05d9f142bf4c1385a5b5e
MD5 419cd37fc34d4d69166b5cd46c3dffef
BLAKE2b-256 71bd04d9e6ab975e0ddf380c02fcf82609942c7aba6e9c2d8b3a5f0b33b3b676

See more details on using hashes here.

Release history Release notifications | RSS feed

3.2.0

7 files

3.1.2

7 files

This release

3.1.0 This release

7 files

3.0.2

8 files

2.5.4

1 file

2.5.3

1 file

2.5.2

1 file

2.5.1

2 files

2.4.2

2 files

2.4.1

2 files

2.4.0

2 files

2.3.1

2 files

2.3.0

2 files

2.2.1

2 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