#/bin/bash -x

#============================
# Executables
#============================
nCPU={nCPU}
NPAR={NPAR}
KPAR={KPAR}
nCPUForMKL={nCPUForMKL}
MKL_NUM_THREADS={MKL_NUM_THREADS}

MPIBIN=/usr/local/openmpi-intel131/bin
VASPPATH=/usr/local/VASP-5.3.5/bin/vasp
#VASPPATH=vasp
VASP="$MPIBIN/mpirun -machinefile hosts -np $nCPU $VASPPATH"

TEE=$HOME/bin/ktee
VASPDir=$TkPerlDir/VASP
export "VASPplCMD=/usr/bin/perl $VASPDir/VASP.pl"
export "PHONOPYplCMD=/usr/bin/perl $VASPDir/Phonopy.pl"

#PhonopyDOVASPCommand="mpirun -np 16 vasp"
Usebsub={Usebsub}
if [ "$Usebsub" = "1" ]; then
  PhonopyDOVASPCommand="bsub $VASP"
else
  PhonopyDOVASPCommand=$VASP
fi

#============================
# Directories
#============================
HostName=`hostname`
BaseDir=`pwd`
OriginalDir={OriginalDir}
OriginalDir=`echo $OriginalDir | sed -e "s/:_:/\//g"`

#====================================
# Common definitions
#====================================
#Title=`pwd`
#Title=${Title##*/}
Title={Title}
EMail={EMail}
SMTPServer={SMTPServer}
Domain={Domain}
MailerName=SendMail.pl:$0
From={From}

#=====================================
# Material and calculation condition
#=====================================
Precision={Precision}
ENCUT={ENCUT}
aKProduct={aKProduct}
GammaOnly={GammaOnly}
EDIFF={EDIFF}
EDIFFG={EDIFFG}
KeepSymmetry={KeepSymmetry}
ISMEAR={ISMEAR}
SIGMA={SIGMA}

Interface={Interface}
nSupercell="{nSupercell}"
MeshPoints="{MeshPoints}"
BandPoints={BandPoints}
NonAnalyticalTermCorrection={NonAnalyticalTermCorrection}
fConversion={fConversion}

#============================
# Control flags
#============================
DoPhonopyDOS={DoPhonopyDOS}
DoPhonopyThermalProperties={DoPhonopyThermalProperties}
DoPhonopyPDOS={DoPhonopyPDOS}
DoPhonopyBand={DoPhonopyBand}
DoSendMail={DoSendMail}

#============================
# Functions
#============================
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
}

#========================================================================
# Preprocess for phonopy
# creates disp.yaml  POSCAR  POSCAR-001  POSCAR-002  POSCAR-003  SPOSCAR
#========================================================================
#cd $BaseDir
echo ' '
echo ' '

if [ "$Interface" = "VASPDFPT" ]; then
  echo "cp $OriginalDir/SCF/POSCAR  ./POSCAR-unitcell"
  cp $OriginalDir//SCF/POSCAR ./POSCAR-unitcell

  echo "phonopy -d --dim="$nSupercell" -c POSCAR-unitcell"
  phonopy -d --dim="$nSupercell" -c POSCAR-unitcell
else
  echo "cp $OriginalDir/SCF/POSCAR ."
  cp $OriginalDir/SCF/POSCAR ./POSCAR

  echo "phonopy -d --dim=\"$nSupercell\""
  phonopy -d --dim="$nSupercell"
fi

if [ -s $BaseDir/POSCAR-001 ]; then
  echo ' '
else
  SendMail "$EMail" "$SMTPServer" "$MailerName" "$Domain" "$From" \
    	     "$Title" "$HostName: $Title failed in phonony preprocess"
  PrintError "[$BaseDir/POSCAR-001] does not exist." \
	     "Something wrong in the phonopy preprocess." 1
fi

