#!/bin/bash

SCRIPTDir=$TkPerlDir/VASP/script
VASPDir=$TkPerlDir/VASP
CMD="/usr/bin/perl $VASPDir/VASP.pl"
ConvergenceCMD="/usr/bin/perl $VASPDir/Convergence.pl"

#Header=Al
Header=`$ConvergenceCMD --Action=PrintFileName .`
BaseDir=`pwd`
TemplateDir=`pwd`

PBE96DoVASP=DoVASP.sh
PBE96DoVASPNew=DoVASP-new.sh
PBE96VASPCommand=./$PBE96DoVASP
PBE96DoVASPTemplate=$TemplateDir/DoVASP.sh
#PBE96DoVASPTemplate=$TemplateDir/DoVASP-Template.sh
aKHistoryFile=$BaseDir/History-aK.txt
ENCUTHistoryFile=$BaseDir/History-ENCUT.txt
NBNADSHistoryFile=$BaseDir/History-NBANDS.txt

DoPBE96=1

#============================
# Global parameters
#============================
nCPU=16

CIFFile=auto
SpinPolarized=Yes
UseConventionalCell=No
UseRecommendedPOTCAR=0
Functional=PAW_PBE54
#Functional=PAW_LDA54

ALGO=All
Precision=High
EDIFF=1.0e-4
EDIFFG=1.0e-3

GammaOnly=0
ISMEAR=-5
SIGMA=0.100

PStress=0.0
BandKPoints1=File
BandKPoints2=GY
BandKPoints3=GZ

DoSendMail=0
MakeFilesFromCIF=1
BackUpOriginal=0
DoMD=0
DoVCRelaxRough=0
DoVCRelax=0
ChangeNBANDS=0
ChangeNELECT=0
DoDFTSCF=1
if [ "$HybridFunctional" = "" ]; then
	DoDFTSCF=0
fi
DoSCF=1
CalculateDOS=0
CalculateBand=0
CalculateElectronDensity=0
CalculatePhonon=0
DoPhonopy=0
CalculateIR=0
CalculateRaman=0
MakeSummary=1
DeleteExtraFiles=1
DeleteLargeFiles=1

#============================
# Control parameters
#============================
post=

NBANDS0=
#NBANDS0=16

ENCUTEPS=0.010
kPointEPS=0.010
NBANDSEPS=0.010

CheckaK=1
nkx2=1
nky2=1
nkz2=1
CheckENCUT=1
CheckNBANDS=1

#aKList="1.0 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0 5.5 6.0 6.5 7.0 7.5 8.0 8.5 9.0 9.5 10.0"
aKList="2.5 3.0 3.5 4.0 4.5 5.0 5.5 6.0 6.5 7.0 7.5 8.0 8.5 9.0 9.5 10.0"
#ENCUTList="200 300 400 500 600 700 800 900 1000"
ENCUTList="400 500 600 700 800 900 1000"

