@echo off
echo.

::===================================
::  Directory/file configuration
::===================================
set MPIRUNPath=C:\Program Files\MPICH2\bin\mpiexec.exe 
set nCore=4

set BatchFileDir=%~dp0
set RootDir=%BatchFileDir%
set TemplateDir=%RootDir%Template

set ProgramsDir=d:\Programs
if not exist "%ProgramsDir%" (
	set ProgramsDir=c:\Programs
)
set tee=%ProgramsDir%\bin\ktee.exe -f
set PerlDir=%ProgramsDir%\Perl

set ElasticDir=%PerlDir%\ElasticConstant
set TemplateSource=%ElasticDir%\Template
set script=%ElasticDir%\CalElasticConstant.pl

set GULPRoot=%ProgramsDir%\MD\gulp-5.0
set CMD="%GULPRoot%\gulp.exe"
set MPICMD="%MPIRUNPath%" "%CMD%" -n %nCore%

set GULPPerlDir=%ProgramsDir%\Perl\GULP
set RunScript=%TemplateDir%\GoGULP.bat
set GULPplCmd=perl %GULPPerlDir%\GULP.pl


::===========================
::  Calculation condition
::===========================
set SampleName=%1
if "%SampleName%" == "" (
	set SampleName={SampleName}
)
if "%SampleName%" == "" (
	echo Error: SampleName should be specified.
	goto USAGE
)
::Remove extension
set SampleName=%SampleName:.cif=%

::Mode: gulp, vasp, pwscf
set Mode=%2
if "%Mode%" == "" (
	set Mode=gulp
)

set OriginalCIF=original.cif
set OriginalFileHeader=%OriginalCIF:.cif=%

::===============================
::  GULP init / update parameters
::===============================
::property optimize
set Function=%3
if "%Function%" == "" (
	set Function=property
)
set LibraryFile=%4
::set LibraryFile=IGZO.lib
::set LibraryFile=IGZO-Morse.lib
:if "%LibraryFile%" == "" (
:	set LibraryFile=IGZO-Morse.lib
:)
set UseSpeciesCharges=yes
set CopyScript=0
set pressure=0.1

:: Define eArrayF, eArrayR (strain), cifArrayF, cifArrayR (CIF), and dirArrayF, dirArrayR (WorkDir)
:: e.g. set eArrayR[0]=-0.1
::      set cifArrayR[0]=e1111_-0.1.cif
::      set dirArrayR[0]=e1111_-0.1
{ArrayString}

::===============================
::  Print configuration
::===============================
::@echo on
echo RootDir    : %RootDir%
echo TemplateDir: %TemplateDir%
echo SampleName : %SampleName%
echo Mode       : %Mode%
echo.


:: Create base input files
::if exist "%OriginalCIF%" (
:::	echo File [%OriginalCIF%] exists.
::	echo Skip.
::) else (
::	echo call %RunScript% 0.0 %OriginalCIF% %OriginalFileHeader init
::	call %RunScript% 0.0 %OriginalCIF% %OriginalFileHeader init
::)

:: Run for the base structure
echo call :RUN 0.0 %OriginalCIF% %OriginalFileHeader%
call :RUN 0.0 %OriginalCIF% %OriginalFileHeader%

goto END

echo.
:: Run for the zero e1 from the base structure
echo Zero FileList: [%eArrayZ[0]%][%eArrayZ[1]%][%eArrayZ[2]%][%eArrayZ[3]%][%eArrayZ[4]%]
setlocal ENABLEDELAYEDEXPANSION
for /l %%n in (0,1,%nZ%) do (
	echo call :RUN !eArrayZ[%%n]! !cifArrayZ[%%n]! !dirArrayZ[%%n]!
	call :RUN !eArrayZ[%%n]! !cifArrayZ[%%n]! !dirArrayZ[%%n]!
)

echo.
:: Run for the reverse direction from the base structure
echo Forward FileList: [%eArrayR[0]%][%eArrayR[1]%][%eArrayR[2]%][%eArrayR[3]%][%eArrayR[4]%]
setlocal ENABLEDELAYEDEXPANSION
for /l %%n in (0,1,%nR%) do (
	echo call :RUN !eArrayR[%%n]! !cifArrayR[%%n]! !dirArrayR[%%n]!
	call :RUN !eArrayR[%%n]! !cifArrayR[%%n]! !dirArrayR[%%n]!
)
endlocal

echo.
:: Run for the forward direction from the base structure
echo Forward FileList: [%eArrayF[0]%][%eArrayF[1]%][%eArrayF[2]%][%eArrayF[3]%][%eArrayF[4]%]
setlocal ENABLEDELAYEDEXPANSION
for /l %%n in (0,1,%nF%) do (
	echo call :RUN !eArrayF[%%n]! !cifArrayF[%%n]! !dirArrayF[%%n]!
	call :RUN !eArrayF[%%n]! !cifArrayF[%%n]! !dirArrayF[%%n]!
)
endlocal

goto END


::===================================
::===================================
:: Subroutines
::===================================
::===================================


:INITRUN
::===================================
:: Make initial input files and run
::===================================
Call RUN %1 %2 %3 %4 %5 %6 
exit /b


:RUN
::=====================================================
:: Run calculation engine in the directory given by %1
::=====================================================
@echo off
set e=%1
set CIFFile=%2
set WorkDir=%3
::Remove extension
set header=%CIFFile:.cif=%

echo.
echo 1=[%1] 2=[%2] 3=[%3]  CIF=[%CIFFile%] WD=[%WorkDir%] e=[%e%]

if not exist "%CIFFile%" (
	echo File [%CIFFile%] does not exist.
	echo Skip.
) else if exist "%WorkDir%" (
	echo Directory [%WorkDir%] exists.
	echo Skip.
) else (
@echo on
	mkdir %WorkDir%
	copy %CIFFile% %WorkDir%
	cd %WorkDir%
@echo off
	echo Working in:
	cd
	echo ...

	echo *********************************
	echo **  Make GULP input files for function "%Function%" **
	echo *********************************
@echo on
@setlocal enabledelayedexpansion
	if "%LibraryFile%" == "" (
		%GULPplCmd% --Action=FindDatabases --PotentialType=buck %SampleName%.cif

		echo.
		echo Input Library file from above.
		set /P LibraryFile="Input >> "
	)

	if "%TargetFiles%" == "" (
		echo.
	) else (
		set TargetFiles="%TargetFiles%"
	)

	echo %GULPplCmd% --Action=MakeInput --UseShellModelForCation=0 --UseShellModelForAnion=0 ^
		--Function=%Function% --LibraryFile=!LibraryFile! --UseSpeciesCharges=%UseSpeciesCharges% ^
		--temperature=%tempearture% --pressure=%pressure% ^
		%header%.cif %header%.glp
	%GULPplCmd% --Action=MakeInput --UseShellModelForCation=0 --UseShellModelForAnion=0 ^
		--Function=%Function% --LibraryFile=!LibraryFile! --UseSpeciesCharges=%UseSpeciesCharges% ^
		--temperature=%tempearture% --pressure=%pressure% ^
		%header%.cif %header%.glp
@endlocal

	call %RunScript% %header% exec
	call %RunScript% %header% post
@echo off
)

echo.
echo cd to RootDir [%RootDir%]
cd %RootDir%
exit /b


:Usage
::============================
::  Show Usage and terminate
::============================
echo Usage: CalculateElasticConstant.bat SampleName
goto END


:END
::============================
:: Terminate
::============================
::call GoGULP.bat %SampleName% merge MD-NVT* MD-NPT*
echo .
exit /b
