#!/usr/bin/perl
use lib 'd:/Programs/Perl/lib';

use strict;
#use warnings;
use Jcode;
use File::Basename;

use ProgVars;
use Utils;

use Sci qw($NA);
use Sci::ChemicalReaction;
use Crystal::MXD;

my $LF                 = "<br>\n";
my $DirectorySeparator = "\\";
my $Program          = basename($0);
my $WebRootDir       = "d:\\MyWebs";
my $CGIPath          = Deps::MakePath($WebRootDir, "cgi-bin", 1);
my $ProgramDir       = "d:\\Programs";
my $ResearchRootURL  = "/Research";

my $MXDInputPath     = ProgVars::MXDInputPath();
my $FileXTALDATA     = "XTALDATA.DAT";

my $ResearchDir      = Deps::MakePath($WebRootDir, "Research", 0);
my $DBDir            = Deps::MakePath($ResearchDir, "Databases", 0);
my $WorkingDir       = Deps::MakePath($ResearchDir, "Working", 0);
my $XPRDir           = Deps::MakePath($ProgramDir, "X", 0);
   $XPRDir           = Deps::MakePath($XPRDir, "XPR", 0);
my $KDir             = Deps::MakePath($XPRDir, "K${DirectorySeparator}Release", 0);

my $KPath            = Deps::MakePath($KDir, "K.exe", 0);

my $PeriodicTable3DB = Deps::MakePath($DBDir, "PERIODIC.CSV", 0);
my $SpaceGroupDBPath = Deps::MakePath($DBDir, "SPGRA", 0);

my $CrystalDBDir             = Deps::MakePath($WebRootDir, "Research", 0);
$CrystalDBDir                = Deps::MakePath($CrystalDBDir, "CrystalStructure", 0);
my $DeleteCrystalDBDir       = Deps::MakePath($CrystalDBDir, "Deleted", 0);
my $CrystalDBURL             = Deps::MakePath($ResearchRootURL, "CrystalStructure", 0);
my $CrystalCommonFileDir     = Deps::MakePath($CrystalDBDir, "Common", 0);
my $CrystalRietanFileDir     = Deps::MakePath($CrystalDBDir, "Rietan", 0);
my $CrystalDVXaFileDir       = Deps::MakePath($CrystalDBDir, "DVXa", 0);
my $CrystalLDFileDir         = Deps::MakePath($CrystalDBDir, "LD", 0);
my $CrystalGULPFileDir       = Deps::MakePath($CrystalDBDir, "GULP", 0);
my $CrystalMXDOrtoFileDir    = Deps::MakePath($CrystalDBDir, "MXDOrto", 0);
#my $CrystalVASPFileDir       = "d:\\Temp";
my $CrystalVASPFileDir       = Deps::MakePath($CrystalDBDir, "VASP", 0);
my $CrystalPWSCFFileDir      = Deps::MakePath($CrystalDBDir, "PWSCF", 0);
my $CrystalTranSIESTAFileDir = Deps::MakePath($CrystalDBDir, "TranSIESTA", 0);
my $CrystalWIEN2kFileDir     = Deps::MakePath($CrystalDBDir, "WIEN2k", 0);

my $WebElementsBaseURL = "http://www.webelements.com/";
my $WebElementsURL     = "http://www.webelements.com/webelements/elements/text/{AtomName}/key.html";
my $WebElementsIEURL   = "http://www.webelements.com/webelements/elements/text/{AtomName}/ionz.html";
my $SPGDBBaseURL       = "http://www.cryst.ehu.es/";




	print "<H2>Make MXDOrto files for amoprhous structure.</H2>\n";

my $SaveDir = ".";
my $MXDFunction = 'MDNPT';

print "ARGV[0]: $ARGV[0]\n";
print "ARGV[1]: $ARGV[1]\n";

my $Outfile  = 'MXDInput.in';
my $compound = "(InGaZnO4)30";
if($ARGV[0]) {
	($compound) = ($ARGV[0] =~ /=(.*)$/);
}
my $density  = 6.0; # g/cm3
if($ARGV[1]) {
	($density) = ($ARGV[1] =~ /=(.*)$/);
}
print "Compound: $compound\n";
print "Density:  $density g/cm3\n";

my $R = new ChemicalReaction;

my ($pElement, $pnElement) = $R->CompoundToElements($compound);
#for(my $i = 0 ; $i < @$pElement ; $i++) {
#	my $element = $pElement->[$i];
#	my $ne      = $pnElement->[$i];
#print "  $ne * $element + ";
#}

my $MW = $R->MolecularWeight($compound);
print "MW=$MW\n";
print "NA=$NA\n";
my $V = ($MW / $NA) / $density;
print "V=$V cm3 = ", $V * 1.0e24, " A3\n";
my $a = $V**(1.0/3.0) * 1e8;
print "a=$a A\n";

my $rand = int(rand(1000));

print "<b>Create XTALDATA.DATA [$FileXTALDATA]</b>$LF";

unless(open(OUT,">$FileXTALDATA")) {
	print "Can not write to $FileXTALDATA.$LF$LF";
	return (-1);
}

print OUT ':"""""""""""""""""""""""""""""""""""""""""""""""""""""""""":', "\n";
print OUT ":   CRYSTAL DATA BASE      CREATED BY MXD.pm (C) T. Kamiya :\n";
print OUT ":..........................................................:\n";
print OUT ":                                                          :\n";
print OUT "----:----I----:----I----:----I----:----I----:----I----:----I\n";
print OUT "...................I                                        \n";

close(OUT);


print "Create [$Outfile]\n";
open(OUT, ">$Outfile") or "Error: $!: Can not write to [$Outfile]\n";

print OUT "CHAOS\n";
print OUT "$rand\n";
print OUT "$compound\n";
for(my $i = 0 ; $i < @$pElement ; $i++) {
	my $element = $pElement->[$i];
# O   GA   ZN   IN
	printf OUT "%-2s   ", ucfirst lc $element;
}
print OUT "\n";
for(my $i = 0 ; $i < @$pElement ; $i++) {
	my $ne      = $pnElement->[$i];
	printf OUT " %4d", $ne;
}
print OUT "\n";
printf OUT " %9f %9f %9f\n", $a, $a, $a;

print OUT<<EOT;
y
1
1
  300.00
y
EOT

close(OUT);

print "<b>Execute MXDInput [$MXDInputPath]</b>$LF";
print "<pre>\n";
if(system("$MXDInputPath < $Outfile") < 0) {
	print "Error: Can not execute [$MXDInputPath < $Outfile]\n";
	exit;
}

	print "<H2>Make MXDOrto files for amoprhous structure: finished</H2>\n";

exit;
