#!/bin/bash

nCPU=16

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

BaseDir=`pwd`
TemplateDir=`pwd`
ConvergenceDir=`pwd`/Convergence.nosearch
CheckConvergence=CheckConvergence.sh
CheckConvergenceTemplate=$TemplateDir/$CheckConvergence
DoVASP=DoVASP.sh
DoVASPTemplate=$TemplateDir/$DoVASP

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

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

ALGO=All
Precision=High
EDIFF=1.0e-4
EDIFFG=1.0e-3
Options="--Param:LREAL=.FALSE."

GammaOnly=0
ISMEAR=-5
SIGMA=0.100

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

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

kPointEPS=0.010
ENCUTEPS=0.010
NBANDSEPS=0.010

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

#============================
# 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=1/g" \
	    -e "s/^ *BackUpOriginal=.*$/BackUpOriginal=0/g" \
	    -e "s/^ *DoMD=.*$/DoMD=0/g" \
	    -e "s/^ *DoVCRelaxRough=.*$/DoVCRelaxRough=0/g" \
	    -e "s/^ *DoVCRelax=.*$/DoVCRelax=0/g" \
	    -e "s/^ *ChangeNBANDS=.*$/ChangeNBANDS=0/g" \
	    -e "s/^ *ChangeNELECT=.*$/ChangeNELECT=0/g" \
	    -e "s/^ *DoDFTSCF=.*$/DoDFTSCF=0/g" \
	    -e "s/^ *DoSCF=.*$/DoSCF=1/g" \
	    -e "s/^ *CalculateDOS=.*$/CalculateDOS=0/g" \
	    -e "s/^ *CalculateBand=.*$/CalculateBand=0/g" \
	    -e "s/^ *CalculateElectronDensity=.*$/CalculateElectronDensity=0/g" \
	    -e "s/^ *CalculatePhonon=.*$/CalculatePhonon=0/g" \
	    -e "s/^ *DoPhonopy=.*$/DoPhonopy=0/g" \
	    -e "s/^ *CalculateIR=.*$/CalculateIR=0/g" \
	    -e "s/^ *CalculateRaman=.*$/CalculateRaman=0/g" \
	    -e "s/^ *DeleteExtraFiles=.*$/DeleteExtraFiles=1/g" \
	    -e "s/^ *DeleteLargeFiles=.*$/DeleteLargeFiles=1/g" \
	    -e "s/^ *AdditionalParameters=.*$/AdditionalParameters=\"$Options\"/g" \
	    -e "s/^ *ENCUTEPS=.*$/ENCUTEPS=$ENCUTEPS/g" \
	    -e "s/^ *kPointEPS=.*$/kPointEPS=$kPointEPS/g" \
	    -e "s/^ *NBANDSEPS=.*$/NBANDSEPS=$NBANDSEPS/g" \
	    -e "s/^ *CheckaK=.*$/CheckaK=$CheckaK/g" \
	    -e "s/^ *nkx2=.*$/nkx2=$nkx2/g" \
	    -e "s/^ *nky2=.*$/nky2=$nky2/g" \
	    -e "s/^ *nkz2=.*$/nkz2=$nkz2/g" \
	    -e "s/^ *CheckENCUT=.*$/CheckENCUT=$CheckENCUT/g" \
	    -e "s/^ *CheckNBANDS=.*$/CheckNBANDS=$CheckNBANDS/g" \
	    	$Template > $OutFile
}

function ModifyScriptForDoVASP
{
	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/^ *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" \
	    	$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
}

#===========================
# Perform CheckConvergence.sh
#===========================
mkdir $ConvergenceDir
echo "cp $TemplateDir/{$CheckConvergence,$DoVASP,hosts,*.cif,*.klist,*.KPOINTS} $ConvergenceDir"
cp $TemplateDir/{$CheckConvergence,$DoVASP,hosts,*.cif,*.klist,*.KPOINTS} $ConvergenceDir

ModifyScript "$TemplateDir/$CheckConvergence" "$ConvergenceDir/$CheckConvergence" \
		"$Options" "" "" ""
cd $ConvergenceDir
echo "Perform ./$CheckConvergence in `pwd`..."
./$CheckConvergence

#===========================
# Perform DoVASP.sh
#===========================
cd $BaseDir

#cp $ConvergenceDir/DoVASP-new.sh .
ModifyScriptForDoVASP "$ConvergenceDir/DoVASP-new.sh" "DoVASP-new.sh"

chmod +x ./DoVASP-new.sh
echo "Perform ./DoVASP-new.sh in `pwd`..."
./DoVASP-new.sh
