package ProgVars; use Common; @ISA = qw(Common); #公開したいサブルーチン @EXPORT = qw($TSPACEDir $TSPACEDBDir); use strict; use File::Path; use File::Basename; use File::Find; use Deps; use Utils; use Template; #=============================================== # デバッグ関係変数 #=============================================== my $Debug = 0; #=============================================== # スクリプト大域変数 #=============================================== my $OS = $^O; my $Program = basename($0); my $home = ($ENV{HOME})? $ENV{HOME} : ''; my $tkProg_Root = $ENV{'tkProg_Root'}; my $tkprog_X_path = $ENV{'tkprog_X_path'}; my $tkapp_path = $ENV{'tkapp_path'}; my $tkprog_path = $ENV{'tkprog_path'}; my $tklib_Root = $ENV{'tklib_Root'}; my $tklib_path = Deps::MakePath($tklib_Root, ["Perl", "lib"], 0); my $tkdb_path = Deps::MakePath($tkProg_Root, ["tkdb"], 0); my $tkapp_path = Deps::MakePath($tkProg_Root, ["tkapp_Win"], 0); my $tkapp2_path = Deps::MakePath($tkProg_Root, ["tkapp2_Win"], 0); my $ProgramDir = $tkProg_Root; my $BinDir = Deps::MakePath($tkProg_Root, "bin", 0); my $BaseDir = Deps::MakePath($ENV{'tkprog_path'}, 'Perl', 0); my $TkPerlDir = $BaseDir; my $DBRootDir = Deps::MakePath($tkProg_Root, ["tkdb"], 0); my $DBDir = Deps::MakePath($DBRootDir, ["Databases"], 0); if($ENV{'TkDatabasesDir'} and -d $ENV{'TkDatabasesDir'}) { $DBDir = $ENV{'TkDatabasesDir'}; } my $PeriodicTableDir = $DBDir; if($OS eq 'MSWin32') { } elsif($OS eq 'linux') { $ProgramDir = Utils::MakePath('/home/share/', 'bin', '/', 0); $ProgramDir = Utils::MakePath($ENV{HOME}, 'bin', '/', 0) if(!-d $ProgramDir); $ProgramDir = $ENV{TkProgramsDir} if !-d $ProgramDir; $ProgramDir = $ENV{TkProgramsBinDir} if !-d $ProgramDir; $BinDir = $ProgramDir; $BinDir = $ENV{TkProgramsBinDir} if !-d Utils::MakePath($BinDir, 'Databases', 0); } my $VASPDir = Deps::MakePath($TkPerlDir, "VASP", 0); my $VASPDBDir = Deps::MakePath($DBRootDir, ["VASP"], 0); my $XRDDir = Deps::MakePath($tkapp_path, ["XRD"], 0); my $RietanFPDir = Deps::MakePath($XRDDir, ["Rietan-FP"], 0); my $RietanFPTemplateDir = Deps::MakePath2($tkprog_X_path, ["crystal", "RietanFP", "Template"], 0); #my $RietanFPTemplateDir = Deps::MakePath2($tkprog_path, ["Perl", "RietanFP", "Template"], 0); if($OS eq 'MSWin32') { } elsif($OS eq 'linux') { $RietanFPDir = "$ENV{HOME}/bin/RietanFP"; } my $LDDir = Deps::MakePath($TkPerlDir, ["MD", "LD"], 0); my $DVXaDir = Deps::MakePath($tkapp2_path, ["Quantum", "DVXa97"], 0); $DVXaDir = "$home/bin/Perl/DVXa97" if(!-d $DVXaDir); $DVXaDir = "d:/tkProg/tkapp_etc/Quantum/DVXa97" if(!-d $DVXaDir); $DVXaDir = "c:/tkProg/tkapp_etc/Quantum/DVXa97" if(!-d $DVXaDir); our $TSPACEDir = Deps::MakePath($TkPerlDir, ["TSPACE"], 0); our $TSPACEDBDir = Deps::MakePath($TSPACEDir, ["Databases"], 0); my $WebRootDir = "d:\\MyWebs"; $WebRootDir = "d:\\MyWebs" if(!-d $WebRootDir); my $KListDBDir = Deps::MakePath($WebRootDir, ["Research", "klist"], 1); if($OS eq 'linux') { $KListDBDir = Deps::MakePath($ENV{HOME}, ["bin", "klist"], 1); $KListDBDir = Deps::MakePath("/home/share", ["bin", "klist"], 1) if(!-d $KListDBDir); } my $SGROUPPath = 'sgroup'; $SGROUPPath = Deps::MakePath($ENV{WIENROOT}, 'sgroup', 0); my $TEEPath = 'tee'; if($OS eq 'MSWin32') { $SGROUPPath = Deps::MakePath($TkPerlDir, ["WIEN2k", "sgroup.exe"]); $TEEPath = Deps::MakePath($BinDir, "tee.exe"); } if(0) { print("\n"); print("New perl dirs\n"); print("tkProg_Root: $tkProg_Root\n"); print("tkprog_X_path: $tkprog_X_path\n"); print("tkapp_path: $tkapp_path\n"); print("tkprog_path: $tkprog_path\n"); print("tkapp_path: $tkapp_path\n"); print("tkapp2_path: $tkapp2_path\n"); print("ProgramDir: $ProgramDir\n"); print("\n"); print("Old perl dirs\n"); print("BinDir: $BinDir\n"); print("BaseDir: $BaseDir\n"); print("TkPerlDir: $TkPerlDir\n"); print("DBRootDir: $DBRootDir\n"); print("VASPDir: $VASPDir\n"); print("VASPDBDir: $VASPDBDir\n"); print("RietanFPDir: $RietanFPDir\n"); print("LDDir: $LDDir\n"); print("DVXaDir: $DVXaDir\n"); print("\n"); } my $MXDDir = Deps::MakePath($TkPerlDir, ["MD", "MXD"], 0); my $MXDExecDir = Deps::MakePath($MXDDir, "exec", 0); my $MXDOrtoDir = Deps::MakePath($MXDDir, "MXDOrto", 0); my $MXDInputPath = Deps::MakePath($MXDExecDir, "MXDInput.exe", 0); my $SX1DBPath = Deps::MakePath($tkdb_path, ["MXD", "SX-1.txt"], 0); #if($OS eq 'MSWin32') { #} #elsif($OS eq 'linux') { # $SX1DBPath = Deps::MakePath("$ENV{HOME}/bin/MD/MXD", "SX-1.txt", 0); #} my $LAMMPSPerlDir = Deps::MakePath($TkPerlDir, ["LAMMPS"], 0); my $GULPDir = Deps::MakePath($TkPerlDir, ["MD", "gulp-5.0"], 0); my $GULPLibDir = Deps::MakePath($GULPDir, "Libraries", 0); my $QEDir = Deps::MakePath($TkPerlDir, "QE", 0); my $QEPPDir = Deps::MakePath($QEDir, "pseudo", 0); my $PHASEDir = Deps::MakePath($TkPerlDir, ["Quantum", "PHASE"], 0); $PHASEDir = "$home/bin/Perl/PHASE" if(!-d $PHASEDir); my $PHASEPerlDir = Deps::MakePath($TkPerlDir, ["PHASE"], 0); $PHASEPerlDir = "$home/bin/Perl/PHASE" if(!-d $PHASEPerlDir); #my $PHASEPotDir = Deps::MakePath($ProgramOldDir, ["Quantum", "PHASE", "pp"], 0); # $PHASEPotDir = "$home/bin/Perl/PHASE" if(!-d $PHASEPotDir); my $SCIGRESSDir = Deps::MakePath($TkPerlDir, ["SCIGRESS"], 0); my $CRYSTAL06Dir = Deps::MakePath($TkPerlDir, "CRYSTAL", 0); unless(-d $CRYSTAL06Dir) { my $HOME = ''; $HOME = $ENV{'HOME'} if($ENV{'HOME'}); $CRYSTAL06Dir = "$HOME/bin/Perl/CRYSTAL"; } sub OS { return $OS; } sub BootDir { return Deps::ExtractDirectory($0); } sub tklib_path { return $tklib_path; } sub Program { return $Program; } sub ProgramDir { return $ProgramDir; } #sub ProgramOldDir { return $ProgramOldDir; } sub BaseDir { return $BaseDir; } sub TkPerlDir {return $TkPerlDir; } sub BinDir { return $BinDir; } sub DBRootDir { return $DBRootDir; } sub DBDir { return $DBDir; } sub VASPDir { return $VASPDir; } sub VASPDBDir { return $VASPDBDir; } #sub VASPProgOldDir { return $VASPProgOldDir; } sub QEDir { return $QEDir; }; sub QEPPDir { return $QEPPDir; }; sub PHASEDir { return $PHASEDir; } sub PHASEPerlDir { return $PHASEPerlDir; } #sub PHASEPotDir { return $PHASEPotDir; } sub CRYSTAL06Dir { return $CRYSTAL06Dir; } sub DVXaDir { return $DVXaDir; } sub SCIGRESSDir { return $SCIGRESSDir; } sub XRDDir { return $XRDDir; } #sub RietanDir { return $RietanDir; } #sub RietanTemplateDir { return $RietanTemplateDir; } sub RietanFPDir { return $RietanFPDir; } sub RietanFPTemplateDir { return $RietanFPTemplateDir; } sub PeriodicTableDir { return $PeriodicTableDir; } sub MXDDir { return $MXDDir; } sub MXDExecDir { return $MXDExecDir; } sub MXDOrtoDir { return $MXDOrtoDir; } sub MXDInputPath { return $MXDInputPath; } sub SX1DBPath { return $SX1DBPath; } sub LDDir { return $LDDir; } sub LAMMPSPerlDir { return $LAMMPSPerlDir; } sub GULPDir { return $GULPDir; } sub GULPLibDir { return $GULPLibDir; } sub WebRootDir { return $WebRootDir; } sub KListDBDir { return $KListDBDir; } sub SGROUPPath { return $SGROUPPath; } sub TEEPath { return $TEEPath; } #============================================================ # コンストラクタ、デストラクタ #============================================================ sub new { my ($module, $app) = @_; my $this = {}; bless $this; # $this->SUPER::new(@_); return $this; } sub DESTROY { my $this = shift; $this->SUPER::DESTROY(@_); } #============================================================ # 一般関数 #============================================================ sub ReadConfigure { my ($this, $ini, $pParams, $UpdateVars, $PrintVars) = @_; $UpdateVars = 0 if(!defined $UpdateVars); $PrintVars = 0 if(!defined $PrintVars); #print "0=$0\n"; #print "Program=$Program\n"; my $BootDir = &BootDir(); my $InFile = $ini; $InFile = Deps::MakePath($BootDir, $ini, 0) if(!-f $InFile); $InFile = Deps::MakePath($ProgramDir, $ini, 0) if(!-f $InFile); if($PrintVars) { print "ProgVars::ReadConfigure: Read variables from [$InFile]\n"; } my %v; my $in = JFile->new($InFile, 'r'); return $pParams if(!$in); while(1) { my $line = $in->ReadLine(); last if(!defined $line); next if($line =~ /^\s*#/); my ($key, $var) = ($line =~ /^\s*(\S+)\s*=\s*(.*?)\s*$/); next if(!defined $key); #print "$key: $var\n"; $var = Template->new()->ReplaceByHash($var, \%v, '{', '}'); $v{$key} = $var; if($PrintVars) { print " $key=$v{$key}\n"; } $var =~ s/\\/\//g; if($UpdateVars) { my $cmd = "\$$key = '$var'"; #print "cmd: $cmd\n"; eval($cmd); } } $in->Close(); #foreach my $key (sort keys %v) { #print "$key: $v{$key}\n"; #} #exit; $pParams = Utils::MergeHash($pParams, \%v); if($PrintVars) { print "\n"; } return $pParams; } 1;