Тема сегодня - оптимизация в VASP с констрейнутыми внутренними координатами.
Проблема состоит в том что VASP оптимизирует в декартовых (или фракционных но это спасает мало) координатах и заморозить можно только каждую координату каждого атома (чего кстати нельзя сделать например в гауссиане - нельзя позволить атому двигаться вдоль оси Х при фиксированных значениях Z и Y кроме вариантов с ну очень жуткими z-matrix, это впрочем оффтоп). А вот "оптимизировать систему удерживая расстояния А-Б равным 1.8 ангстрема, при условии что оба атома могут двигаться относительно остальных" - нельзя.
Точнее нельзя внутренними средствами VASP.
В 2005 году к VASP придумали дополнительный интерфейс,
Bučko T.; Hafner J.; Ángyán J. G. Geometry Optimization of Periodic Systems Using Internal Coordinates. J. Chem. Phys. 2005, 122, 124508.10.1063/1.1864932.
который назвали Gadget. У меня нашелся Gadget.0.96.tgz и есть ощущение что проект больше никогда не развивали.
запросы к установке у программы довольно скромные
install python.2.X
install numpy (numerical library)
сразу покажу и пример скрипта который может их комбинировать на сервере:
Код: Выделить всё
#!/bin/bash -l
#
#PBS -l nodes=4:ppn=40,walltime=24:00:00
#
#PBS -N Legion
#PBS -o pbs-$PBS_JOBID.log -j oe
#PBS -M
#PBS -m n
# first non-empty non-comment line ends PBS options
module load intel64
######################
#### VASP version ####-----------------------------------------------
######################
#vasp itself:
VASP=/adres/vasp.5.3/vasp
#gadget and python:
#PYPATH="/home/Tools/progs/python/2.7-name/bin/python" # python path (numpy library must be installed)
PYPATH="python" # python path (numpy library must be installed)
OPTPATH="$HOME/Software/vasp/ext_optimizer/Gadget.0.96" # optimizer path
####################
#### VASP FILES ####------------------------------------------------
####################
VASPFILES="*CAR KPOINTS VDW*"
GADGETFILES="INPDAT ICONST"
###########################
#### Setup Calculation ####------------------------------------------
###########################
cd $PBS_O_WORKDIR
# laufende Nummer der Rechnung ermitteln
JOB_NUMBER=0
if [ -e loopiter ] ; then JOB_NUMBER=$(cat loopiter) ; fi
let JOB_NUMBER=JOB_NUMBER+1
echo JOB_NO_PRINT = $JOB_NO_PRINT
JOB_NO_PRINT=$(printf "%03d" $JOB_NUMBER)
echo $JOB_NUMBER > loopiter
echo JOB_NO_PRINT = $JOB_NO_PRINT
JOBID_SHORT=${PBS_JOBID/.rrze.uni-erlangen.de}
##################
#### VASP run ####---------------------------------------------------
##################
# first ensure that NSW=1 in INCAR
sed -i 's/NSW.*=.*[0-9]*/NSW = 1/g' INCAR
# GADGET's prolog
NSW=$(awk 'BEGIN {FS="="} /NSW/ {print $2}' INPDAT|awk '{print $1}')
if [ "$NSW" = "" ];
then echo "Specify NSW in INPDAT!"
exit 1
fi
rm store.* hmat* UMAT
$PYPATH $OPTPATH/constwriter.py
# START
j=1
while [ $j -le $NSW ];
do
# perform gradient+energy calculation (VASP)
mpirun_rrze -pinexpr S0:0-9@S1:0-9 $VASP >> vasp-$JOB_NO_PRINT-$JOBID_SHORT.log
# check if SCF finished
vtest=$(grep F OSZICAR |wc -l)
if [ $vtest -lt 1 ]
then
echo 'VASP DID NOT TERMINATE PROPERLY!!!'
echo 'VASP DID NOT TERMINATE PROPERLY!!!' >>report
exit 1
fi
#check if SCF converged
EDIFF=$(grep 'EDIFF =' OUTCAR | awk '{print $3}')
echo "EDIFF = $EDIFF"
tail -n2 OSZICAR | awk 'NR == 1 {$4<0?x=-$4:x=$4; if (x>ediff) exit 1}' "ediff=$EDIFF"
if ! [ $? -eq 0 ]
then
echo 'SCF DID NOT CONVERGE!!!'
echo 'SCF DID NOT CONVERGE!!!' >>report
exit 1
fi
cat POSCAR >>poscars
cat OUTCAR >>outcars
cat OSZICAR >>oszicars
# perform relaxation step
$PYPATH $OPTPATH/iteration.py $j
#check if iteration was ok
if ! [ $? -eq 0 ]
then
echo 'GADGET STOPPED, SOMETHING WENT WRONG!!!'
echo 'GADGET STOPPED, SOMETHING WENT WRONG!!!' >>report
exit 1
fi
#check whether SCF converged
if (grep -E "(soft stop encountered|hard stop encountered|hard stop was set)" OUTCAR > /dev/null)
then
echo "VASP loop status: $JOBID_SHORT abgebrochen wegen manuellem VASP-Abbruch (STOPCAR)"
touch _GEOMOPT_ABBRUCH_
break
fi
test=$(head -c1 CONVERGENCE)
if [ $test -gt 0 ]
then
echo "VASP loop status: $JOBID_SHORT fertig"
touch _GEOMOPT_FERTIG_
break
fi
let j=j+1
done
# Interessante Dateien sichern
tar -c -z -f sik-$JOB_NO_PRINT-$JOBID_SHORT-$(date +%Y%m%d-%H%M%S).tar.gz \
INCAR outcars poscars CONTCAR EIGENVAL oszicars vasprun.xml
#cp -a outcars outcars-$JOB_NO_PRINT
cp -a vasprun.xml vasprun-$JOB_NO_PRINT.xml
cp -a CONTCAR CONTCAR-$JOB_NO_PRINT
cp -a report report-$JOB_NO_PRINT
####################################
#### restart if no convergence ####------------------------------------------
####################################
if (grep -E "(soft stop encountered|hard stop encountered|hard stop was set)" OUTCAR > /dev/null)
then
exit
fi
test=$(head -c1 CONVERGENCE)
if [ $test -eq 0 ]
then
echo "VASP loop status: $JOBID_SHORT respawning"
#cp CONTCAR POSCAR
qsub vasp-gadgetloop-emmy.pbs
fi
rm -f UMAT SPECCOORDINATES HMAT TBC TOPOLOGY VOLCHANGE MAXSTEP store.*
#rm -f WAVECAR
# END
этот олднумерик был удален из numpy на стыке версий 1.8 и 1.9
Поэтому вам надо скачать старый нумпи, в моем случае использовался 1.7.2rc1, и с помощью питона запустить setup.py в этой нумпи папке (в случае если на сервере то после этого запуска будет возможность указать что компилиться надо здесь же, а не где попало).
А в скрипт надо дописать PYTHONPATH включающий в себя нумпи-папку.