#============================
# Functions
#============================
function ModifyScript
{
	local Template=$1
	local OutFile=$2
	local Options=$3
	local nkx=$4
	local nky=$5
	local nkz=$6
	local ENCUT=$7
	local NBANDS=$8

	sed \
	    -e "s/^ *nCPU=.*$/nCPU=$nCPU/g" \
	    -e "s/^ *CIFFile=.*$/CIFFile=$CIFFile/g" \
	    -e "s/^ *SpinPolarized=.*$/SpinPolarized=$SpinPolarized/g" \
	    -e "s/^ *UseConventionalCell=.*$/UseConventionalCell=$UseConventionalCell/g" \
	    -e "s/^ *UseRecommendedPOTCAR=.*$/UseRecommendedPOTCAR=$UseRecommendedPOTCAR/g" \
	    -e "s/^ *Functional=.*$/Functional=$Functional/g" \
	    -e "s/^ *HybridFunctional=.*$/HybridFunctional=/g" \
	    -e "s/^ *ALGOCommon=.*$/ALGOCommon=$ALGO/g" \
	    -e "s/^ *PrecisionCommon=.*$/PrecisionCommon=$Precision/g" \
	    -e "s/^ *EDIFF=.*$/EDIFF=$EDIFF/g" \
	    -e "s/^ *EDIFFG=.*$/EDIFFG=$EDIFFG/g" \
	    -e "s/^ *GammaOnlyCommon=.*$/GammaOnlyCommon=$GammaOnly/g" \
	    -e "s/^ *aKProductCommon=.*$/aKProductCommon=fix:$nkx,$nky,$nkz/g" \
	    -e "s/^ *ISMEARCommon=.*$/ISMEARCommon=$ISMEAR/g" \
	    -e "s/^ *SIGMACommon=.*$/SIGMACommon=$SIGMA/g" \
	    -e "s/^ *PStress=.*$/PStress=$PStress/g" \
	    -e "s/^ *BandKPoints1Common=.*$/BandKPoints1Common=$BandKPoints1/g" \
	    -e "s/^ *BandKPoints1=.*$/BandKPoints1=$BandKPoints1/g" \
	    -e "s/^ *BandKPoints2=.*$/BandKPoints2=$BandKPoints2/g" \
	    -e "s/^ *BandKPoints3=.*$/BandKPoints3=$BandKPoints3/g" \
	    -e "s/^ *DoSendMail=.*$/DoSendMail=$DoSendMail/g" \
	    -e "s/^ *MakeFilesFromCIF=.*$/MakeFilesFromCIF=$MakeFilesFromCIF/g" \
	    -e "s/^ *BackUpOriginal=.*$/BackUpOriginal=$BackUpOriginal/g" \
	    -e "s/^ *DoMD=.*$/DoMD=$DoMD/g" \
	    -e "s/^ *DoVCRelaxRough=.*$/DoVCRelaxRough=$DoVCRelaxRough/g" \
	    -e "s/^ *DoVCRelax=.*$/DoVCRelax=$DoVCRelax/g" \
	    -e "s/^ *ChangeNBANDS=.*$/ChangeNBANDS=$ChangeNBANDS/g" \
	    -e "s/^ *ChangeNELECT=.*$/ChangeNELECT=$ChangeNELECT/g" \
	    -e "s/^ *DoDFTSCF=.*$/DoDFTSCF=$DoDFTSCF/g" \
	    -e "s/^ *DoSCF=.*$/DoSCF=$DoSCF/g" \
	    -e "s/^ *CalculateDOS=.*$/CalculateDOS=$CalculateDOS/g" \
	    -e "s/^ *CalculateBand=.*$/CalculateBand=$CalculateBand/g" \
	    -e "s/^ *CalculateElectronDensity=.*$/CalculateElectronDensity=$CalculateElectronDensity/g" \
	    -e "s/^ *CalculatePhonon=.*$/CalculatePhonon=$CalculatePhonon/g" \
	    -e "s/^ *DoPhonopy=.*$/DoPhonopy=$DoPhonopy/g" \
	    -e "s/^ *CalculateIR=.*$/CalculateIR=$CalculateIR/g" \
	    -e "s/^ *CalculateRaman=.*$/CalculateRaman=$CalculateRaman/g" \
	    -e "s/^ *DeleteExtraFiles=.*$/DeleteExtraFiles=$DeleteExtraFiles/g" \
	    -e "s/^ *DeleteLargeFiles=.*$/DeleteLargeFiles=$DeleteLargeFiles/g" \
	    -e "s/^ *AdditionalParameters=.*$/AdditionalParameters=\"$Options\"/g" \
	    	$Template > $OutFile
}

function SendMail
{
	local EMail=$1
	local SMTPServer=$2
	local MailerName=$3
	local Domain=$4
	local From=$5
	local Title=$6
	local Subject=$7

	if [ "$DoSendMail" = "1" -a "$EMail" != "" ]; then
		echo ' '
		echo '================================================================'
		echo "  Send notification e-mail to [$EMail]"
		echo '================================================================'
		perl $TkPerlDir/Mail/SendMail.pl --SMTPServer=$SMTPServer \
						 --MailerName=$MailerName --Domain=$Domain \
						 --WorkDir=`pwd` --HostName="$HostName" \
						 --To=$EMail --From=$From \
						 --Title=$Title --Subject="$Subject"
	fi
}

function PrintError()
{
	local Message1=$1
	local Message2=$2
	local DoExit=$3
	
	echo " "
	echo "Error: $Message1"
	echo $Message2

	if [ "$DoExit" = "1" ]; then
	  echo Stop.
	  exit
	fi
	
	return $DoExit
}

#===========================
# Calculate all
#===========================

OriginalDir=`pwd`

mkdir $BaseDir

#===============================
# Convergence for aKProduct
#===============================
rm $aKHistoryFile

if [ "$CheckaK" = "1" ]; then

PrevPBE96Dir=
aKPrev1=
aKPrev2=

