All you need to get going is a vasp.in file with the RELAXED structure in it, as well as comp.config and fitfc.config files. Typical usage: autophonon > log.out This will just show you progress and not actually launch any jobs automatically. To do that, autophonon run > log.out comp.config file: # job identifier (careful, don't make it longer than 2 or 3 characters!) FO # nodes to use for relaxation 1 # number of cpus to use for relaxation 2 # walltime to use for relaxation 8 # nodes to use for static calculations 1 # number of cpus to use for static calculations 4 # walltime to use for static calculations 16 fitfc.config file: # Format: value for er, then ns, then ms, then dr 5 3 0.04 0.1 autophonon script: #!/bin/sh function cleanhouse { echo "Cleaning old files..." foreachfile vasp.in rm OSZICAR OUTCAR *.q str_relax.out &> /dev/null foreachfile -d 2 vasp.in rm OSZICAR OUTCAR *.q str_relax.out &> /dev/null } function jobsub { jobname=$1 jobtype=$2 if [ $jobtype = "relax" ]; then sed -e '/ISIF/d' INCAR > INCAR.new echo "ISIF = 4" >> INCAR.new mv INCAR.new INCAR else sed -e '/ISIF/d' INCAR > INCAR.new echo "ISIF = 2" >> INCAR.new mv INCAR.new INCAR sed -e '/IBRION/d' INCAR > INCAR.new echo "IBRION = -1" >> INCAR.new mv INCAR.new INCAR sed -e '/NSW/d' INCAR > INCAR.new echo "NSW = 0" >> INCAR.new mv INCAR.new INCAR sed -e '/ISMEAR/d' INCAR > INCAR.new echo "ISMEAR = -5" >> INCAR.new mv INCAR.new INCAR sed -e '/ALGO/d' INCAR > INCAR.new echo "ALGO = FAST" >> INCAR.new mv INCAR.new INCAR fi if [ $jobtype = "relax" -o $jobtype = "volstatic" ]; then makeqfile $jobname $relaxnodes $relaxcpu $relaxtime else makeqfile $jobname $staticnodes $staticcpu $statictime fi qsub $jobname.q sleep 10 } function statuscheck { jobname=$1 jobtype=$2 user=`whoami` if [ -e OSZICAR ]; then tail -1 OSZICAR else echo "No OSZICAR; this step has not made any progress" fi if [ "$runmode" = "run" ]; then queuestatus=`qstat | grep $user | grep $jobname` if [ "$queuestatus" ]; then echo "Job $jobname is running" echo $queuestatus else echo "Job $jobname is not running" jobsub $jobname $jobtype fi fi } function printenergy { file=$1 grep TOTEN $1 | tail -1 } function relax1check { vol=$1 if [ -e OUTCAR.relax1 ]; then echo "vol_$vol is done with the first relaxation!" printenergy OUTCAR.relax1 elif [ -e OUTCAR ] && grep -q "required accuracy" OUTCAR && [ ! -e OUTCAR.relax1 ]; then sleep 30 mv OUTCAR OUTCAR.relax1 mv OSZICAR OSZICAR.relax1 cp INCAR INCAR.relax1 cp CONTCAR POSCAR elif [ ! -e OUTCAR.relax1 ]; then echo "vol_$vol first relaxation in progress" statuscheck "$id"v"$vol"r1 relax fi } function relax2check { vol=$1 if [ -e OUTCAR.relax2 ]; then echo "vol_$vol is done with the second relaxation!" printenergy OUTCAR.relax2 elif [ -e OUTCAR ] && [ -e OUTCAR.relax1 ] && grep -q "required accuracy" OUTCAR; then sleep 30 mv OUTCAR OUTCAR.relax2 mv OSZICAR OSZICAR.relax2 cp INCAR INCAR.relax2 cp CONTCAR POSCAR elif [ -e OUTCAR.relax1 ]; then echo "vol_$vol second relaxation in progress" statuscheck "$id"v"$vol"r2 relax fi } function volstatic { vol=$1 volindex=$2 if [ -e OUTCAR.static ]; then echo "vol_$vol is done with its static calculation" printenergy OUTCAR.static let volindex=$volindex+1 if [ ! -e str_relax.out ]; then extract_vasp fi elif [ -e OUTCAR ] && [ -e OUTCAR.relax2 ] && grep -q "aborting loop" OUTCAR; then sleep 30 mv OUTCAR OUTCAR.static mv OSZICAR OSZICAR.static cp INCAR INCAR.static elif [ -e OUTCAR.relax2 ]; then echo "vol_$vol static calculation in progress" statuscheck "$id"v"$vol"st volstatic fi return $[$volindex] } function staticcheck { vol=$1 staticindex=0 staticdone=0 for file in $(ls); do if [ -d $file ]; then echo "Checking static calculation directory $file" cd $file if [ -e OUTCAR.static ]; then echo "$file static calculation is done!" let staticdone=$staticdone+1 printenergy OUTCAR.static if [ ! -e str_relax.out ]; then extract_vasp fi elif [ -e OUTCAR ] && grep -q "aborting loop" OUTCAR; then sleep 30 mv OUTCAR OUTCAR.static mv OSZICAR OSZICAR.static cp INCAR INCAR.static elif [ -e ../OUTCAR.relax2 ]; then echo "$file static calculation in progress" statuscheck "$id"v"$vol"s"$staticindex" static cd .. fi let staticindex=$staticindex+1 fi done return $[$staticindex-$staticdone] } # get necessary variables runmode=$1 erval=`sed -n '2p' fitfc.config` nsval=`sed -n '3p' fitfc.config` msval=`sed -n '4p' fitfc.config` drval=`sed -n '5p' fitfc.config` id=`sed -n '2p' comp.config` relaxnodes=`sed -n '4p' comp.config` relaxcpu=`sed -n '6p' comp.config` relaxtime=`sed -n '8p' comp.config` staticnodes=`sed -n '10p' comp.config` staticcpu=`sed -n '12p' comp.config` statictime=`sed -n '14p' comp.config` # set up str.out and str_relax.out files function str_out { rm str.out sed -e '/./{H;$!d;}' -e 'x;/POSCAR/!d;' vasp.in | sed 's/^[ \t]*//' > tmp sed -n '5,7p' tmp > str.out latparam=`sed -n '4p' tmp | sed 's/^[ \t]*//'` cat >> str.out << EOF $latparam 0 0 0 $latparam 0 0 0 $latparam EOF sed '1,8d' tmp >> str.out rm tmp cp str.out str_relax.out } # set up vasp.wrap file function vasp_wrap { sed '/POSCAR/,$d' vasp.in > vasp.wrap } # get list of the volume folders ATAT creates function getvollist { i=1 for file in $(ls); do if echo $file | grep vol_; then vollist[i]=`echo $file` fi done echo $vollist } # Function to generate a queue file for encina # $1: name of .q file; $2: ncpus; $3: walltime function makeqfile { if [ `hostname` == "encina" ]; then cat > $1.q << EOF #PBS -l ncpus=$3 #PBS -l walltime=$4:00:00 cd $`echo PBS_O_WORKDIR` echo Running on host \`hostname\` echo Time is \`date\` echo Directory is \`pwd\` echo "" mpirun -np $3 /usr/local/bin/vasp EOF elif [ `hostname` == "master.cl.northwestern.edu" ]; then cat > $1.q << EOF #PBS -l nodes=$2:ppn=$3 #PBS -l walltime=$4:00:00 # This job's working directory # echo Working directory is $`echo PBS_O_WORKDIR` cd $`echo PBS_O_WORKDIR` echo "" echo Running on host \`hostname\` echo Time is \`date\` echo Directory is \`pwd\` echo This jobs runs on the following processors: echo \`cat $`echo PBS_NODEFILE`\` # Define number of processors NPROCS=\`wc -l < $`echo PBS_NODEFILE`\` echo This job has allocated $`echo NPROCS` nodes echo "" echo ========================================================================== echo "" mpirun -machinefile $`echo PBS_NODEFILE` -np $`echo NPROCS` /usr/local/bin/vasp EOF fi } # if runmode is "run", submit jobs; otherwise, just print status function getnewcalcs { fitfc -er=$erval -ns=$nsval -ms=$msval -dr=$drval sleep 10 foreachfile str.out str2ezvasp foreachfile -d 2 str.out str2ezvasp foreachfile vasp.in ezvasp -n vasp.in foreachfile -d 2 vasp.in ezvasp -n vasp.in } # main body of script cleanhouse str_out vasp_wrap getnewcalcs vollist=`getvollist` while [ 1 ]; do sleep 15 voldone=0 staticremaining=0 for i in $vollist; do echo "Checking $i..." cd $i relax1check $i relax2check $i volstatic $i $voldone voldone=$? dirs_here=`ls -l | egrep '^d'` # prepare static calculations if all volumes are done and they do not already exist if [ "$voldone" == "$nsval" ] && [ ! "$dirs_here" ]; then cd .. getnewcalcs fi staticcheck $i let staticremaining=$staticremaining+$? cd .. done if [ "$voldone" == "$nsval" ] && [ "$staticremaining" == "0" ] && ls vol_0 | grep p+; then echo "Phonon calculation complete!" break fi echo "$voldone of $nsval volume calculations complete" echo "$staticremaining static calculations remaining" echo "*****************************************" done |