学术之友 发表于 2021-10-19 05:27:56

基于Shell+VASP实现主动计算DFT+U中的U值(附源代码)

QE:通过线性响应得出体系某site的自适应Hubbard U示例
Hubbard U parameters from CRP

Calculate hubbard U in a self-consistent fashion

对于接触过磁性质料和强关联电子体系的盘算的打工人来说,DFT+U方法想必一定不会陌生,本方法中我们基于线性响应近似的方法盘算自洽Hubbard U值。
具体也是将VASP官方的盘算方法进行了集成,省去了对POTCAR、INCAR的修改,一键直接进行U值的盘算并进行线性拟合。
具体操作如下:
1. 准备必要文件
这里必要的文件是:POSCAR (你也可以自己生成KPOINTS、POTCAR、INCAR文件,也可以通过本脚本主动生成,留意主动生成INCAR后必要手动设置此中的MAGMOM值)
2. 在步伐中输入本机运行VASP的代码
这一步是必须的,运行脚本后输入0,0后,输入服务器运行VASP的代码。
https://p6.toutiaoimg.com/large/pgc-image/SmEJQOtAExRdRe
https://mmbiz.qlogo.cn/mmbiz_png/Dq5vjeEBGozH5nYYrfXic9CRnUMGtjltE7Irj6Jg6ULQSgh4Ua395Ujp3SDjWDBsf6gm9DYWrGdFWLaAmMWg3Wg/0?wx_fmt=png
随后即生成run.wsy文件,假如不想通过步伐生成,也可事先自己写好run.wsy文件。
3. 盘算DFT基态

运行步伐后后输入1,这里会要求你输入必要盘算U值原子在POSCAR中的位置以及U值加入的轨道。
https://p26.toutiaoimg.com/large/pgc-image/SmEJQPiBbRERmy
之后步伐主动创建文件,调用vaspkit生成新的POTCAR文件,并调VASP进行盘算。
(此时会生成input.wsy文件,不要修改)
4. 进行+U的自洽与非自洽盘算

[*]运行脚本后输入2,步伐主动调VASP进行自洽与非自洽盘算。
5. 盘算U值
上述盘算全部完成之后,运行脚本后输入3,盘算U值,并生成output.wsy文件。
https://p26.toutiaoimg.com/large/pgc-image/SmEJQQ4JKEC5O8
打开output.wsy,末了一行即为该原子所对应的U值。
也可如VASP网中通过上述的第一列和末了两列数据进行线性拟合得到。
(由于赝势选取的不同,盘算结果与官网有些许差别)

https://p6.toutiaoimg.com/large/pgc-image/SmEJQQP2iedu1Z

初代版本,还请多多支持,后续还会加入新功能。
最新步伐下载地点:https://github.com/Code-WSY/Code-WSY
源代码:
############################################vasp_Ueff-1.0.wsy##############################
#!/bin/sh
source ~/.bashrc
#Initialization settings
MAX=0.20
MIN=-0.20
STEP=0.05
cp POSCAR POSCAR.0
#filename##
filename_dft="1-DFT"
filename_NCSF_SCF="2-NCSF+SCF"
filename_NCSF_SCF_1="1-U-NSCF"
filename_NCSF_SCF_2="2-U-SCF"



finish="
###################Author:SuYun Wang###################
#####################VASP_Ueff_1.0#####################
### ###
### Finished ! ! ###
### ###
### ###
#######################################################
#######################################################
"
################################################################################################
###########################################Main#################################################
################################################################################################
################################################################################################
echo "
##########################Author:SuYun Wang#############################
#############################VASP_Ueff_1.0##############################
### ###
### Please enter the calculation you want to perform: ###
### 0.Generate input file ###
### 1.Calculate DFT groudstate ###
### 2.Calculate SCF and NSCF for DFT+U(1 must be completed first) ###
### 3.Extract Ueff data(2 must be completed first) ###
### ###
########################################################################
########################################################################
"
read arg
#################
if (( ${arg}==0 ));then
echo "
##########################Author:SuYun Wang#############################
#############################VASP_Ueff_1.0##############################
### ###
### Please enter the input file you want to generate: ###
### 0.VASP run command ###
### 1.INCAR(Incomplete) ###
### 2.KPOINTS ###
### 3.POTCAR(Vaspkit needs to be installed) ###
### ###
### ###
########################################################################
########################################################################
"
read input
####################VASP run command##########################
if (( ${input}==0 )); then
echo "
##########################Author:SuYun Wang#############################
#############################VASP_Ueff_1.0##############################
### ###
### Please enter the control command to run VASP ###
### ###
########################################################################
########################################################################
"
read input2
###sub name####run
runcode='#!/bin/sh
source ~/.bashrc'
##################################
echo "$runcode" > run.wsy
echo $input2 >>run.wsy

