root / ase / test / neighbor.py @ 4
Historique | Voir | Annoter | Télécharger (1,94 ko)
| 1 | 1 | tkerber | import numpy.random as random |
|---|---|---|---|
| 2 | 1 | tkerber | import numpy as np |
| 3 | 1 | tkerber | from ase import Atoms |
| 4 | 1 | tkerber | from ase.calculators.neighborlist import NeighborList |
| 5 | 1 | tkerber | |
| 6 | 1 | tkerber | atoms = Atoms(numbers=range(10), |
| 7 | 1 | tkerber | cell=[(0.2, 1.2, 1.4), |
| 8 | 1 | tkerber | (1.4, 0.1, 1.6), |
| 9 | 1 | tkerber | (1.3, 2.0, -0.1)]) |
| 10 | 1 | tkerber | atoms.set_scaled_positions(3 * random.random((10, 3)) - 1) |
| 11 | 1 | tkerber | |
| 12 | 1 | tkerber | def count(nl, atoms): |
| 13 | 1 | tkerber | c = np.zeros(len(atoms), int) |
| 14 | 1 | tkerber | R = atoms.get_positions() |
| 15 | 1 | tkerber | cell = atoms.get_cell() |
| 16 | 1 | tkerber | d = 0.0
|
| 17 | 1 | tkerber | for a in range(len(atoms)): |
| 18 | 1 | tkerber | i, offsets = nl.get_neighbors(a) |
| 19 | 1 | tkerber | for j in i: |
| 20 | 1 | tkerber | c[j] += 1
|
| 21 | 1 | tkerber | c[a] += len(i)
|
| 22 | 1 | tkerber | d += (((R[i] + np.dot(offsets, cell) - R[a])**2).sum(1)**0.5).sum() |
| 23 | 1 | tkerber | return d, c
|
| 24 | 1 | tkerber | |
| 25 | 1 | tkerber | for sorted in [False, True]: |
| 26 | 1 | tkerber | for p1 in range(2): |
| 27 | 1 | tkerber | for p2 in range(2): |
| 28 | 1 | tkerber | for p3 in range(2): |
| 29 | 1 | tkerber | print p1, p2, p3
|
| 30 | 1 | tkerber | atoms.set_pbc((p1, p2, p3)) |
| 31 | 1 | tkerber | nl = NeighborList(atoms.numbers * 0.2 + 0.5, |
| 32 | 1 | tkerber | skin=0.0, sorted=sorted) |
| 33 | 1 | tkerber | nl.update(atoms) |
| 34 | 1 | tkerber | d, c = count(nl, atoms) |
| 35 | 1 | tkerber | atoms2 = atoms.repeat((p1 + 1, p2 + 1, p3 + 1)) |
| 36 | 1 | tkerber | nl2 = NeighborList(atoms2.numbers * 0.2 + 0.5, |
| 37 | 1 | tkerber | skin=0.0, sorted=sorted) |
| 38 | 1 | tkerber | nl2.update(atoms2) |
| 39 | 1 | tkerber | d2, c2 = count(nl2, atoms2) |
| 40 | 1 | tkerber | c2.shape = (-1, 10) |
| 41 | 1 | tkerber | dd = d * (p1 + 1) * (p2 + 1) * (p3 + 1) - d2 |
| 42 | 1 | tkerber | print dd
|
| 43 | 1 | tkerber | print c2 - c
|
| 44 | 1 | tkerber | assert abs(dd) < 1e-10 |
| 45 | 1 | tkerber | assert not (c2 - c).any() |
| 46 | 1 | tkerber | |
| 47 | 1 | tkerber | h2 = Atoms('H2', positions=[(0, 0, 0), (0, 0, 1)]) |
| 48 | 1 | tkerber | nl = NeighborList([0.5, 0.5], skin=0.1, sorted=True, self_interaction=False) |
| 49 | 1 | tkerber | assert nl.update(h2)
|
| 50 | 1 | tkerber | assert not nl.update(h2) |
| 51 | 1 | tkerber | assert (nl.get_neighbors(0)[0] == [1]).all() |
| 52 | 1 | tkerber | |
| 53 | 1 | tkerber | h2[1].z += 0.09 |
| 54 | 1 | tkerber | assert not nl.update(h2) |
| 55 | 1 | tkerber | assert (nl.get_neighbors(0)[0] == [1]).all() |
| 56 | 1 | tkerber | |
| 57 | 1 | tkerber | h2[1].z += 0.09 |
| 58 | 1 | tkerber | assert nl.update(h2)
|
| 59 | 1 | tkerber | assert (nl.get_neighbors(0)[0] == []).all() |
| 60 | 1 | tkerber | assert nl.nupdates == 2 |