#==========================================
# Run vasp for hessian matrix / POSCAR-*
#==========================================
echo ' '
echo ' '
DirList=
if [ "$Interface" = "VASPDFPT" ]; then
  DFPTDir=$BaseDir/DFPT
  if [ -d $DFPTDir ]; then
        echo Dir [$DFPTDir] exists.
        echo Skip.
  else 
    mkdir $DFPTDir
    cp $OriginalDir/SCF/POTCAR $DFPTDir/POTCAR
    cp ./SPOSCAR $DFPTDir/POSCAR
    cp ./hosts $DFPTDir

    cd $DFPTDir
    $PHONOPYplCMD --Action=MakePhonopyINCAR --PhonopyTarget=$Interface --ENCUT=$ENCUT \
    		  --Precision=$Precision --EDIFF=$EDIFF --EDIFFG=$EDIFFG \
    		  --KeepSymmetry=$KeepSymmetry --ISMEAR=$ISMEAR --SIGMA=$SIGMA INCAR
    $PHONOPYplCMD --Action=MakeKPOINTSforSPOSCAR --aKProduct=$aKProduct KPOINTS

    echo Run [$PhonopyDOVASPCommand] to calculate hessian matrix.
    SendMail "$EMail" "$SMTPServer" "$MailerName" "$Domain" "$From" \
	     "$Title" "$HostName: $Title DFPT VASP started"
    $PhonopyDOVASPCommand

    if [ -s vasprun.xml ]; then
      echo ' '
      SendMail "$EMail" "$SMTPServer" "$MailerName" "$Domain" "$From" \
    	       "$Title" "$HostName: $Title DFPT VASP finished"
    else
      SendMail "$EMail" "$SMTPServer" "$MailerName" "$Domain" "$From" \
    	       "$Title" "$HostName: $Title DFPT VASP failed"
      PrintError "[vasprun.xml] does not exist." \
                 "Something wrong in the DFPT calculation by VASP." 1
    fi
  fi
else
  for i in $(seq 1 10000)
  do
    cd $BaseDir

    Index=$(printf "%03d" $i)
    POSCARName=POSCAR-$Index

    if [ -f $POSCARName ]; then
      WorkDir=$BaseDir/disp-$Index
      DirList="$DirList $WorkDir/vasprun.xml"

      if [ -d $WorkDir ]; then
        echo Dir [$WorkDir] exists.
        echo Skip.
        continue
      else 
        mkdir $WorkDir
        cp $OriginalDir/hosts $WorkDir
        cp $OriginalDir/SCF/POTCAR $WorkDir
        cp $POSCARName $WorkDir/POSCAR

        cd $WorkDir
	$PHONOPYplCMD --Action=MakePhonopyINCAR --PhonopyTarget=$Interface --ENCUT=$ENCUT \
    		      --Precision=$Precision --EDIFF=$EDIFF --EDIFFG=$EDIFFG \
    		      --KeepSymmetry=$KeepSymmetry --ISMEAR=$ISMEAR --SIGMA=$SIGMA INCAR
#        $PHONOPYplCMD --Action=MakeGOnlyKPOINTS KPOINTS
        $PHONOPYplCMD --Action=MakeKPOINTSforSPOSCAR --aKProduct=$aKProduct KPOINTS

        echo Run [$PhonopyDOVASPCommand in `pwd`]
        SendMail "$EMail" "$SMTPServer" "$MailerName" "$Domain" "$From" \
                 "$Title" "$HostName: $Title ${i}-th FD VASP started"
        $PhonopyDOVASPCommand

	if [ "$Usebsub" != "1" ]; then
          if [ -s vasprun.xml ]; then
            echo ' '
            SendMail "$EMail" "$SMTPServer" "$MailerName" "$Domain" "$From" \
                     "$Title" "$HostName: $Title ${i}-th FD VASP finished"
          else
            SendMail "$EMail" "$SMTPServer" "$MailerName" "$Domain" "$From" \
                     "$Title" "$HostName: $Title ${i}-th FD VASP failed"
            PrintError "[vasprun.xml] does not exist." \
                       "Something wrong in the finite displacement DFT calculation by VASP." 1
          fi
        fi
      fi
    else
      echo POSCAR [$POSCARName] does not exist.
      echo Break the loop.
      break
    fi
  done
fi

#===================================
# Run phonopy to make force matrix
#===================================
cd $BaseDir

echo ' '
echo ' '
if [ "$Interface" = "VASPDFPT" ]; then
  DFPTDir=DFPT
  cp $DFPTDir/vasprun.xml .
  echo Run [phonopy --fc vasprun.xml] to create FORCE_CONSTANTS.
  phonopy --fc vasprun.xml

  if [ -s FORCE_CONSTANTS ]; then
    echo ' '
  else
    SendMail "$EMail" "$SMTPServer" "$MailerName" "$Domain" "$From" \
             "$Title" "$HostName: $Title FD VASP failed"
    PrintError "[FORCE_CONSTANTS] does not exist." \
               "Something wrong in the force matrix calculation by phonopy." 1
  fi
