Generate neighbor list for the particles in a periodic boundary cell.
Project description
pairlist
Generates the pair list of atoms that are closer to each other than the given threshold under the periodic boundary conditions.
version 0.5.1.1
Usage
See pairlist.h
for the function definition and pairlist-test.c
for usage.
Python API is served in pairlist.py. The API document is here.
To find the neighbors in a face-centered cubic lattice of size 10x10x10 on a MacBook Air 2021 (Apple Silicon),
$ python benchmark.py
INFO crude: Neighboring pair list by a crude double loop.
INFO crude: 18024 ms
INFO crude: end.
24000 pairs
INFO numpyish: Neighboring pair list by numpy fancy array.
INFO numpyish: 741 ms
INFO numpyish: end.
24000.0 pairs
INFO pairlist_py: Neighboring pair list by pairlist in pure python.
INFO pairlist_py: 125 ms
INFO pairlist_py: end.
24000 pairs
INFO pairlist_c: Neighboring pair list by pairlist in c.
INFO pairlist_c: end.
INFO pairlist_c: 16 ms
24000 pairs
import pairlist as pl
from fcc import FaceCenteredCubic
from logging import getLogger, basicConfig, INFO, DEBUG
from decorator import timeit, banner
import numpy as np
from pairlist import pairs_py, pairs2_py
basicConfig(level=INFO, format="%(levelname)s %(message)s")
logger = getLogger()
logger.debug("Debug mode.")
@banner
@timeit
def crude(lattice, cell, rc=1.1):
"Neighboring pair list by a crude double loop."
rc2 = rc**2
count = 0
for i in range(len(lattice)):
for j in range(i):
d = lattice[i] - lattice[j]
d -= np.floor(d + 0.5)
d = d @ cell
if d @ d < rc2:
count += 1
return count
@banner
@timeit
def numpyish(lattice, cell, rc=1.1):
"Neighboring pair list by numpy fancy array."
# cross-differences
M = lattice[:, None, :] - lattice[None, :, :]
# wrap
M -= np.floor(M + 0.5)
# in absolute coordinate
M = M @ cell
d = (M * M).sum(2)
return d[(d < rc**2) & (0 < d)].shape[0] / 2
@banner
@timeit
def pairlist_py(lattice, cell, rc=1.1):
"Neighboring pair list by pairlist in pure python."
count = 0
for i, j, d in pl.pairs_iter(
lattice, maxdist=rc, cell=cell, _engine=(pairs_py, pairs2_py)
):
count += 1
return count
@timeit
@banner
def pairlist_c(lattice, cell, rc=1.1):
"Neighboring pair list by pairlist in c."
count = 0
for i, j, d in pl.pairs_iter(lattice, maxdist=rc, cell=cell):
count += 1
return count
lattice, cell = FaceCenteredCubic(10)
print(crude(lattice, cell), "pairs")
print(numpyish(lattice, cell), "pairs")
print(pairlist_py(lattice, cell), "pairs")
print(pairlist_c(lattice, cell), "pairs")
Algorithm
A simple cell division algorithm is implemented.
Demo
It requires GenIce to make the test data.
% make test
Requirements
- python
- numpy
Bugs
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file pairlist-0.5.1.2.tar.gz
.
File metadata
- Download URL: pairlist-0.5.1.2.tar.gz
- Upload date:
- Size: 12.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.7.1 CPython/3.11.4 Darwin/22.6.0
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 7add7eb9587f03a0c5df36ee955c553d6f0874629cf89d537db419fa38c705d1 |
|
MD5 | eeeea30db07dc7f6c5e98ab5c8461973 |
|
BLAKE2b-256 | 940dc111f05f2f2f2e978399f589f1b9afd75f47f0e2722aabac44107daded1e |
File details
Details for the file pairlist-0.5.1.2-cp311-cp311-macosx_13_0_arm64.whl
.
File metadata
- Download URL: pairlist-0.5.1.2-cp311-cp311-macosx_13_0_arm64.whl
- Upload date:
- Size: 13.8 kB
- Tags: CPython 3.11, macOS 13.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.7.1 CPython/3.11.4 Darwin/22.6.0
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 77157e0d51d8bc7c4e104cd3e45cdbcfcf0f8c4cb2ede98619baed0d7ba191a0 |
|
MD5 | bf9e83226cab2f1c270ea28d688fc9af |
|
BLAKE2b-256 | 861cc0dd9314f018788d1f9c035e6add57ad77d9f180dc40d607eaf36205396a |