Statistiques
| Révision :

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