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.
|