root / ase / transport / test_transport_calulator.py
Historique | Voir | Annoter | Télécharger (2,11 ko)
1 |
from ase.transport.calculators import TransportCalculator |
---|---|
2 |
import numpy as np |
3 |
|
4 |
#Aux. function to write data to a text file.
|
5 |
def write(fname,xs,ys): |
6 |
fd = open(fname,'w') |
7 |
for x,y in zip(xs,ys): |
8 |
print >> fd, x, y
|
9 |
fd.close() |
10 |
|
11 |
H_lead = np.zeros([4,4]) |
12 |
|
13 |
# On-site energies are zero
|
14 |
for i in range(4): |
15 |
H_lead[i,i] = 0.0
|
16 |
|
17 |
# Nearest neighbor hopping is -1.0
|
18 |
for i in range(3): |
19 |
H_lead[i,i+1] = -1.0 |
20 |
H_lead[i+1,i] = -1.0 |
21 |
|
22 |
# Next-nearest neighbor hopping is 0.2
|
23 |
for i in range(2): |
24 |
H_lead[i,i+2] = 0.2 |
25 |
H_lead[i+2,i] = 0.2 |
26 |
|
27 |
H_scat = np.zeros([6,6]) |
28 |
# Principal layers on either side of S
|
29 |
H_scat[:2,:2] = H_lead[:2,:2] |
30 |
H_scat[-2:,-2:] = H_lead[:2,:2] |
31 |
|
32 |
# Scattering region
|
33 |
H_scat[2,2] = 0.0 |
34 |
H_scat[3,3] = 0.0 |
35 |
H_scat[2,3] = -0.8 |
36 |
H_scat[3,2] = -0.8 |
37 |
|
38 |
# External coupling
|
39 |
H_scat[1,2] = 0.2 |
40 |
H_scat[2,1] = 0.2 |
41 |
H_scat[3,4] = 0.2 |
42 |
H_scat[4,3] = 0.2 |
43 |
|
44 |
energies = np.arange(-3,3,0.02) |
45 |
tcalc = TransportCalculator(h=H_scat, |
46 |
h1=H_lead, |
47 |
eta=0.02,
|
48 |
energies=energies) |
49 |
|
50 |
T = tcalc.get_transmission() |
51 |
tcalc.set(pdos=[2, 3]) |
52 |
pdos = tcalc.get_pdos() |
53 |
|
54 |
tcalc.set(dos=True)
|
55 |
dos = tcalc.get_dos() |
56 |
|
57 |
write('T.dat',tcalc.energies,T)
|
58 |
write('pdos0.dat', tcalc.energies,pdos[0]) |
59 |
write('pdos1.dat', tcalc.energies,pdos[1]) |
60 |
|
61 |
#subdiagonalize
|
62 |
h_rot, s_rot, eps, u = tcalc.subdiagonalize_bfs([2, 3], apply=True) |
63 |
T_rot = tcalc.get_transmission() |
64 |
dos_rot = tcalc.get_dos() |
65 |
pdos_rot = tcalc.get_pdos() |
66 |
|
67 |
write('T_rot.dat', tcalc.energies,T_rot)
|
68 |
write('pdos0_rot.dat', tcalc.energies, pdos_rot[0]) |
69 |
write('pdos1_rot.dat', tcalc.energies, pdos_rot[1]) |
70 |
|
71 |
print 'Subspace eigenvalues:', eps |
72 |
assert sum(abs(eps-(-0.8, 0.8))) < 2.0e-15, 'Subdiagonalization. error' |
73 |
print 'Max deviation of T after the rotation:', np.abs(T-T_rot).max() |
74 |
assert max(abs(T-T_rot)) < 2.0e-15, 'Subdiagonalization. error' |
75 |
|
76 |
#remove coupling
|
77 |
h_cut, s_cut = tcalc.cutcoupling_bfs([2], apply=True) |
78 |
T_cut = tcalc.get_transmission() |
79 |
dos_cut = tcalc.get_dos() |
80 |
pdos_cut = tcalc.get_pdos() |
81 |
|
82 |
write('T_cut.dat', tcalc.energies, T_cut)
|
83 |
write('pdos0_cut.dat', tcalc.energies,pdos_cut[0]) |
84 |
write('pdos1_cut.dat', tcalc.energies,pdos_cut[1]) |
85 |
|