for aK in $aKList
do
	if [ -f STOP.`hostname` ]; then
		exit -1
	fi

	nkx=`$ConvergenceCMD --Action=Printnkx --aKProduct=$aK .`
	nky=`$ConvergenceCMD --Action=Printnky --aKProduct=$aK .`
	nkz=`$ConvergenceCMD --Action=Printnkz --aKProduct=$aK .`

	PBE96WorkDir=$BaseDir/${Header}-$Functional-nK${nkx}x${nky}x${nkz}
	echo Working in $PBE96WorkDir for aK=$aK...

	if [ $DoPBE96 -eq 1 ]; then
		if [ -d $PBE96WorkDir ]; then
			echo [$PBE96WorkDir] exists.
			echo Skip PBE96.
		else
			mkdir $PBE96WorkDir
			cd $PBE96WorkDir

			cp $TemplateDir/{hosts,*.cif,*.klist,*.ini} $PBE96WorkDir

			Options="--Param:LREAL=Auto"
			ModifyScript "$PBE96DoVASPTemplate" "$PBE96WorkDir/$PBE96DoVASP" \
				"$Options" \
				"$nkx" "$nky" "$nkz"

			chmod +x $PBE96WorkDir/*.sh
#			$PBE96VASPCommand init

			echo === Working in \"`pwd`\"
			echo === Files in \"`pwd`\"
			ls

			echo ''
			echo === Execute [$PBE96VASPCommand]
			$PBE96VASPCommand

			echo ''
			echo === Exit to \"$OriginalDir\"
			cd $OriginalDir
		fi

		CMD="$ConvergenceCMD --Action=AddHistory --aKProduct=$aK --nkx=$nkx --nky=$nky --nkz=$nkz \
				$PBE96WorkDir $aKHistoryFile"
#		echo AddHistory CMD=[$CMD]
		$CMD

		CMD="$ConvergenceCMD --Action=CheckConvergence --EPS=$kPointEPS $aKHistoryFile"
#		echo Check Convergence CMD=[$CMD]
		$CMD
		ret=$?

		if [ "$ret" = "0" ]; then
			nkx2=`$ConvergenceCMD --Action=Printnkx --aKProduct=$aKPrev2 .`
			nky2=`$ConvergenceCMD --Action=Printnky --aKProduct=$aKPrev2 .`
			nkz2=`$ConvergenceCMD --Action=Printnkz --aKProduct=$aKPrev2 .`
			break
		fi

		PrevPBE96Dir=$PBE96WorkDir
		aKPrev2=$aKPrev1
		aKPrev1=$aK
	fi

	if [ "$NBANDS0" = "" ]; then
		NBANDS0=`$ConvergenceCMD --Action=PrintNVEL $PrevPBE96Dir`
	fi

	echo ''
done

cat $aKHistoryFile
echo ''
echo "converged at aK=$aKPrev2 ($nkx2,$nky2,$nkz2) in dE=$kPointEPS."
echo ''

fi

#===============================
# Convergence for ENCUT
#===============================
rm $ENCUTHistoryFile

if [ "$CheckENCUT" = "1" ]; then

PrevPBE96Dir=
PrevPBE96Dir=
ENCUTPrev1=
ENCUTPrev2=

for ENCUT in $ENCUTList
do
	if [ -f STOP.`hostname` ]; then
		exit -1
	fi

	PBE96WorkDir=$BaseDir/${Header}-$Functional-nK${nkx2}x${nky2}x${nkz2}-ENCUT$ENCUT
	echo Working in $PBE96WorkDir for ENCUT=$ENCUT...

	if [ $DoPBE96 -eq 1 ]; then
		if [ -d $PBE96WorkDir ]; then
			echo [$PBE96WorkDir] exists.
			echo Skip PBE96.
		else
			mkdir $PBE96WorkDir
			cd $PBE96WorkDir

			cp $TemplateDir/{hosts,*.cif,*.klist,*.ini} $PBE96WorkDir

			Options="--Param:LREAL=Auto --ENCUT=$ENCUT"
			ModifyScript "$PBE96DoVASPTemplate" "$PBE96WorkDir/$PBE96DoVASP" \
				"$Options" \
				"$nkx2" "$nky2" "$nkz2"

			chmod +x $PBE96WorkDir/*.sh
#			$PBE96VASPCommand init

			echo === Working in \"`pwd`\"
			echo === Files in \"`pwd`\"
			ls

			echo ''
			echo === Execute [$PBE96VASPCommand]
			$PBE96VASPCommand

			echo ''
			echo === Exit to \"$OriginalDir\"
			cd $OriginalDir
		fi

		CMD="$ConvergenceCMD --Action=AddHistory --ENCUT=$ENCUT --aKProduct=$aKPrev2 --nkx=$nkx2 --nky=$nky2 --nkz=$nkz2 \
				$PBE96WorkDir $ENCUTHistoryFile"
		echo CMD=[$CMD]
		$CMD

		$ConvergenceCMD --Action=CheckConvergence --EPS=$ENCUTEPS $ENCUTHistoryFile
		ret=$?

		if [ "$ret" = "0" ]; then
			break
		fi

		PrevPBE96Dir=$PBE96WorkDir
		ENCUTPrev2=$ENCUTPrev1
		ENCUTPrev1=$ENCUT
	fi

	if [ "$NBANDS0" = "" ]; then
		NBANDS0=`$ConvergenceCMD --Action=PrintNVEL $PrevPBE96Dir`
	fi

	echo ''
done

cat $ENCUTHistoryFile
echo ''
echo "converged at ENCUT=$ENCUTPrev2 in dE=$ENCUTEPS."
echo ''

fi

#===============================
# Convergence for NBANDS
#===============================
rm $NBNADSHistoryFile

if [ "$CheckNBANDS" = "1" ]; then

PrevPBE96Dir=
NBANDSPrev1=
NBANDSPrev2=

NBANDS=$NBANDS0
NBANDS=`expr $NBANDS \* 14 / 10`
for i in $(seq 1 20)
do
	if [ -f STOP.`hostname` ]; then
		exit -1
	fi

#	echo i=$i before: Current NBANDS=$NBANDS NBANDS2=$NBANDS2
	if [ "$NBANDS"!="" ]; then
		echo ''
	else
		NBANDS=0
	fi
#	echo i=$i before2: Current NBANDS=$NBANDS NBANDS2=$NBANDS2
	NBANDS2=`expr $NBANDS / $nCPU \* $nCPU`
	if [ $NBANDS2 -eq 0 ]; then
		NBANDS2=$nCPU
		NBANDS=$NBANDS2
	fi
#	echo i=$i before: New NBANDS=$NBANDS NBANDS2=$NBANDS2

	PBE96WorkDir=$BaseDir/${Header}-$Functional-nK${nkx2}x${nky2}x${nkz2}-ENCUT$ENCUTPrev2-NBANDS$NBANDS2
	echo Working in $PBE96WorkDir for aK=$aK...

	if [ $DoPBE96 -eq 1 ]; then
		if [ -d $PBE96WorkDir ]; then
			echo [$PBE96WorkDir] exists.

			echo Skip PBE96.
		else
			mkdir $PBE96WorkDir
			cd $PBE96WorkDir

			cp $TemplateDir/{hosts,*.cif,*.klist,*.ini} $PBE96WorkDir

			Options="--Param:LREAL=Auto --ENCUT=$ENCUTPrev2 --NBANDS=$NBANDS2"
			ModifyScript "$PBE96DoVASPTemplate" "$PBE96WorkDir/$PBE96DoVASP" \
				"$Options" \
				"$nkx2" "$nky2" "$nkz2"

			chmod +x $PBE96WorkDir/*.sh
#			$PBE96VASPCommand init

			echo === Working in \"`pwd`\"
			echo === Files in \"`pwd`\"
			ls

			echo ''
			echo === Execute [$PBE96VASPCommand]
			$PBE96VASPCommand

			echo ''
			echo === Exit to \"$OriginalDir\"
			cd $OriginalDir
		fi

		CMD="$ConvergenceCMD --Action=PrintNBANDS $PBE96WorkDir"
		NBANDSNew=`$CMD`
#echo N=$NBANDSNew $NBANDSPrev1
		
		if [ "$NBANDSNew" != "$NBANDSPrev1" ]; then
#			PBE96WorkDirNew=$BaseDir/${Header}-PBE96-nK${nkx2}x${nky2}x${nkz2}-ENCUT$ENCUT-NBANDS$NBANDSNew
#			if [ "$PBE96WorkDirNew" != "PBE96WorkDir" ]; then
#				mv $PBE96WorkDir $PBE96WorkDirNew
#			fi

			CMD="$ConvergenceCMD --Action=AddHistory --ENCUT=$ENCUTPrev2 \
					--aKProduct=$aKPrev2 --nkx=$nkx2 --nky=$nky2 --nkz=$nkz2 \
					--NBANDS=$NBANDSNew \
					$PBE96WorkDir $NBNADSHistoryFile"
#			echo AddHistory CMD=[$CMD]
			$CMD

			CMD="$ConvergenceCMD --Action=CheckConvergence --EPS=$NBANDSEPS $NBNADSHistoryFile"
#			echo Check Convergence CMD=[$CMD]
			$CMD
			ret=$?

			if [ "$ret" = "0" ]; then
				break
			fi

			PrevPBE96Dir=$PBE96WorkDir
			NBANDSPrev2=$NBANDSPrev1
			NBANDSPrev1=$NBANDSNew
#echo [$NBANDSNew] [$NBANDSPrev1] [$NBANDSPrev2]
		fi
	fi

	echo ''

#	echo i=$i Current NBANDS=$NBANDS
	NBANDS=`expr $NBANDS \* 12 / 10`
#	echo i=$i New NBANDS=$NBANDS
done

cat $NBNADSHistoryFile
echo ''
echo "converged at NBANDS=$NBANDSPrev2 in dE=$NBANDSEPS."
echo ''

fi

echo "Create $PBE96DoVASPNew"
echo ''

Options="--Param:ENCUT=$ENCUTPrev2 --NBANDS=$NBANDSPrev2"
ModifyScript "$PBE96DoVASPTemplate" "$PBE96DoVASPNew" \
	"$Options" \
	"$nkx2" "$nky2" "$nkz2"
