Statistiques
| Révision :

root / ase / test / center.py @ 13

Historique | Voir | Annoter | Télécharger (2,21 ko)

1 1 tkerber
"Test that atoms.center() works when adding vacuum ()"
2 1 tkerber
3 1 tkerber
import numpy as np
4 1 tkerber
from math import pi, sqrt, cos
5 1 tkerber
from ase import data
6 1 tkerber
from ase.lattice.cubic import FaceCenteredCubic
7 1 tkerber
8 1 tkerber
def checkang(a, b, phi):
9 1 tkerber
    "Check the angle between two vectors."
10 1 tkerber
    cosphi = np.dot(a,b) / sqrt(np.dot(a,a) * np.dot(b,b))
11 1 tkerber
    assert np.abs(cosphi - cos(phi)) < 1e-10
12 1 tkerber
13 1 tkerber
symb = "Cu"
14 1 tkerber
Z = data.atomic_numbers[symb]
15 1 tkerber
a0 = data.reference_states[Z]['a']
16 1 tkerber
17 1 tkerber
# (100) oriented block
18 1 tkerber
atoms = FaceCenteredCubic(size=(5,5,5), symbol="Cu", pbc=(1,1,0))
19 1 tkerber
assert len(atoms) == 5*5*5*4
20 1 tkerber
c = atoms.get_cell()
21 1 tkerber
checkang(c[0], c[1], pi/2)
22 1 tkerber
checkang(c[0], c[2], pi/2)
23 1 tkerber
checkang(c[1], c[2], pi/2)
24 1 tkerber
assert np.abs(5 * a0 - c[2,2]) < 1e-10
25 1 tkerber
26 1 tkerber
# Add vacuum in one direction
27 1 tkerber
vac = 10.0
28 1 tkerber
atoms.center(axis=2, vacuum=vac)
29 1 tkerber
c = atoms.get_cell()
30 1 tkerber
checkang(c[0], c[1], pi/2)
31 1 tkerber
checkang(c[0], c[2], pi/2)
32 1 tkerber
checkang(c[1], c[2], pi/2)
33 1 tkerber
assert np.abs(4.5 * a0 + 2* vac - c[2,2]) < 1e-10
34 1 tkerber
35 1 tkerber
# Add vacuum in all directions
36 1 tkerber
vac = 4.0
37 1 tkerber
atoms.center(vacuum=vac)
38 1 tkerber
c = atoms.get_cell()
39 1 tkerber
checkang(c[0], c[1], pi/2)
40 1 tkerber
checkang(c[0], c[2], pi/2)
41 1 tkerber
checkang(c[1], c[2], pi/2)
42 1 tkerber
assert np.abs(4.5 * a0 + 2* vac - c[0,0]) < 1e-10
43 1 tkerber
assert np.abs(4.5 * a0 + 2* vac - c[1,1]) < 1e-10
44 1 tkerber
assert np.abs(4.5 * a0 + 2* vac - c[2,2]) < 1e-10
45 1 tkerber
46 1 tkerber
# Now a general unit cell
47 1 tkerber
atoms = FaceCenteredCubic(size=(5,5,5), directions=[[1,0,0], [0,1,0], [1,0,1]],
48 1 tkerber
                          symbol="Cu", pbc=(1,1,0))
49 1 tkerber
assert len(atoms) == 5*5*5*2
50 1 tkerber
c = atoms.get_cell()
51 1 tkerber
checkang(c[0], c[1], pi/2)
52 1 tkerber
checkang(c[0], c[2], pi/4)
53 1 tkerber
checkang(c[1], c[2], pi/2)
54 1 tkerber
assert np.abs(2.5 * a0 - c[2,2]) < 1e-10
55 1 tkerber
56 1 tkerber
# Add vacuum in one direction
57 1 tkerber
vac = 10.0
58 1 tkerber
atoms.center(axis=2, vacuum=vac)
59 1 tkerber
c = atoms.get_cell()
60 1 tkerber
checkang(c[0], c[1], pi/2)
61 1 tkerber
checkang(c[0], c[2], pi/4)
62 1 tkerber
checkang(c[1], c[2], pi/2)
63 1 tkerber
assert np.abs(2 * a0 + 2* vac - c[2,2]) < 1e-10
64 1 tkerber
65 1 tkerber
# Recenter without specifying vacuum
66 1 tkerber
atoms.center()
67 1 tkerber
c = atoms.get_cell()
68 1 tkerber
checkang(c[0], c[1], pi/2)
69 1 tkerber
checkang(c[0], c[2], pi/4)
70 1 tkerber
checkang(c[1], c[2], pi/2)
71 1 tkerber
assert np.abs(2 * a0 + 2* vac - c[2,2]) < 1e-10
72 1 tkerber
73 1 tkerber
# Add vacuum in all directions
74 1 tkerber
vac = 4.0
75 1 tkerber
atoms.center(vacuum=vac)
76 1 tkerber
c = atoms.get_cell()
77 1 tkerber
checkang(c[0], c[1], pi/2)
78 1 tkerber
checkang(c[0], c[2], pi/4)
79 1 tkerber
checkang(c[1], c[2], pi/2)
80 1 tkerber
assert np.abs(4.5 * a0 + 2* vac - c[1,1]) < 1e-10
81 1 tkerber
assert np.abs(2 * a0 + 2* vac - c[2,2]) < 1e-10