File: data_analysis.help

package info (click to toggle)
abinit 9.10.4-3
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 518,712 kB
  • sloc: xml: 877,568; f90: 577,240; python: 80,760; perl: 7,019; ansic: 4,585; sh: 1,925; javascript: 601; fortran: 557; cpp: 454; objc: 323; makefile: 77; csh: 42; pascal: 31
file content (204 lines) | stat: -rw-r--r-- 7,247 bytes parent folder | download
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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
(help file for mexData.c and EffMass.m, from Mike Zhang, Sept 2002)

Copyright (C) 2002-2022 ABINIT group (Mike Zhang)
This file is distributed under the terms of the
GNU General Public License, see ~abinit/COPYING
or http://www.gnu.org/copyleft/gpl.txt .
For the initials of contributors, see ~abinit/doc/developers/contributors.txt .

===========================================================================

mexData.C is a utility used for MatLab software to efficiently extract data 
from a textual file which contains mixed ASCII data and text. It is written 
in C language, based on MatLab MEX interface which produces subroutines from 
C or Fortran source code, and able to be compiled by MatLab embeded LCC C 
only compiler. Copy mexData.C to MatLab current directory. Under command 
line of MatLab, type 'mex mexdata.c' to compile it. Simply type 'mexdata' to 
get the usage.

The examples are as follows:

1.Plot band structure in MatLab. Under CommandLine, type
E=mexdata([87 30], 'Rutile\RBS.out', 'Eigenvalues (   eV  ) for nkpt=', 
'(reduced coord)');
plot(E);

mexData return a 87-by-30 matrix E.
The number, 87, is k points number and 30 is nband.
The ABINIT output file name, 'Rutile\RBS.out', can use relative path.
The string, 'Eigenvalues (   eV  ) for nkpt=', screen out other data in 
output files and indicates useful data will appear below. '(reduced coord)' 
indicates accurate position of data.

2.Plot the charge density on a plane. Type
D=mexdata([48 48 30], 'Rutile\RutileDensity', '','');
D1=D(:,:,1);
surf(D1);

The 48x48x30 is your ngfft in output files.
Source file, 'Rutile\RutileDensity', can be generated by cut3d(don't 
generate index,
only bare 3D data, one-column file, 48x48x30 columns). D1 is  charge density 
  on one x-y plane.

---------------------------------------------------------------------------

EffMass.m
EffMass.m is a utility used for MatLab software to analyse the eigenenergies 
of datasets in output file of ABINIT to acquiring the effective mass of 
electrons and holes from the curvature of band structure at Conduction Band 
Minimum and/or Valence Band Maximum. EffMass.m is based on mexData() 
function and polyfit() function. According to the formula,
          ( 1/Mass_eff )ij = ( 1/h_bar^2 ) * 2nd_Derivative( CBM/VBM 
eigenenergies )  with respect to ki to kj.
We can easily acquire the three diagonal components of effective mass 
tensors (As we know, the off-diagonal components will be zero if we properly 
choose the axes directions),
          Mass_eff_xx,  Mass_eff_yy, Mass_eff_zz.

Usage: [EffectiveMass, K, eigenE] = EffMass(filename, Band, nDataSet)
Varible Band indicates which band requires to be analysed.
Varible nDataSet indicates the number of dataset contained in 'filename' 
output file.
Because the data is derived from band structure calculation following a SCF 
total energy calculation, the nDataSet refers to dataset 2 to (1+nDataSet).

Examples:
EffectiveMass_IN  //the ABINIT input file (ABINITv3.3)
#---------------------------------------------------------------------
ecut          35.0
enunit        2
ndtset        3
#Dataset 1: usual self-consistent calculation
kptopt1       1
nshiftk1      3
shiftk1
              0.0 0.5 0.5
              0.5 0.0 0.5
              0.5 0.5 0.0
