@echo off
:echo on

::==================================
:: Show USAGE for help or ?
::==================================
if "%1" == "help" (
	goto USAGE
)
if "%1" == "?" (
	goto USAGE
)
if "%1" == "del" (
	echo rmdir /S /Q %2
	rmdir /S /Q %2
	goto END
)
if not "%1" == "" (
	if "%3" == "" (
		goto USAGE
	)
)


::==================================
:: Directory config
::==================================
set ProgramsDir=d:\Programs
if not exist "%ProgramsDir%" (
	set ProgramsDir=c:\Programs
)
set PerlDir=%ProgramsDir%\Perl
set ElasticDir=%PerlDir%\ElasticConstant
set TemplateSource=%ElasticDir%\Template
set script=%ElasticDir%\CalElasticConstant.pl
set tee=%ProgramsDir%\bin\ktee.exe -a

set TemplateDir=.\Template

set InitializeScript=initialize.bat
set RunScript=CalculateElasticConstant.bat


::==================================
:: Calculation parameters
::==================================

set SampleName=%1
if "%SampleName%" == "" (
	set SampleName=ZnO
)
::Remove extension
set SampleName=%SampleName:.cif=%
set SampleName=%SampleName:.glp=%
set SampleName=%SampleName:.gin=%
set SampleName=%SampleName:.out=%
set SampleName=%SampleName:.axsf=%
set SampleName=%SampleName:.arc=%
set SampleName=%SampleName:.trg=%
set SampleName=%SampleName:.pre=%

set CIFFile=%SampleName%.cif
set OriginalDir=original
set OriginalCIF=original.cif
set OriginalInput=original.pwin.new

set OutputFile=%SampleName%-out.txt
set TableFile=table.txt

set BurstToP1=1
set UseBravaisLattice=0

::engine: gulp, vasp, pwscf
set engine=%2
if "%engine%" == "" (
	set engine=pwscf
)

::mode: Cabc, CXYZ, Vconst, Vconp
set mode=%3
if "%mode%" == "" (
	set mode=Vconst
)

set Library=%4
if "%Library%" == "null" (
	set Library=
)
:if "%Library%" == "" (
:	set Library=IGZO-Morse.lib
:)

set index=%4
if "%index%" == "" (
	set index=1111
)

set nStep=%5
if "%nStep%" == "" (
	set nStep=3
)

:: Can use equation for nOrder
set nOrder=%6
if "%nOrder%" == "" (
	set nOrder=$nStep-1
)

:: fdiff = da / a, dV/V, dP (atm)
::set fdiff=2000.0
set fdiff=%7
if "%fdiff%" == "" (
	set fdiff=0.01
)

:: Pressure of the origin in atm
set pressure0=%9
if "%pressure0%" == "" (
	set pressure0=0.0
)

set nRelaxationStep=100
:set e_tol=1.0e-4
set e_tol=0.1e-4
:set F_tol=1.0e-3
set F_tol=0.5e-3
::set conv_thr=1.0e-6
set conv_thr=1.0e-7
set pressure_tol=50.0

::==================================
:: Related variables
::==================================
:: mode is saved to mode_original as mode will be changed in external scripts.
set mode_original=%mode%

::==================================
:: Task flags
::==================================
set DoMakeInputs=1
set DoMakeRunScript=1
set Execute=1
set Calculate=1


::==================================
:: Main routine
::==================================

if "%mode%" == "init" (
	call :INIT
	goto END
)

echo. | %tee% %OutputFile%
echo =============================================== | %tee% %OutputFile%
echo Calculate elastic tensor | %tee% %OutputFile%
echo =============================================== | %tee% %OutputFile%
echo delete %OutputFile% | %tee% %OutputFile%
echo. | %tee% %OutputFile%
echo Sample=%SampleName% | %tee% %OutputFile%
echo mode=%mode% | %tee% %OutputFile%
echo index=%index% | %tee% %OutputFile%
echo nStep=%nStep% | %tee% %OutputFile%
::goto END

if "%DoMakeInputs%" == "1" (
	call :MakeInputs
)
:goto END

if "%DoMakeRunScript%" == "1" (
	call :MakeRunScript
)
:goto END

if "%Execute%" == "1" (
	call :Execute
)
:goto END

if "%Calculate%" == "1" (
	call :Calculate
)


goto END




::========================================================================
::========================================================================
:: Subroutines
::========================================================================
::========================================================================

:INIT
::============================================
::  Create original structure by VC-Relax cal
::============================================

if not exist %OriginalCIF% (
	echo.
	echo Error: CIF file [%OriginalCIF%] is not found.
	echo.
	goto END
)
if exist %OriginalDir% (
	echo.
	echo Original structure dir [%OriginalDir%] exists.
	echo Proceed to next step, or delete %OriginalDir% and run init again.
	echo.
	goto END
)

set WorkDir=%OriginalDir%
echo.
echo Mode=%Mode%
echo CIFile=%CIFile%
echo OriginalCIF=%OriginalCIF%
echo OriginalDir=%OriginalDir%
echo OriginalInput=%OriginalInput%