fi
####################INCAR INPUT###################
if (( ${input}==1 )); then
cat>INCARPREC=A
EDIFF=1E-6
ISMEAR=0
SIGMA=0.2
ISPIN=2
MAGMOM=
LORBIT=11
LMAXMIX=4
!
echo -e "$finish"

fi
####################KPOINTS INPUT###################
if ((${input}==2)) ; then
cat>KPOINTS0
Monkhorst
1 1 1
0 0 0
!
echo -e "$finish"

fi
####################POTCAR INPUT###################

if ((${input}==3)) ; then
cat>INPUT!
vaspkit < INPUT
rm INPUT
echo -e "$finish"

fi


fi

####################
if (( ${arg}==1 ));then
echo "
###################Author:SuYun Wang###################
#####################VASP_Ueff_1.0#####################
### ###
### Please enter the sequence number of the atom ###
### you want to calculate the U value in POSCAR: ###
### ###
#######################################################
#######################################################
"
read arg2
rm input.wsy
echo $arg2>>input.wsy
echo "
###################Author:SuYun Wang###################
#####################VASP_Ueff_1.0#####################
### ###
### Please enter the sequence number of the atom ###
### you want to calculate the U value in POSCAR: ###
### 1-p;2-d... ###
### ###
#######################################################
#######################################################
"
read arg3
echo $arg3>>input.wsy
#############################################################################
##########################CHANGE POSCAR######################################
###
Num_ELE=$(awk -F ' ' '{print NF}' POSCAR|head -7|tail -1|awk '{printf "%d",$1}')
num=0
############################################
#3
for ((i=1;i1 ));then
value=$i
echo "condition 1 "
atoms_num=$(echo $(head -7 POSCAR|awk '{print $(i)}' i="$i"))
name=`echo $( head -6 POSCAR|tail -1|awk '$(value)=$(value)" " $(value)' value="$value" )`
number=`echo $(head -7 POSCAR|tail -1|awk '$(value)=$(value)-1 " " "1"' value="$value")`
echo "writing POSCAR"
echo -e "$(sed "6c${name}" POSCAR)">POSCAR
echo -e "$(sed "7c${number}" POSCAR)">POSCAR
echo "written POSCAR!"
break
fi
#########################2222222########################################
########################################################################
########################222222222######################################
#######################################################################

if (( $num==$arg2 ))&&(( $E==1 ));then
echo "condition 2 "
value=$i
atoms_num=$(echo $(head -7 POSCAR|awk '{print $(i)}' i="$i"))
#BUbian
name=`echo $( head -6 POSCAR|tail -1|awk '$(value)=$(value)"' value="$value" )`
number=`echo $(head -7 POSCAR|tail -1|awk '$(value)=$(value)' value="$value")`

