-
Notifications
You must be signed in to change notification settings - Fork 0
/
LCAO.jl
129 lines (105 loc) · 3.02 KB
/
LCAO.jl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
# Si: [Ne] 3s² 3p²
# Ge: [Ar] 3d¹⁰ 4s² 4p²
# J. C. Slater and G. F. Koster,
# "Simplified LCAO Method for the Periodic Potential Problem
# Phys. Rev. 94-6 (1954) 1498-1524.
#
# Parameters for Si,C,Ge:
# D. J. Chadi and M. L. Cohen
# Phys. Stat. Sol. (b) 68 (1975) 405.
using LinearAlgebra
using PyPlot
# Points of high symmetry
Γ = [0, 0, 0]
Χ = [1, 0, 0]
L = [1/2, 1/2, 1/2]
U = [1, 1/4, 1/4]
K = [3/4, 3/4, 0]
W = [1, 1/2, 0]
# Paths along Brillouin zone
# - first find lenghts
nΛ = norm(L - Γ)
nΔ = norm(Γ - Χ)
nΞ = norm(Χ - U)
nΣ = norm(K - Γ)
ni = maximum([nΛ,nΔ,nΞ,nΣ])
nΛ = Int(floor(100*nΛ/ni))
nΔ = Int(floor(100*nΔ/ni))
nΞ = Int(floor(100*nΞ/ni))
nΣ = Int(floor(100*nΣ/ni))
Λ = [(1-α)*L + α*Γ for α in LinRange(0,1,nΛ)]
Δ = [(1-α)*Γ + α*Χ for α in LinRange(0,1,nΔ)]
Ξ = [(1-α)*Χ + α*U for α in LinRange(0,1,nΞ)]
Σ = [(1-α)*K + α*Γ for α in LinRange(0,1,nΣ)]
# Slater-Koster parameters
# Vss = 4*Vssσ
# Vsp = -4*Vspσ/sqrt(3)
# Vxx = 4*(Vppσ/3 + 2*Vppπ/3)
# Vxy = 4*(Vppσ/3 - Vppπ/3)
# Si
Es = 0 # eV
Ep = 7.20 # eV
Vss = -8.13 # eV
Vsp = 5.88 # eV
Vxx = 1.71 # eV
Vxy = 7.51 # eV
# # C
# Es = 0 # eV
# Ep = 7.40 # eV
# Vss = -15.2 # eV
# Vsp = 10.25 # eV
# Vxx = 3.0 # eV
# Vxy = 8.3 # eV
# # Ge
# Es = 0 # eV
# Ep = 8.41 # eV
# Vss = -6.78 # eV
# Vsp = 5.31 # eV
# Vxx = 1.62 # eV
# Vxy = 6.82 # eV
a = 0.543E-9 # [m]
d1 = (a/4)*[ 1, 1, 1]
d2 = (a/4)*[ 1,-1,-1]
d3 = (a/4)*[-1, 1,-1]
d4 = (a/4)*[-1,-1, 1]
# Energy space
εsp = LinRange(-9,16,100)
η = (16+9)/100
DOS = zeros(100)
# Compute LCAO along path
path = vcat(Λ,Δ,Ξ,Σ)
Bands = []
for p in path
k = (2π/a)*p
g1 = 0.25*(exp(im*k⋅d1) + exp(im*k⋅d2) + exp(im*k⋅d3) + exp(im*k⋅d4))
g2 = 0.25*(exp(im*k⋅d1) + exp(im*k⋅d2) - exp(im*k⋅d3) - exp(im*k⋅d4))
g3 = 0.25*(exp(im*k⋅d1) - exp(im*k⋅d2) + exp(im*k⋅d3) - exp(im*k⋅d4))
g4 = 0.25*(exp(im*k⋅d1) - exp(im*k⋅d2) - exp(im*k⋅d3) + exp(im*k⋅d4))
# ZincBlende
H = [Es 0 0 0 Vss*g1 Vsp*g2 Vsp*g3 Vsp*g4;
0 Ep 0 0 -Vsp*g2 Vxx*g1 Vxy*g4 Vxy*g3;
0 0 Ep 0 -Vsp*g3 Vxy*g4 Vxx*g1 Vxy*g2;
0 0 0 Ep -Vsp*g4 Vxy*g3 Vxy*g2 Vxx*g1;
Vss*g1' -Vsp*g2' -Vsp*g3' -Vsp*g4' Es 0 0 0;
Vsp*g2' Vxx*g1' Vxy*g4' Vxy*g3' 0 Ep 0 0;
Vsp*g3' Vxy*g4' Vxx*g1' Vxy*g2' 0 0 Ep 0;
Vsp*g4' Vxy*g3' Vxy*g2' Vxx*g1' 0 0 0 Ep]
E = eigvals(H)
push!(Bands,E)
# Density of states
for (idx,ε) in enumerate(εsp)
G = inv((ε + im*η)*I - H)
D = -imag(tr(G)/π)
DOS[idx] += D
end
end
# Plotting
subplot(121)
plot(Bands)
xlabel("k")
ylabel("Energy [eV]")
axis([0,300,-9,16])
subplot(122)
plot(DOS,εsp)
xlabel("DOS [states/eV]")
show()