Skip to main content

Numerical integration grid for molecules.

Project description

test status license badge link to PyPI link to Zenodo/DOI

  • Changelog
  • Licensed under MPL v2.0 (except John Burkardt’s Lebedev code which is redistributed under LGPL v3.0)

Numgrid

Numgrid is a library that produces numerical integration grid for molecules based on atom coordinates, atom types, and basis set information. This library provides Rust and Python bindings.

Who are the people behind this code?

Authors

  • Radovan Bast

Contributors

  • Roberto Di Remigio (OS X testing, streamlined Travis testing, better C++, error handling)

For a list of all the contributions see https://github.com/dftlibs/numgrid/contributors.

Acknowledgements

  • Simon Neville (reporting issues)
  • Jaime Axel Rosal Sandberg (reporting issues)

This tool uses SPHERE_LEBEDEV_RULE, a C library written by John Burkardt which computes a Lebedev quadrature rule over the surface of the unit sphere in 3D, see also: http://people.sc.fsu.edu/~jburkardt/c_src/sphere_lebedev_rule/sphere_lebedev_rule.html

This library uses and acknowledges the MolSSI BSE (https://molssi-bse.github.io/basis_set_exchange/), which is a rewrite of the Basis Set Exchange (https://bse.pnl.gov/bse/portal) and is a collaboration between the Molecular Sciences Software Institute (http://www.molssi.org) and the Environmental Molecular Sciences Laboratory (https://www.emsl.pnl.gov).

Citation

If you use this tool in a program or publication, please acknowledge its author(s)

@misc{numgrid,
  author    = {Bast, Radovan},
  title     = {Numgrid: Numerical integration grid for molecules},
  month     = {7},
  year      = {2024},
  publisher = {Zenodo},
  version   = {v2.1.1},
  doi       = {10.5281/zenodo.1470276},
  url       = {https://doi.org/10.5281/zenodo.1470276}
}

@misc{sphere_lebedev_rule,
  author = {Burkardt, John},
  title  = {SPHERE_LEBEDEV_RULE: Quadrature Rules for the Unit Sphere},
  year   = {2010},
  url    = {https://people.sc.fsu.edu/~jburkardt/c_src/sphere_lebedev_rule/sphere_lebedev_rule.html}
}

I kindly ask you to also cite the latter since Numgrid is basically a "shell" around SPHERE_LEBEDEV_RULE, with added radial integration and molecular partitioning.

Would you like to contribute?

Yes please! Please follow this excellent guide. We do not require any formal copyright assignment or contributor license agreement. Any contributions intentionally sent upstream are presumed to be offered under terms of the Mozilla Public License Version 2.0.

Requirements

Installation

Installing via pip

python -m pip install numgrid

Building from sources and testing

Building the code:

cargo build --release

Testing the Rust interface:

cargo test --release

Running also the longer tests:

cargo test --release -- --ignored

Testing the Python layer:

pip install -r requirements.txt  # ideally into a virtual environment
maturin develop
pytest tests/test.py

API

The API changed

The API changed (sorry!) for easier maintenance and simpler use:

  • No initialization or deallocation necessary.

  • One-step instead of two steps (since the radial grid generation time is negligible compared to space partitioning, it did not make sense anymore to separate these steps and introduce a state).

  • alpha_min is given as dictionary which saves an argument and simplifies explaining the API.

  • The library now provides Rust and Python bindings. It used to provide C and Fortran bindings. The C/Fortran code lives on the cpp-version branch. I might bring the C interfaces back into the Rust code if there is sufficient interest/need.

Units

Coordinates are in bohr.

Python example

As an example let us generate a grid for the water molecule:

import numgrid

radial_precision = 1.0e-12
min_num_angular_points = 86
max_num_angular_points = 302

proton_charges = [8, 1, 1]

center_coordinates_bohr = [(0.0, 0.0, 0.0), (1.43, 0.0, 1.1), (-1.43, 0.0, 1.1)]

# cc-pVDZ basis
alpha_max = [
    11720.0,  # O
    13.01,  # H
    13.01,  # H
]
alpha_min = [
    {0: 0.3023, 1: 0.2753, 2: 1.185},  # O
    {0: 0.122, 1: 0.727},  # H
    {0: 0.122, 1: 0.727},  # H
]

for center_index in range(len(center_coordinates_bohr)):
    # atom grid using explicit basis set parameters
    coordinates, weights = numgrid.atom_grid(
        alpha_min[center_index],
        alpha_max[center_index],
        radial_precision,
        min_num_angular_points,
        max_num_angular_points,
        proton_charges,
        center_index,
        center_coordinates_bohr,
        hardness=3,
    )

    # atom grid using basis set name
    # this takes a second or two for the REST API request
    coordinates, weights = numgrid.atom_grid_bse(
        "cc-pVDZ",
        radial_precision,
        min_num_angular_points,
        max_num_angular_points,
        proton_charges,
        center_index,
        center_coordinates_bohr,
        hardness=3,
    )

# radial grid (LMG) using explicit basis set parameters
radii, weights = numgrid.radial_grid_lmg(
    alpha_min={0: 0.3023, 1: 0.2753, 2: 1.185},
    alpha_max=11720.0,
    radial_precision=1.0e-12,
    proton_charge=8,
)

# radial grid (LMG) using basis set name
radii, weights = numgrid.radial_grid_lmg_bse(
    basis_set="cc-pVDZ",
    radial_precision=1.0e-12,
    proton_charge=8,
)

# radial grid with 100 points using Krack-Koster approach
radii, weights = numgrid.radial_grid_kk(num_points=100)

# angular grid with 14 points
coordinates, weights = numgrid.angular_grid(num_points=14)

Notes and recommendations

  • The smaller the radial_precision, the better grid.

  • For min_num_angular_points and max_num_angular_points, see “Angular grid” below.

  • alpha_max is the steepest basis set exponent.

  • alpha_min is a dictionary and holds the smallest exponents for each angular momentum (order does not matter).

  • Using center_index we tell the code which of the atom centers is the one we have computed the grid for.

  • num_angular_grid_points has to be one of the many supported Lebedev grids (see table on the bottom of this page).

Rust interface

Needs to be documented better but the library exposes functions with the same name as the Python interface and probably the best example on how it can be used are the integration tests.

Saving grid in NumPy format

The current API makes is relatively easy to export the computed grid in NumPy format.

In this example we save the angular grid coordinates and weights to two separate files in NumPy format:

import numgrid
import numpy as np

coordinates, weights = numgrid.angular_grid(14)

np.save("angular_grid_coordinates.npy", coordinates)
np.save("angular_grid_weights.npy", weights)

Parallelization

The Becke partitioning step is parallelized using Rayon. In other words, this step should be able to use all available cores on the computer or computing node. Since grids are currently generated atom by atom, it is also possible to parallelize "outside" by the caller.

If you need to limit the number of cores used by Rayon, you can set (in this case limiting to 4 threads):

export RAYON_NUM_THREADS=4

Space partitioning

The molecular integration grid is generated from atom-centered grids by scaling the grid weights according to the Becke partitioning scheme, JCP 88, 2547 (1988). The default Becke hardness is 3.

Radial grid

Two choices are available:

Advantage of LMG scheme: The range of the radial grid is basis set dependent. The precision can be tuned with one single radial precision parameter. The smaller the radial precision, the better quality grid you obtain. The basis set (more precisely the Gaussian primitives/exponents) are used to generate the atomic radial grid range. This means that a more diffuse basis set generates a more diffuse radial grid.

Advantage of the KK scheme: parameter-free.

Angular grid

The angular grid is generated according to Lebedev and Laikov [A quadrature formula for the sphere of the 131st algebraic order of accuracy, Russian Academy of Sciences Doklady Mathematics, Volume 59, Number 3, 1999, pages 477-481].

The angular grid is pruned. The pruning is a primitive linear interpolation between the minimum number and the maximum number of angular points per radial shell. The maximum number is reached at 0.2 times the Bragg radius of the center.

The higher the values for minimum and maximum number of angular points, the better.

For the minimum and maximum number of angular points the code will use the following table and select the closest number with at least the desired precision:

{6,    14,   26,   38,   50,   74,   86,   110,  146,
 170,  194,  230,  266,  302,  350,  434,  590,  770,
 974,  1202, 1454, 1730, 2030, 2354, 2702, 3074, 3470,
 3890, 4334, 4802, 5294, 5810}

Taking the same number for the minimum and maximum number of angular points switches off pruning.

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.

numgrid-2.1.2-cp313-cp313-win_amd64.whl (1.0 MB view details)

Uploaded CPython 3.13Windows x86-64

numgrid-2.1.2-cp313-cp313-manylinux_2_34_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.34+ x86-64

numgrid-2.1.2-cp313-cp313-macosx_11_0_arm64.whl (1.1 MB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

numgrid-2.1.2-cp312-cp312-win_amd64.whl (1.0 MB view details)

Uploaded CPython 3.12Windows x86-64

numgrid-2.1.2-cp312-cp312-manylinux_2_34_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.34+ x86-64

numgrid-2.1.2-cp312-cp312-macosx_11_0_arm64.whl (1.1 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

numgrid-2.1.2-cp311-cp311-win_amd64.whl (1.0 MB view details)

Uploaded CPython 3.11Windows x86-64

numgrid-2.1.2-cp311-cp311-manylinux_2_34_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.34+ x86-64

numgrid-2.1.2-cp311-cp311-macosx_11_0_arm64.whl (1.1 MB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

numgrid-2.1.2-cp310-cp310-win_amd64.whl (1.0 MB view details)

Uploaded CPython 3.10Windows x86-64

numgrid-2.1.2-cp310-cp310-manylinux_2_34_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.34+ x86-64

numgrid-2.1.2-cp310-cp310-macosx_11_0_arm64.whl (1.1 MB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

File details

Details for the file numgrid-2.1.2-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: numgrid-2.1.2-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 1.0 MB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: maturin/1.9.3

File hashes

Hashes for numgrid-2.1.2-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 9a99f65e25403a50e54e3fc0889f23cd22757b5514cb45d2b5fcda0c8b731725
MD5 d2ce8260db2924e7c6c550de2f64448c
BLAKE2b-256 69ea22ecf2333a422250b1c40f061884b91a16640d4aa0411f56a6212d5b8a05

See more details on using hashes here.

File details

Details for the file numgrid-2.1.2-cp313-cp313-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for numgrid-2.1.2-cp313-cp313-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 e32f633345fd07048dabf2230911b16bbecac6917ce41cf9c1378ad27bf53b2f
MD5 e2814eb598dd31e4559c154dedf0e279
BLAKE2b-256 68a1ffc490c51a18eebb16c6b92a107fbc89da35b84e0171efca4f9884d5cb13

See more details on using hashes here.

File details

Details for the file numgrid-2.1.2-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for numgrid-2.1.2-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 7140b9b05afcc6f599b24092397516aa658a1bc2d90b8f21ecb14403288bb927
MD5 4edeb5248218dfcdf9e612c6d569167a
BLAKE2b-256 fbca22f0341774f1fb906d766e72763ab59bd00163a8ad6b86346a4cf48afe20

See more details on using hashes here.

File details

Details for the file numgrid-2.1.2-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: numgrid-2.1.2-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 1.0 MB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: maturin/1.9.3

File hashes

Hashes for numgrid-2.1.2-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 ad04f63d64c88a7120ae641372c6c75b216216f73e2f28bb44b533fc954625f4
MD5 62cf64d05bd23d1e990b054d7750e174
BLAKE2b-256 85bb4d59caf709578b05f8cd1c1a20ea0455b86bd0482876549fe4a93e10e7c8

See more details on using hashes here.

File details

Details for the file numgrid-2.1.2-cp312-cp312-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for numgrid-2.1.2-cp312-cp312-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 38108d940efc39a7291807ba079b9cb7d87bb72829a17b776a18c41d6eeed65a
MD5 87a7cd63cade16ed126dff54f7ec6007
BLAKE2b-256 ffbfa7b0a18196fc83ac4d1b75491a2664fb462e2e1643ce8be6c5f62853ca56

See more details on using hashes here.

File details

Details for the file numgrid-2.1.2-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for numgrid-2.1.2-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 a2cc44982616e11e6f4ab5d5993784026f37bad7c48e0d05191ce4ea45653d96
MD5 959fcec41ef717d7b46fe3195362f6a6
BLAKE2b-256 fc7ffd39e78ce8db561715345bb9e93133fe44014896be0a49ca9a635ab29a32

See more details on using hashes here.

File details

Details for the file numgrid-2.1.2-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: numgrid-2.1.2-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 1.0 MB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: maturin/1.9.3

File hashes

Hashes for numgrid-2.1.2-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 e76942bb333e284707ffafeab98ff5e036d4b82a304677d864a5c3cb566c300d
MD5 ce2c8b50dc4c45d9a2adf6387bb705c7
BLAKE2b-256 72cf380a045a3229d7ce924affc386a2a9c5aabda864c30d273b979e1d82f158

See more details on using hashes here.

File details

Details for the file numgrid-2.1.2-cp311-cp311-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for numgrid-2.1.2-cp311-cp311-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 8b5a6d69f5bb4c4768040d19a069112e1954276298840f5469e4a0cd6b9b1d2c
MD5 94c0e7f5c7b8097eef3f7481e8d5f6c1
BLAKE2b-256 39f6394eb4bde9e5e0283fab9362ccd18dd03358477abeb060778dba1b181965

See more details on using hashes here.

File details

Details for the file numgrid-2.1.2-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for numgrid-2.1.2-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 c5dc908efc69a8067ec91c8802d84588c5c21b919267e43fccce2e068f480626
MD5 954cefa7ced1c2ba7beba5fa3e4bf228
BLAKE2b-256 3b1611db099a8b067236ced993407d2c10104e488248fc0a182380edf7bda1da

See more details on using hashes here.

File details

Details for the file numgrid-2.1.2-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: numgrid-2.1.2-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 1.0 MB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: maturin/1.9.3

File hashes

Hashes for numgrid-2.1.2-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 efcce712ea130182eebe2d6315f95915ada6bd16480dfc5111a4e1f5006abeaf
MD5 091466197ea56b3d5a2f1f0d4e4f3db5
BLAKE2b-256 ab45048e252950815209b00e88d9d897a9a414de9811b5f72bee44b2af774f9d

See more details on using hashes here.

File details

Details for the file numgrid-2.1.2-cp310-cp310-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for numgrid-2.1.2-cp310-cp310-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 b61e03763c6dcf2ffe8c1093e0d55c0a451d4490d34c58231724baeb4412d9f8
MD5 64c8d0820a2c0956d2d17c9554fbb990
BLAKE2b-256 9ec111a4483eebeb94aad56414bf7a70b1bcee70465f5f3b1e436a5b0e42106b

See more details on using hashes here.

File details

Details for the file numgrid-2.1.2-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for numgrid-2.1.2-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 270ca08692357e1b84d14409f5c36377500deee35497827a33e1c9358f153287
MD5 672f0dfae69859d18af18d6e774edbda
BLAKE2b-256 65f0cac8d196ba470e49a6b666ef39fd8933c2660bb5fc4d2caa2effc8c970f6

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