else
  echo Run [phonopy -f $DirList].
  phonopy -f $DirList

  if [ -s FORCE_SETS ]; then
    echo ' '
  else
      SendMail "$EMail" "$SMTPServer" "$MailerName" "$Domain" "$From" \
               "$Title" "$HostName: $Title FD VASP failed"
      PrintError "[FORCE_SETS] does not exist." \
                 "Something wrong in the force matrix calculation by phonopy." 1
  fi
fi

#=============================================
# Run phonopy to calculate phonon properties
#=============================================
BORNFile=BORN
VerboseFile=phonopy-verbose.out.txt
phonopy -v --dim="$nSupercell"  | $TEE $VerboseFile

if [ "$NonAnalyticalTermCorrection" = "Yes" ]; then
  Option="--Action=MakeBORN $VerboseFile $OriginalDir/Phonon/OUTCAR $BORNFile"
  echo "Run [$PHONOPYplCMD $Option]."
  $PHONOPYplCMD $Option
fi

# DOS
if [ "$DoPhonopyDOS" = "1" ]; then
  echo ' '
  echo Calculate Total DOS
  if [ -f mesh.conf ]; then
    echo 'mesh.conf exists. No update.'
  else
    Option="--Action=MakeMeshConf --PhonopyTarget=$Interface --fConversion=$fConversion \
    	    --CARDir=$OriginalDir/SCF"
    echo "Run [$PHONOPYplCMD $Option --nSupercell="$nSupercell" --MeshPoints="$MeshPoints" mesh.conf]."
    $PHONOPYplCMD $Option --nSupercell="$nSupercell" --MeshPoints="$MeshPoints" mesh.conf
  fi

  if [ "$Interface" = "VASPDFPT" ]; then
    echo "Run [phonopy -p -s --dim="$nSupercell" -c POSCAR-unitcell mesh.conf]."
    phonopy -p -s --dim="$nSupercell" -c POSCAR-unitcell mesh.conf
  else
    echo "Run [phonopy -p -s mesh.con]."
    phonopy -p -s mesh.conf
  fi
  mv total_dos.pdf total_dos_NoAnalyticalTerm.pdf
  mv total_dos.dat total_dos_NoAnalyticalTerm.dat

  if [ -f $BORNFile ]; then
    if [ "$Interface" = "VASPDFPT" ]; then
      echo "Run [phonopy --nac -p -s --dim="$nSupercell" -c POSCAR-unitcell mesh.conf]."
      phonopy --nacn -p -s --dim="$nSupercell" -c POSCAR-unitcell mesh.conf
    else
      echo "Run [phonopy --nac -p -s mesh.con]."
      phonopy --nac -p -s mesh.conf
    fi
    mv total_dos.pdf total_dos_AnalyticalTerm.pdf
    mv total_dos.dat total_dos_AnalyticalTerm.dat
  fi
fi

# Thermal properties
if [ $DoPhonopyThermalProperties -eq 1 ]; then
  echo ' '
  echo Calculate thermal properties
  if [ -f mesh.conf ]; then
    echo 'mesh.conf exists. No update.'
  else
# Do not use fConversion because the unit is fixed to THz and fConversion must be the default value.
    Option="--Action=MakeMeshConf --PhonopyTarget=$Interface --CARDir=$OriginalDir/SCF"
    echo "Run [$PHONOPYplCMD $Option --nSupercell="$nSupercell" --MeshPoints="$MeshPoints" mesh.conf]."
    $PHONOPYplCMD $Option --nSupercell="$nSupercell" --MeshPoints="$MeshPoints" mesh.conf
  fi

  if [ "$Interface" = "VASPDFPT" ]; then
    echo "Run [phonopy $Option -t --dim="$nSupercell" -c POSCAR-unitcell mesh.conf]."
    phonopy -t --dim="$nSupercell" -c POSCAR-unitcell mesh.conf
  else
    echo "Run [phonopy -t mesh.con]."
    phonopy -t mesh.conf
  fi
  mv thermal_properties.yaml thermal_properties_NoAnalyticalTerm.yaml

  if [ -f $BORNFile ]; then
    if [ "$Interface" = "VASPDFPT" ]; then
      echo "Run [phonopy --nac -t --dim="$nSupercell" -c POSCAR-unitcell mesh.conf]."
      phonopy --nac -t --dim="$nSupercell" -c POSCAR-unitcell mesh.conf
    else
      echo "Run [phonopy --nac -t mesh.con]."
      phonopy --nac -t mesh.conf
    fi
    mv thermal_properties.yaml thermal_properties_AnalyticalTerm.yaml
  fi
