I have a problem in calculating the dielectric tensor of silicon by finite difference of polarization since I get the dielectric tensor depending on the symmetry of k points. I use abinit-8.0.8b.
Firstly, I use the following input file.
si2_ef.in:
Code: Select all
ndtset 7
# nsym2 1 nsym3 1 nsym4 1 nsym5 1 nsym6 1 nsym7 1
# kptopt 4 kptopt1 1
#Electric field
#********************************
#DATASET1 : zero electric field for finite electric field calculation
getwfk1 0
berryopt1 -1 rfdir11 1 1 1
#DATASET2 : Finite electric field > 0
getwfk 1
berryopt 4
efield2 0.001 0.000 0.000
efield3 -0.001 0.000 0.000
efield4 0.000 0.001 0.000
efield5 0.000 -0.001 0.000
efield6 0.000 0.000 0.001
efield7 0.000 0.000 -0.001
#######################################################################
#Common input variables
#Unit cell and Atomic positions
#********************************
acell 5.43 5.43 5.43 angstrom
rprim 0.0 0.5 0.5
0.5 0.0 0.5
0.5 0.5 0.0
xred
0.00 0.00 0.00
0.25 0.25 0.25
#Atomic types
#*************************************
natom 2
ntypat 1
znucl 14
typat 2*1
#Plane wave basis and k-point grid
#*********************************
ecut 10.0
ngkpt 12 12 12
nshiftk 4
shiftk 0.5 0.5 0.5
0.5 0.0 0.0
0.0 0.5 0.0
0.0 0.0 0.5
#Parameters of the SCF cycles
#****************************
iscf 7
ixc 7
toldfe 1.0d-12
nstep 100
diemac 12.0
nband 4
nbdbuf 0
si2_ef.files:
Code: Select all
si2_ef.in
si2_ef.out
si2_efi
si2_efo
si2_ef
/home/home1/tukagosi/code/abinit-8.0.8/tests/Psps_for_tests/14si.pspnc
I get the dielectric tensor as follows (fdpol.sh is written at the end):
Code: Select all
$ ./fdpol.sh
Electronic dielectric tensor
9.262076 -0.000000 -0.000000
0.000000 8.087971 0.000000
0.000000 -0.000000 11.995058
I expect that the dielectric tensor of silicon is isotropic, however the result is different.
Secondly, in order not to use symmetry, I add the following keywords to the input file .
Code: Select all
nsym2 1 nsym3 1 nsym4 1 nsym5 1 nsym6 1 nsym7 1
Then, I get the dielectric tensor as follows:
Code: Select all
$ ./fdpol.sh
Electronic dielectric tensor
12.488844 0.013751 0.013751
0.013751 12.488844 0.013751
0.013751 0.013751 12.488844
It is nearly isotropic although finite off diagonal components exist.
Thirdly, in order not to use time-reversal symmetry, I add the following keywords to the input file.
Code: Select all
kptopt 4 kptopt1 1
Then, I get the dielectric tensor as follows:
Code: Select all
$ ./fdpol.sh
Electronic dielectric tensor
12.500652 0.000000 -0.000000
-0.000000 12.500652 -0.000000
-0.000000 0.000000 12.477118
It is nearly isotropic although first and third diagonal components are different.
In terms of calculation cost, it is preferable to use full symmetry to generate the k points. However, dielectric tensor is not isotropic as shown at the first method. How can I get the isotropic dielectric tensor of silicon?
Takayuki Tsukagoshi
fdpol.sh:
Code: Select all
#!/bin/bash
ab_out='si2_ef.out'
#ab_out='si2_ef_fullsym.out'
#ab_out='si2_ef_nosym.out'
#ab_out='si2_ef_kptopt4.out'
dE=0.001
pi=3.14159265358979
# jdtset for +Ex,-Ex,+Ey,-Ey,+Ez,-Ez
dataset=( 2 3 4 5 6 7 )
# loop for x,y,z components of applied field
for((i=0;i<3;i++)); do
jdir=`expr $i + 1`
jdir0=$i
i1=`expr 2 \* $i`
i2=`expr $i1 + 1`
ip=${dataset[$i1]}
im=${dataset[$i2]}
# echo "ip,im=$ip,$im"
for ((j=0;$j<3;j++)); do
k=`expr 2 - $j`
pol_ep[$j]=`grep -A4 "Polarization in cartesian coordinates (a.u.):" ${ab_out} | grep 'Electronic' | head -n $ip | tail -n 1 | awk '{print $(NF-'$k')}'`
pol_em[$j]=`grep -A4 "Polarization in cartesian coordinates (a.u.):" ${ab_out} | grep 'Electronic' | head -n $im | tail -n 1 | awk '{print $(NF-'$k')}'`
# echo "pol_ep-$j = ${pol_ep[$j]} pol_em-$j = ${pol_em[$j]}"
done
for ((j=0;$j<3;j++)); do
idir=`expr $j + 1`
idir0=$j
# echo "${pol_ep[$j]} ${pol_em[$j]}"
chi[$j]=`perl -le "{ print( (${pol_ep[$j]} - ${pol_em[$j]})/(2*$dE) ) }"`
# echo ${chi[$j]}
i1=`expr $jdir0 \* 3 + $idir0`
epsi[$i1]=`perl -le "{ print( 4*$pi*${chi[$j]} )}"`
if [ $idir -eq $jdir ]; then
epsi[$i1]=`perl -le "{print( ${epsi[$i1]} + 1 )}"`
fi
# echo ${epsi[$i1]}
# exit
done
done
echo
echo " Electronic dielectric tensor"
for((idir=0;idir<3;idir++)); do
for((jdir=0;jdir<3;jdir++)); do
i1=`expr $jdir \* 3 + $idir`
printf "%f " ${epsi[$i1]}
done # jdir
echo ''
done # idir