@echo off

goto START

:Usage
::============================
::  Show Usage and terminate
::============================
echo Usage: DoPWSCF.bat SampleName FindPP
echo Usage: DoPWSCF.bat SampleName init
echo Usage: DoPWSCF.bat SampleName exec
echo Usage: DoPWSCF.bat SampleName save
echo Usage: DoPWSCF.bat ShowPP
echo Usage: DoPWSCF.bat clean
goto END


:START

::===========================
::  directory/file configuration
::===========================
set MPIRUNPath=C:\Program Files\MPICH2\bin\mpiexec.exe 
set nCore=16

set QERoot=C:\Program Files\Quantum ESPRESSO 64-bit 5.2.1-mpich2\bin
set CMD="%QERoot%\pw.exe"
set MPICMD="%MPIRUNPath%" "%QERoot%\pw.exe" -n %nCore%

set ProgramsDir=c:\Programs
if not exist "%ProgramsDir%" (
	set ProgramsDir=d:\Programs
)
set QEPerlDir=%ProgramsDir%\Perl\QE
set TEE=%ProgramsDir%\bin\ktee.exe

::=================================
::  Task definition from argments
::=================================
set SampleName=%1
::Remove extension
set SampleName=%SampleName:.cif=%
set SampleName=%SampleName:.pwin=%
set SampleName=%SampleName:.pwout=%
set SampleName=%SampleName:.out=%
set SampleName=%SampleName:.axsf=%

:Task: init exec post clean save
if "%1" == "clean" (
	set Task=%1
	set DoConfirm=%2
) else (
	set Task=%2
)

if "%Task%" == "save" (
	set TargetDir=%3
	set DoConfirm=%4
)

::=======================
::  convert parameters
::=======================
::No, P1, RhombHex, HexRhomb, HexOrtho, FCCPrim, BCCPrim, ACenterPrim, BCenterPrim, CCenterPrim
set ConvertLattice=
::set ConvertLattice=HexOrtho


::=======================
::  init / update parameters
::=======================
set CIFFile=%SampleName%.cif
rem set CIFFile=auto

::set pressure=0.001
set pressure=0.01

rem USPP NC PAW SL 1/r
set PPType=PAW,USPP,NC
rem LDA SLA PZ PBE PBESOL LYP B88 P86 BLYP PW TPSS GGC GGX NOG NOGC NOGX PBC PBX PSC PSX
set Functional=PBE
rem All, Selected, No
set PPCopyMode=Selected
set aKProduct=1.5
set SpinPolarized=1
set ecutwfc=x1.0,30.0
set ecutrho=x1.0,140.0
set nbnd=x1.2

if "%Task%" == "init" (
::Function: scf nscf relax vc-relax relax bands md phonon
	if "%3" == "" (
		set Function=scf
	) else (
		set Function=%3
	)
)

if "%Task%" == "update" (
::Function: scf nscf relax vc-relax relax bands md phonon
	if "%3" == "" (
		set Function=nscf
	) else (
		set Function=%3
	)
)


::=======================
::  post parameters
::=======================
set PostProcess=Yes


:Exec
::=======================
:: Execute tasks
::=======================

echo.
echo *********************************
echo   Execute task [%Task%]
echo *********************************
echo.

if "%Task%" == "convert" (
	echo **********************************************************
	echo **  Convert lattice with the preset = %ConvertLattice%  **
	echo **********************************************************
	if not exist "%SampleName%.cif" (
		echo.
		echo "Error: %SampleName%.cif does not exist."
		goto Usage
	)
	
	echo .
	echo Remove dir [%Task%}, OK?
	rmdir /S %Task%

@setlocal enabledelayedexpansion
	if "%ConvertLattice%" == "" (
		echo.
		echo Input ConvertLattice mode: Choose from
		echo "  No, P1, RhombHex, HexRhomb, HexOrtho, FCCPrim, BCCPrim"
		echo "  ACenterPrim, BCenterPrim, CCenterPrim"
		set /P ConvertLattice="Input >> "
	)

	echo .
	echo exec [%ProgramsDir%\Perl\Crystal\CIF\ConvertLatticeForCIF.pl %SampleName%.cif !ConvertLattice! ai OriginalToConverted 0.01]
	perl %ProgramsDir%\Perl\Crystal\CIF\ConvertLatticeForCIF.pl %SampleName%.cif !ConvertLattice! ai OriginalToConverted 0.01
@endlocal

	mkdir %Task%
	copy %SampleName%-converted.cif      %Task%
	move %SampleName%.cif                %Task%
	move %SampleName%.struct             %Task%
	move %SampleName%-simple.cif         %Task%
	move %SampleName%-Symmetrized.cif    %Task%
	move %SampleName%-Symmetrized.struct %Task%

	echo.
	echo ***********************************************************************
	echo   Convert CIF file would be saved to [%SampleName%-converted.cif]  
	echo   Related files are moved to [%Task%]
	echo ***********************************************************************

	goto Terminate
)