::if exist "%TableFile%" (
::	echo Delete table [%TableFile%]
	del %TableFile%
::)

call :MakeRunScript
goto END


:MakeInputs
::============================
:: Make input structure files
::============================
echo. | %tee% %OutputFile%
echo. | %tee% %OutputFile%
echo =============================================== | %tee% %OutputFile%
echo Make input files | %tee% %OutputFile%
echo =============================================== | %tee% %OutputFile%
echo perl %script% --Action=MakeInputs --Engine=%Engine% --Mode=%mode% --Index=%index% ^
	--nStep=%nStep% ^
	--OriginalDir=%OriginalDir% --OriginalCIF=%OriginalCIF% --OriginalInput=%OriginalInput% ^
	--pressure0=%pressure0% --pressure_tol=%pressure_tol% --fdiff=%fdiff% %OriginalCIF% ^
	| %tee% %OutputFile%
perl %script% --Action=MakeInputs --Engine=%Engine% --Mode=%mode% --Index=%index% ^
	--nStep=%nStep% ^
	--OriginalDir=%OriginalDir% --OriginalCIF=%OriginalCIF% --OriginalInput=%OriginalInput% ^
	--pressure0=%pressure0% --pressure_tol=%pressure_tol% --fdiff=%fdiff% %OriginalCIF% ^
	| %tee% %OutputFile%
exit /b


:MakeRunScript
::============================
:: Make run script
::============================
echo. | %tee% %OutputFile%
echo. | %tee% %OutputFile%
echo ================================== | %tee% %OutputFile%
echo Make Run Script [CalculateElasticConstant.bat] | %tee% %OutputFile%
echo ================================== | %tee% %OutputFile%
echo perl %script% --Action=MakeRunScript --Mode=%mode% --Index=%index% ^
	--BurstToP1=%BurstToP1% --UseBravaisLattice=%UseBravaisLattice% ^
	--OriginalCIF=%OriginalCIF% --OriginalDir=%OriginalDir% --OriginalInput=%OriginalInput% ^
	--nRelaxationStep=%nRelaxationStep% --e_tol=%e_tol% --F_tol=%F_tol% --conv_thr=%conv_thr% ^
	--pressure0=%pressure0% --pressure_tol=%pressure_tol% --fdiff=%fdiff% ^
	--Engine=%engine% %CIFFile% ^
	| %tee% %OutputFile%
perl %script% --Action=MakeRunScript --Mode=%mode% --Index=%index% ^
	--BurstToP1=%BurstToP1% --UseBravaisLattice=%UseBravaisLattice% ^
	--OriginalCIF=%OriginalCIF% --OriginalDir=%OriginalDir% --OriginalInput=%OriginalInput% ^
	--nRelaxationStep=%nRelaxationStep% --e_tol=%e_tol% --F_tol=%F_tol% --conv_thr=%conv_thr% ^
	--pressure0=%pressure0% --pressure_tol=%pressure_tol% --fdiff=%fdiff% ^
	--Engine=%engine% %CIFFile% ^
	| %tee% %OutputFile%
goto END
exit /b


:Execute
::============================
::  Execute calculation engine
::============================
echo. | %tee% %OutputFile%
echo. | %tee% %OutputFile%
echo ================================== | %tee% %OutputFile%
echo Execute external engine %Engine% | %tee% %OutputFile%
echo ================================== | %tee% %OutputFile%
echo call %RunScript% %SampleName% | %tee% %OutputFile%
call %RunScript% %SampleName% | %tee% %OutputFile%
exit /b


:Calculate
::================================
::  Calculate elastic constants
::================================
echo. | %tee% %OutputFile%
echo. | %tee% %OutputFile%
echo ================================== | %tee% %OutputFile%
echo Calculate elastic tensor | %tee% %OutputFile%
echo ================================== | %tee% %OutputFile%
echo perl %script% --Action=cal --Mode=%mode_original% --Index=%index% --Engine=%engine% ^
	--nStep=%nStep% --nOrder=%nOrder% %SampleName%.cif ^
	| %tee% %OutputFile%
perl %script% --Action=cal --Mode=%mode_original% --Index=%index% --Engine=%engine% ^
	--nStep=%nStep% --nOrder=%nOrder% %SampleName%.cif ^
	| %tee% %OutputFile%
exit /b


:Usage
::============================
::  Show Usage and terminate
::============================
echo.
echo Usage: run SampleName Engine init GULPLib
echo          Run VC-Relax cal to create original structure
echo        run SampleName Engine mode index nStep nOrder fdiff pressure0
echo          Run VC-Relax cal to create original structure
echo        run [?^|help] to show this usage
echo.
echo          Engine: pwscf,gulp
echo          mode: Cabc, CXYZ, Vconst, Vconp
echo.
goto END


:END
:Terminate
::============================
::  Terminate
::============================
::call GoGULP.bat %SampleName% merge MD-NVT* MD-NPT*
echo.