echo -e "$(sed "6c${name}" POSCAR)">POSCAR
echo -e "$(sed "7c${number}" POSCAR)">POSCAR
echo "Written POSCAR!"
break
fi
#########################################################################
############################33333333#####################################
if (( $num>$arg2 ))&&(( $E>=3 ))&&(( $((arg2+E-num))!=1 ));then
echo "condition 3 "
value=$i
atoms_num=$(echo $(head -7 POSCAR|awk '{print $(i)}' i="$i" ))
name=$( echo $( head -6 POSCAR|tail -1|awk '$(value)=$(value)" "$(value)" "$(value)' value="$value" ))
number=$( echo $( head -7 POSCAR|tail -1|awk '$(value)=E-1-num+arg2" " "1" " " num-arg2' value="$value" E="$E" arg2="$arg2" num="$num" ))
echo -e "$(sed "6c${name}" POSCAR)">POSCAR
echo -e "$(sed "7c${number}" POSCAR)">POSCAR
echo "Written POSCAR!"
break
fi
#########################################################################
############################444444444###################################
if (( $num>$arg2 ))&&(( $E>=3 ))&&(( $((arg2+E-num))==1 ));then
echo "condition 3 "
value=$i
atoms_num=$(echo $(head -7 POSCAR|awk '{print $(i)}' i="$i" ))
name=$( echo $( head -6 POSCAR|tail -1|awk '$(value)=$(value)" "$(value)' value="$value" ))
number=$( echo $( head -7 POSCAR|tail -1|awk '$(value)="1" " " E-1' value="$value" E="$E" arg2="$arg2" num="$num" ))
echo -e "$(sed "6c${name}" POSCAR)">POSCAR
echo -e "$(sed "7c${number}" POSCAR)">POSCAR
echo "Written POSCAR!"
break
fi
#######################################################################
############################5555555####################################
#######################################################################
if (( $num>$arg2 ))&&(( $E==2 ));then
echo "condition 5 "
value=$i
atoms_num=$(echo $(head -7 POSCAR|awk '{print $(i)}' i="$i" ))
name=$( echo $( head -6 POSCAR|tail -1|awk '$(value)=$(value)" "$(value) ' value="$value" ))
number=$( echo $( head -7 POSCAR|tail -1|awk '$(value)="1" " " "1" ' value="$value" ))
echo -e "$(sed "6c${name}" POSCAR)">POSCAR
echo -e "$(sed "7c${number}" POSCAR)">POSCAR
echo "Written POSCAR!"
break
fi
done

##################generat POTCAR for DFT############################
rm POTCAR
cat>INPUT!
vaspkit < INPUT
rm INPUT
################################DFT STATE##############################
mkdir ${filename_dft}
cd ${filename_dft}
cp ../INCAR ../POSCAR ../POTCAR ../KPOINTS ./
##run##
bash ../run.wsy
cd ..
#########################################################################
#calculation DFT
#calculate U_{eff}
mkdir "2-NCSF+SCF"
cd "2-NCSF+SCF"
for i in $(seq ${MIN} ${STEP} ${MAX})
do
mkdir -- "$i"
cd -- $i
mkdir ${filename_NCSF_SCF_1} ${filename_NCSF_SCF_2}
### 2-/
cp ../../INCAR ../../POSCAR ../../POTCAR ../../KPOINTS ${filename_NCSF_SCF_1}
cp ../../INCAR ../../POSCAR ../../POTCAR ../../KPOINTS ${filename_NCSF_SCF_2}
####
cd ${filename_NCSF_SCF_1}
echo "ICHARG=11">>INCAR
cd ../${filename_NCSF_SCF_2}
echo "ICHARG=1">>INCAR
cd ../../

done
echo -e "$finish"
fi
########################################
########################################
if (( ${arg}==2 ));then
arg2=$(echo $(head -1 input.wsy|awk '{print $1}'))
arg3=$( echo $(head -2 input.wsy|tail -1|awk '{print $1}'))
######################################################################
cd ${filename_NCSF_SCF}
#1
for file in $(seq ${MIN} ${STEP} ${MAX})
do
cd -- ${file}
#2
for items in 1 2
do
if (( $items==1 ));then
cd ${filename_NCSF_SCF_1}
#copy CHGCAR AND WAVECAR TO 2 3
cp ../../../${filename_dft}/CHGCAR ./
cp ../../../${filename_dft}/WAVECAR ./
else
cd ${filename_NCSF_SCF_2}
#copy CHGCAR AND WAVECAR TO 2 3
cp ../../../${filename_dft}/CHGCAR ./
cp ../../../${filename_dft}/WAVECAR ./
fi
#Calculate the number of element types

