2014-05-21 08:54:04
VASP的使用方法设计的缺陷很大, 如果只是简单算个东西, 倒也可以, 若是想大规模使用, 成千上百的文件, 都有着一样的名字, 看了不疯才怪. 所以, 我们需要一个脚本, 将VASP计算的流程进行改造. 改造的原则是支持不同文件名, 且不同文件之间可任意组合.
创建赝势文件POTCAR
的脚本
- 整理好四种赝势文件,
uspp.LDA
,uspp.GGA
,paw.LDA
,paw.GGA
,paw.PBE
, 将其分别放于与名称相应的文件夹下, 再将这四个文件夹 放在名称为POT
的文件夹下 - 下面的脚本用来提取创建
POTCAR
# Language: bash
POTROOT=$1; shift
usage="CatPot \<Type\> \<Elements...\>
Type: uspp.LDA | uspp.GGA | paw.LDA | paw.GGA | paw.PBE"
[[ $# -lt 2 ]] && { echo "$usage"; exit; }
Type=$1; shift
echo -n >POTCAR
for i in $*; do
zcat ${POTROOT}/${Type}/$i/POTCAR >> POTCAR
done
grep -A 21 VRHFIN POTCAR
运行作业脚本
vasp运行需要四种输入文件, INCAR
, KPOINTS
, POSCAR
, POTCAR
, 且不能是其他名字, 程序也没提供选项指定其他名字.
彻底的解决方法是修改源代码, 困难不大, 但不建议. 除此之外可以使用一个脚本,
先将文件改名, 复制至作业运行目录下, 运行vasp, 完成后复制输出文件至原目录, 再将输出文件更名.
我的解决办法是参照GROMACS的运行方式, 先利用这四个文件产生一个总的输入文件, 然后运行这个.ikp文件即可. ikp文件的内容很简单, 里面写好使用的四个文件的绝对路径, 脚本运行时根据路径复制文件, 运行vasp.
# Language: bash
function vsp_ikp {
usage="\
>>>>>>>>>>>>>>>> vsp_ikp <<<<<<<<<<<<<<<<
>>>>>>>>>>>>>>>> Jicun Li <<<<<<<<<<<<<<<<
>>>>>>>>>> 2014-05-21 10:12:32 <<<<<<<<<
>>Usage: vsp_ikp [File.in] [File.kpt] [File.pos] [File.pot] [Out.ikp]"
echo "$usage"
local Fin Fkpt Fpos Fpot Fout
PWD=$(pwd)
Fin=INCAR; Fkpt=KPOINTS; Fpos=POSCAR; Fpot=POTCAR; Fout=vsp.ikp
opt=($@); N=${#opt[@]}
for((i=0; i<N; i++)); do
arg=${opt[$i]##*\.}
[[ $arg =~ in ]] && { Fin=${opt[$i]}; }
[[ $arg =~ kpt ]] && { Fkpt=${opt[$i]}; }
[[ $arg =~ pos ]] && { Fpos=${opt[$i]}; }
[[ $arg =~ pot ]] && { Fpot=${opt[$i]}; }
[[ $arg =~ ikp ]] && { Fout=${opt[$i]}; }
done
echo
echo Ouput ikp File: $Fout
echo -n >$Fout
echo INCAR: $PWD/$Fin >> $Fout
echo KPOINTS: $PWD/$Fkpt >> $Fout
echo POSCAR: $PWD/$Fpos >> $Fout
echo POTCAR: $PWD/$Fpot >> $Fout
}
function vsp_run {
usage="\
>>>>>>>>>>>>>>>> vsp_run <<<<<<<<<<<<<<<<
>>>>>>>>>>>>>>>> Jicun Li <<<<<<<<<<<<<<<<
>>>>>>>>>> 2014-05-21 10:12:32 <<<<<<<<<
>>Usage: vsp_run [-cpu Ncpu]"
[[ $# -lt 1 ]] && { echo "$usage"; exit; }
File=${1%\.*}; Fout=$File
Ncpu=4 #$(cat /proc/cpuinfo | grep "processor" | wc)
[[ $# -ge 3 ]] && { Ncpu=$3; }
Fin=$( grep INCAR $File.ikp | sed 's/INCAR://')
Fkpt=$(grep KPOINTS $File.ikp | sed 's/KPOINTS://')
Fpos=$(grep POSCAR $File.ikp | sed 's/POSCAR://')
Fpot=$(grep POTCAR $File.ikp | sed 's/POTCAR://')
cp $Fin ./INCAR
cp $Fkpt ./KPOINTS
cp $Fpos ./POSCAR
cp $Fpot ./POTCAR
Path="/home/jicun/VASP/vasp.x"
MPIRUN="/share/apps/intel/impi/4.1.0.030/intel64/bin/mpirun"
$MPIRUN -np $Ncpu -machinefile $PBS_NODEFILE $Path
}
job=$1; shift
vsp_$job $*
</code></pre>