-
Notifications
You must be signed in to change notification settings - Fork 1
/
draw_band_structure.m
77 lines (75 loc) · 3.08 KB
/
draw_band_structure.m
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
function draw_band_structure(eigval_file, dos_file, pos_file, kpts_file)
%draw band structure of a system
% draw_band_structure(eigenval_file, doscar_file, pos_file, kpoints_file, n_band)
% eigenval_file: the path of EIGENVAL file
% pos_file: the path of POSCAR file
% dos_file: the path of DOSCAR file
% kpoints_file: the path of KPOINTS file, note that kpoints file must be
% generated by ALFOW format.
%
% Examples:
%
% eigval_file = 'ScO/EIGENVAL';
% pos_file = 'ScO/POSCAR';kpts_file = 'ScO/KPOINTS';
% draw_band_structure(eigval_file, pos_file, kpts_file)
%
%
% See also draw_band_structure_dos, draw_dos_element, draw_dos_pdos
[energy, kpoint] = read_eigenval(eigval_file);
E_fermi = get_fermi_from_doscar(dos_file);
if length(energy) == 1
energy_up = energy{1};
[rec_k, sys_name] = read_recip(pos_file);
sys_name = deblank(sys_name);
for ii = 2:size(kpoint,1)
kpoint(ii, 4) = norm((kpoint(ii-1,1:3)-kpoint(ii,1:3))*rec_k);
end
kpoint(:,5) = cumsum(kpoint(:,4));
% tmp_occupy = energy_up(:,2:2:end);
% tmp_mean_occupy = mean(tmp_occupy,2);
% q_up = find(abs(diff(tmp_mean_occupy))>0.5);
% cbm_up = energy_up(q_up+1,1:2:end);
% vbm_up = energy_up(q_up,1:2:end);
% if E_fermi > max(vbm_up) % fermi level lies above vbm
% energy_gap = min(cbm_up) - max(vbm_up);
energy = energy_up;% - max(vbm_up);
[hsp, hsp_label, node] = read_high_sym_point(kpts_file);
figure
plot_band(kpoint, energy(:,1:2:end), hsp, hsp_label, node, sys_name, E_fermi, 'k')
% else
% energy_gap = 0;
% energy = energy_up - E_fermi;
% [hsp, hsp_label, node] = read_high_sym_point(kpts_file);
% figure
% plot_band(kpoint, energy(:,1:2:end), hsp, hsp_label, node, sys_name, energy_gap,'k')
% warning('fermi level lies in the valence bands')
% end
else
energy_up = energy{1};
energy_down = energy{2};
% tmp_occupy_up = energy_up(:,2:2:end);
% tmp_occupy_down = energy_down(:,2:2:end);
% tmp_mean_occupy_up = mean(tmp_occupy_up,2);
% tmp_mean_occupy_down = mean(tmp_occupy_down,2);
% q_up = find(abs(diff(tmp_mean_occupy_up))>0.5);
% cbm_up = energy_up(q_up+1,1:2:end);
% vbm_up = energy_up(q_up,1:2:end);
% q_down = find(abs(diff(tmp_mean_occupy_down))>0.5);
% cbm_down = energy_down(q_down+1,1:2:end);
% vbm_down = energy_down(q_down,1:2:end);
[rec_k, sys_name] = read_recip(pos_file);
sys_name = deblank(sys_name);
for ii = 2:size(kpoint,1)
kpoint(ii, 5) = norm((kpoint(ii-1,1:3)-kpoint(ii,1:3)) * rec_k);
end
kpoint(:,5) = cumsum(kpoint(:,5));
[hsp, hsp_label, node] = read_high_sym_point(kpts_file);
% energy_gap = min(cbm_up) - max(vbm_up);
% energy_up = energy_up - max(vbm_up);
figure
plot_band(kpoint, energy_up(:,1:2:end), hsp, hsp_label, node, [sys_name,'-up'],E_fermi,'k')
% energy_gap = min(cbm_down) - max(vbm_down);
% energy_down = energy_down - max(vbm_down);
figure
plot_band(kpoint, energy_down(:,1:2:end), hsp, hsp_label, node, [sys_name,'-down'],E_fermi,'k')
end