Num_ELE=$(awk -F ' ' '{print NF}' POSCAR|head -7|tail -1|awk '{printf "%d",$1}')
num=0
############################################
#3
for ((i=1;i>INCAR
echo "written INCAR!"

##########################run##########################
bash ../../../run.wsy

break
fi
#######################################################################
#######################################################################
if (( $num<span style="color: #d19a66;line-height: 26px;"$arg2/span ));span style="color: #c678dd;line-height: 26px;"then/span brbrspan style="color: #e6c07b;line-height: 26px;"continue/spanbrspan style="color: #c678dd;line-height: 26px;"fi/spanbrbrspan style="color: #c678dd;line-height: 26px;"done/spanbrspan style="color: #5c6370;font-style: italic;line-height: 26px;"#3 /spanbrspan style="color: #e6c07b;line-height: 26px;"cd/span ..brspan style="color: #5c6370;font-style: italic;line-height: 26px;"# 2-3/spanbrspan style="color: #c678dd;line-height: 26px;"done/span brspan style="color: #e6c07b;line-height: 26px;"cd/span ..brspan style="color: #c678dd;line-height: 26px;"done/span brspan style="color: #e6c07b;line-height: 26px;"cd/span ..brbrspan style="color: #e6c07b;line-height: 26px;"echo/span -e span style="color: #98c379;line-height: 26px;""span style="color: #d19a66;line-height: 26px;"$finish/span"/spanbrbrspan style="color: #c678dd;line-height: 26px;"fi/spanbrbrspan style="color: #5c6370;font-style: italic;line-height: 26px;"###########################################################################/spanbrspan style="color: #c678dd;line-height: 26px;"if/span (( span style="color: #d19a66;line-height: 26px;"${arg}/span==3 ));span style="color: #c678dd;line-height: 26px;"then/spanbr item=0br atoms_num=$(span style="color: #e6c07b;line-height: 26px;"echo/span $(head -1 input.wsy|awk span style="color: #98c379;line-height: 26px;"'{print $1}'/span))br orbit=$( span style="color: #e6c07b;line-height: 26px;"echo/span $(head -2 input.wsy|tail -1|awk span style="color: #98c379;line-height: 26px;"'{print $1}'/span))brspan style="color: #5c6370;font-style: italic;line-height: 26px;"#######################CHG-DFT################################################/spanbrspan style="color: #e6c07b;line-height: 26px;"cd/span -- span style="color: #d19a66;line-height: 26px;"${filename_dft}/spanbr chgDFT=`grep -$((atoms_num+3)) span style="color: #98c379;line-height: 26px;""total charge"/span OUTCAR|tail -1|awk span style="color: #98c379;line-height: 26px;"'{print $((E+2))}'/span E=span style="color: #98c379;line-height: 26px;""span style="color: #d19a66;line-height: 26px;"$orbit/span"/span `brspan style="color: #e6c07b;line-height: 26px;"cd/span ..brspan style="color: #5c6370;font-style: italic;line-height: 26px;"#echo "sorry,unfinished!"/spanbrspan style="color: #e6c07b;line-height: 26px;"echo/span span style="color: #98c379;line-height: 26px;""U "/spanspan style="color: #98c379;line-height: 26px;"" DFT "/span span style="color: #98c379;line-height: 26px;"" NSCF "/span span style="color: #98c379;line-height: 26px;"" SCF "/span >output.wsy
for i in $(seq ${MIN} ${STEP} ${MAX})
do
item=$((item+=1))
cd ${filename_NCSF_SCF}
cd -- $i
#######################CHG-NSCF################################################
cd -- ${filename_NCSF_SCF_1}
chgNSCF=`grep -$((atoms_num+3)) "total charge" OUTCAR|tail -1|awk '{print $((E+2))}' E="$orbit" `
#######################CHG-SCF#################################################
cd -- ../${filename_NCSF_SCF_2}
chgSCF=`grep -$((atoms_num+3)) "total charge" OUTCAR|tail -1|awk '{print $((E+2))}' E="$orbit" `

if [ $(bc >output.wsy
done
echo "Ueff: " "$Ueff" >>output.wsy

echo -e "$finish"
cat output.wsy
fi
页: [1]
查看完整版本: 基于Shell+VASP实现主动计算DFT+U中的U值(附源代码)