root / ase / test / center.py @ 1
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 |