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]) |