Problems in spin-polarized ABINIT/BoltzTraP calculations
Posted: Tue Aug 09, 2016 2:52 am
Hi. I am doing some test calculations using ABINIT-8.0.8 with BoltzTrap-1.2.5.
The following is my input file for spin-polarized bcc Fe:
--------------------------
ndtset 2
#autoparal 1
paral_kgb 0
#spin related quantities
spinat 0.0 0.0 4.0
nsppol 2
#generate the total density of states in both cases
prtdos 1
#Rather standard input for a bcc metal
prtden 1
tolvrs 1.0d-10
acell 3*5.42
ecut 18.0
natom 1
nband 8
ngkpt 4 4 4
nshiftk 1
nstep 200
ntypat 1
occopt 3
rprim -0.5 0.5 0.5
0.5 -0.5 0.5
0.5 0.5 -0.5
shiftk 0.5 0.5 0.5
tsmear 0.01
typat 1
xred 0.0 0.0 0.0
znucl 26
prtbltztrp2 1 # boltztrap output
iscf2 -2
getden2 -1
kptopt2 1 # Opiton for the automatic generation of k points, taking into acount the symmetry.
ngkpt2 10 10 10
tolwfr2 1.0d-12
--------------------------------------------
Since the BoltzTraP calculation needs a denser k-point grid, it is common to use a two-dataset
setup for a non-scf calculation with iscf2=-2. However, in the up_BLZTRP.intrans and
dn_BLZTRP.intrans, it is strange to see that the number of electrons are set to 4 in both cases,
without any spin polarization.
After I set
#iscf2 -2
in the input file, the numbers of electrons in up_BLZTRP.intrans and
dn_BLZTRP.intrans become 4.9827 and 3.0173, respectively, as expected.
In the source code, the prtbltztrp_out subroutine is called in out_scfcv before calculating
the number of electrons per spin with
nelect_per_spin = ebands_nelect_per_spin(ebands).
If a non-SCF calculation is done, the occupation number of bands might be only initialized
when prtbltztrp_out is called. Therefore, nelec(nsppol) used in prtbltztrp_out is wrong.
This problem can be avoided if prtbltztrp_out is called after a SCF calculation. However,
BoltzTrap calculations usually need a large number of k points and non-SCF calculations
are necessary.
The following is my input file for spin-polarized bcc Fe:
--------------------------
ndtset 2
#autoparal 1
paral_kgb 0
#spin related quantities
spinat 0.0 0.0 4.0
nsppol 2
#generate the total density of states in both cases
prtdos 1
#Rather standard input for a bcc metal
prtden 1
tolvrs 1.0d-10
acell 3*5.42
ecut 18.0
natom 1
nband 8
ngkpt 4 4 4
nshiftk 1
nstep 200
ntypat 1
occopt 3
rprim -0.5 0.5 0.5
0.5 -0.5 0.5
0.5 0.5 -0.5
shiftk 0.5 0.5 0.5
tsmear 0.01
typat 1
xred 0.0 0.0 0.0
znucl 26
prtbltztrp2 1 # boltztrap output
iscf2 -2
getden2 -1
kptopt2 1 # Opiton for the automatic generation of k points, taking into acount the symmetry.
ngkpt2 10 10 10
tolwfr2 1.0d-12
--------------------------------------------
Since the BoltzTraP calculation needs a denser k-point grid, it is common to use a two-dataset
setup for a non-scf calculation with iscf2=-2. However, in the up_BLZTRP.intrans and
dn_BLZTRP.intrans, it is strange to see that the number of electrons are set to 4 in both cases,
without any spin polarization.
After I set
#iscf2 -2
in the input file, the numbers of electrons in up_BLZTRP.intrans and
dn_BLZTRP.intrans become 4.9827 and 3.0173, respectively, as expected.
In the source code, the prtbltztrp_out subroutine is called in out_scfcv before calculating
the number of electrons per spin with
nelect_per_spin = ebands_nelect_per_spin(ebands).
If a non-SCF calculation is done, the occupation number of bands might be only initialized
when prtbltztrp_out is called. Therefore, nelec(nsppol) used in prtbltztrp_out is wrong.
This problem can be avoided if prtbltztrp_out is called after a SCF calculation. However,
BoltzTrap calculations usually need a large number of k points and non-SCF calculations
are necessary.