fi

# PDOS
if [ $DoPhonopyPDOS -eq 1 ]; then
  echo ' '
  echo Calculate Projected DOS
  if [ -f pdos.conf ]; then
    echo 'pdos.conf exists. No update.'
  else
    Option="--Action=MakePDOSConf --PhonopyTarget=$Interface --fConversion=$fConversion \
    	    --CARDir=$OriginalDir/SCF"
    echo "Run [$PHONOPYplCMD $Option  --nSupercell="$nSupercell" --MeshPoints="$MeshPoints" pdos.conf]."
    $PHONOPYplCMD $Option  --nSupercell="$nSupercell" --MeshPoints="$MeshPoints" pdos.conf
  fi

  if [ "$Interface" = "VASPDFPT" ]; then
    echo "Run [phonopy -p -s --dim="$nSupercell" -c POSCAR-unitcell pdos.conf]."
    phonopy -p -s --dim="$nSupercell" -c POSCAR-unitcell pdos.conf
  else
    echo "Run [phonopy -p -s pdos.conf]."
    phonopy -p -s pdos.conf
  fi
  mv partial_dos.pdf partial_dos_NoAnalyaticalTerm.pdf
  mv partial_dos.dat partial_dos_NoAnalyaticalTerm.dat

  if [ -f $BORNFile ]; then
    if [ "$Interface" = "VASPDFPT" ]; then
      echo "Run [phonopy --nac -p -s --dim="$nSupercell" -c POSCAR-unitcell pdos.conf]."
      phonopy --nac -p -s --dim="$nSupercell" -c POSCAR-unitcell pdos.conf
    else
      echo "Run [phonopy --nac -p -s pdos.conf]."
      phonopy --nac -p -s pdos.conf
    fi
    mv partial_dos.pdf partial_dos_AnalyaticalTerm.pdf
    mv partial_dos.dat partial_dos_AnalyaticalTerm.dat
  fi
fi

# Band
if [ $DoPhonopyBand -eq 1 ]; then
  echo ' '
  echo "Calculate phonon band"
  cp $OriginalDir/*.klist .

  if [ -f band.conf ]; then
    echo 'band.conf exists. No update.'
  else
    Option="--Action=MakeBandConf --PhonopyTarget=$Interface --fConversion=$fConversion \
    	    --CARDir=$OriginalDir/SCF --KListDir=. --BandPoints=$BandPoints"
    echo "Run [$PHONOPYplCMD $Option --nSupercell="$nSupercell" band.conf]."
    $PHONOPYplCMD $Option --nSupercell="$nSupercell" band.conf
  fi

  if [ "$Interface" = "VASPDFPT" ]; then
    echo "Run [phonopy -p -s --dim="$nSupercell" -c POSCAR-unitcell band.conf]."
    phonopy -p -s --dim="$nSupercell" -c POSCAR-unitcell band.conf
  else
    echo "Run [phonopy -p -s band.conf]."
    phonopy -p -s band.conf
  fi
  mv band.pdf band_NoAnalyticalTerm.pdf
  mv band.yaml band_NoAnalyticalTerm.yaml
  mv disp.yaml disp_NoAnalyticalTerm.yaml

  if [ -f $BORNFile ]; then
    if [ "$Interface" = "VASPDFPT" ]; then
      echo "Run [phonopy --nac -p -s --dim="$nSupercell" -c POSCAR-unitcell band.conf]."
      phonopy --nac -p -s --dim="$nSupercell" -c POSCAR-unitcell band.conf
    else
      echo "Run [phonopy --nac -p -s band.conf]."
      phonopy --nac -p -s band.conf
    fi
    mv band.pdf band_AnalyticalTerm.pdf
    mv band.yaml band_AnalyticalTerm.yaml
    mv disp.yaml disp_AnalyticalTerm.yaml
  fi
fi