if "%Task%" == "ShowPP" (
	echo **********************************************************
	echo **  Show available pseudo potentials
	echo **********************************************************

	perl %QEPerlDir%\QE.pl --Action=SearchPP --PPType=%PPType% --Functional=%Functional% --DebugMode=1

	goto Terminate
)

if "%Task%" == "FindPP" (
	echo **********************************************************
	echo **  Find available pseudo potentials
	echo **********************************************************

	perl %QEPerlDir%\QE.pl --Action=FindPP --PPType=%PPType% --Functional=%Functional% --DebugMode=1 %CIFFile%

	goto Terminate
)

if "%Task%" == "init" (
	echo *********************************
	echo **  Make PWSCF input files for function "%Function%" **
	echo *********************************

	perl %QEPerlDir%\QE.pl --Action=MakeInputFiles --PPType=%PPType% --Function=%Function% --PPCopyMode=%PPCopyMode% ^
		--SpinPolarized=%SpinPolarized% --UseBravaisLattice=1 --UseCELLDM=1 --aKProduct=%aKProduct% ^
		--ecutrho=%ecutrho% --ecutrho=%ecutrho% --nbnd=%nbnd% ^
		--Pressure=%pressure% --DebugMode=0 ^
		%CIFFile% %SampleName%.pwin
	
	goto Terminate
)


if "%Task%" == "exec" (
	echo **********************
	echo **  Execute PWSCF  **
	echo **********************

echo.
echo "Execute [%CMD% < %SampleName%.pwin | %TEE% %SampleName%.pwout]"
echo.

	%CMD% < %SampleName%.pwin | %TEE% %SampleName%.pwout

	goto Terminate
)


if "%Task%" == "post" (
	echo ********************************************
	echo **  Postprocessing for PWSCF output  **
	echo ********************************************

	perl %QEPerlDir%\QE.pl --Action=MakeCIFFilesFromOutput --DebugMode=0 ^
		%SampleName%.pwin %SampleName%.pwout %SampleName%-initial.cif %SampleName%-final.cif
	perl %QEPerlDir%\QE.pl --Action=MakeXSF --nLastStep=-1 --nOutputInterval=1 --iAvrFirstStep=0 --iAvrLastStep=-1 ^
		--DebugMode=0 ^
		%SampleName%.pwin %SampleName%.pwout %SampleName%.xsf
	perl %QEPerlDir%\QE.pl --Action=UpdateInput --DebugMode=0 ^
		%SampleName%.pwin %SampleName%.pwout %SampleName%.pwin.new

	goto Terminate
)


if "%Task%" == "Update" (
	echo ********************************************
	echo **  I@date PWSCF input  **
	echo ********************************************

	perl %QEPerlDir%\QE.pl --Action=UpdateInput %SampleName%.pwin %SampleName%.pwout ^
		%SampleName%.pwin.new

	goto Terminate
)


if "%Task%" == "save" (
	echo *********************************************
	echo   Save calculation results to [%TargetDir%]
	echo *********************************************

	if "%TargetDir%" == "" (
		goto Usage
	)

	if "%DoConfirm%" == "no" (
echo "del /Q %TargetDir%\*.*"
		del /Q %TargetDir%\*.*
	) else (
echo "del %TargetDir%\*.*"
		del %TargetDir%\*.*
	)
	mkdir %TargetDir%

	copy *.* %TargetDir%
	attrib +R *.bat
	attrib +R *.UPF
	attrib +R %SampleName%.pwin
	if "%DoConfirm%" == "no" (
		del /Q *.*
	) else (
		del *.*
	)
	attrib -R *.*

	goto Terminate
)

if "%Task%" == "clean" (
	echo *************
	echo   Clean up
	echo *************

	attrib +R *.bat
	attrib +R *.pl
	attrib +R *.cif
	attrib +R *.UPF
	attrib -R *-initial.cif
	attrib -R *-final.cif
	if "%DoConfirm%" == "no" (
		del /Q *.*
	) else (
		del *.*
	)
	attrib -R *.*
	
	goto Terminate
)

if "%Task%" == "debugexec" (
	echo ***********************************************************
	echo   Execute [for debug, results to be copied from template]
	echo ***********************************************************
	
	copy template\*.* .
	
	goto Terminate
)


::=======================
:: Invalid Task cases
::=======================
goto Usage


:Terminate
::=======================
::  Termination routine
::=======================
@echo off
:cd ..
echo ********************
echo **  PWSCF END    **
echo ********************
::echo Exit in 10 seconds.
::ping -n 10 localhost > nul
goto END


:END