ngkpt1        6 6 6
prtden1       1
toldfe1       1.0d-8
#Definition of the SCF procedure
nstep         20
diemac        12.0
nband         12
ecutsm        0.5
#Dataset 2,3:  determination of the curvature of band at CBM
getden2       -1
iscf2         -2
tolwfr2       1.0d-12
kptopt2       -1
ndivk2        40
kptbounds2
              0.0    0.415  0.415 # along Delta line
              0.0    0.435  0.435
getden3       -2
iscf3         -2
tolwfr3       1.0d-12
kptopt3       -1
ndivk3        40
kptbounds3
             -0.01   0.425 0.415   # perpendicular to Delta line
              0.01   0.425 0.435
acell         3*10.25
rprim         0.0  0.5  0.5
              0.5  0.0  0.5
              0.5  0.5  0.0
natom         2
zatnum        14
ntype         1
type          2*1
xred          -0.125   -0.125   -0.125
               0.125    0.125    0.125
#-----------------------------------------------------------

Then type the command in MatLab:
[effm sK E]=effmass('silicon\effectivemass_linux\effectivemass_out', 5, 2);
effectivemass_out is your ABINIT output file, 5 means the fifth band(for 
silicon, it is LUMO), 2 means disposing of dataset 2 to 3.
The MatLab output is as follows:
EffectiveMass(:,:,1) =

    0.6817
    0.8947
    0.9760
    0.9448
    0.9641
    0.9611
    0.9581
    0.9481
    0.9470
    0.9491
    0.9485
    0.9477
    0.9496
    0.9507
    0.9500
    0.9502
    0.9496
    0.9500
    0.9499
    0.9495


EffectiveMass(:,:,2) =

    0.1859
    0.1884
    0.1934
    0.1916
    0.1914
    0.1920
    0.1917
    0.1916
    0.1918
    0.1917
    0.1917
    0.1915
    0.1916
    0.1916
    0.1915
    0.1916
    0.1916
    0.1917
    0.1917
    0.1917

The ABINITv3-output eigenvalues is fixed to the format of five-digit decimal 
fraction, so the first several values of EffectiveMass(:,:,1) and 
EffectiveMass(:,:,2) is NOT accurate and should be get rid of. (Here I 
suggest the future ABINIT should develop parameters to control output 
format; in some occasion we need more accurate output data) Then use mean()
function to get the mean of other values.

Please see the file 'EffectiveMass_IN' listed above. EffectiveMass(:,:,1)
is derived from (0.0,0.415,0.415)-(0.0,0.435,0.435), which is along Delta
line in BZ. So EffectiveMass(:,:,1) is $m_l^*$ (longitudinal effective
mass) and EffectiveMass(:,:,2) is $m_t^*$ (traverse effective mass). At
last we get the ab initio theoretical values comparing with experimental
data as follows:
             $m_l^*$ (longitudinal effective mass)       $m_t^*$ (traverse
effective mass)
This work                 0.9511                                     0.1916
Expt.                     0.9163                                     0.1905
(Error)                     3.8%                                       0.6%

Note: here is something you should notice when using this method.
1. Use 'band buffer' to get accurate eigenvalues(see lesson three in the 
tutorial) because
ABINIT uses iterative diagonalizational method.
2. The parameter kptbounds should be carefully tried when handling with 
other materials. A second order polynomial may lead to unstable results 
sometimes. In fact, from the theoretical point of view, second order 
polynomial is always true to extract the effective masses when delta k 
vector in BZ is so small that higher order components of the polynomial can 
be omitted. But because the ABINITv3-output eigenvalues is fixed to the format 
of five-digit decimal fraction, delta k is too small so that you can only 
acquire the 'identical' eigenvalues for different k vectors. So, as for 
ABINIT package, kptbounds should be carefully choosed. And use unit eV 
instead of unit hatree to get as possible as many effective digits (so 
enunit should be 2 in your input file). I found delta k=0.02 for ndivk=40 is 
enough to get ideal results for silicon. For other materials, you should 
carefully try kptbounds and ndivk value OR, use higher order polynomial.