Statistiques
| Révision :

root / ase / transport / test_transport_calulator.py

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

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