package PHASE;
use Exporter;
@ISA = qw(Exporter);
#公開したいサブルーチン
@EXPORT = qw();
#use lib "d:/Programs/Perl/lib";
use strict;
use File::Basename;
use ProgVars;
use Utils;
use GraphData;
use Sci::Science;
use Sci::EnergyBandArray;
#use MyTk::GraphFrameArray;
use Crystal::Crystal;
use Crystal::AtomType;
use Crystal::AtomSite;
use Crystal::XCrySDen;
use Crystal::CIF;
#===============================================
# スクリプト大域変数
#===============================================
my $LF = "
\n";
my $DirectorySeparator = Deps::DirectorySeparator(); #"\\";
#===============================================
# パス(読み込みDB)
# Web関係変数
# CGI の仮想パス
# プログラム名
#===============================================
my $Program = ProgVars::Program();
my $ProgramDir = ProgVars::ProgramDir();
my $ProgramOldDir = ProgVars::ProgramOldDir();
my $PHASEDir = ProgVars::PHASEDir();
my $PHASEPerlDir = ProgVars::PHASEPerlDir();
my $PHASEPotDir = ProgVars::PHASEPotDir();
my $WebRootDir = ProgVars::WebRootDir();
my $KListDBDir = ProgVars::KListDBDir();
#============================================================
# 変数等取得、再定義関数
#============================================================
sub ClearAll { my $this=shift; delete $this->{FileType}; delete $this->{DataArray}; }
sub FileType { return shift->{'FileType'}; }
sub FileName { return shift->{'FileName'}; }
sub SetFileName { my ($this,$f)=@_; return $this->{'FileName'} = $f; }
sub SetSampleName { my ($this,$n)=@_; return $this->{'SampleName'} = $n; }
sub SampleName { return shift->{'SampleName'}; }
sub KListDBDir {
my $this = shift;
return $this->{'KListDBDir'} if($this->{'KListDBDir'});
return $this->{'KListDBDir'} = $KListDBDir;
}
sub SetKListDBDir {
my($this, $d) = @_;
$this->{'KListDBDir'} = $d;
return $d;
}
sub GetFileName {
my($this, $path, $fname) = @_;
my $s;
if(-d $path) {
$s = $path;
}
else {
my ($drive, $dir, $filename, $ext, $lastdir, $filebody) = Deps::SplitFilePath($path);
#print "[$drive] [$dir] [$filename]\n";
if($drive) {
$s = Deps::MakePath($drive, $dir);
}
elsif($dir) {
$s = $dir;
}
else {
$s = '';
}
}
my $path2 = Deps::MakePath($s, $fname);
#print "s=$path2\n";
return $path2;
}
#============================================================
# 継承クラスで定義しなおす関数
#============================================================
#============================================================
# コンストラクタ、デストラクタ
#============================================================
sub new
{
my ($module) = @_;
my $this = {};
bless $this;
return $this;
}
sub DESTROY { my $this = shift; }
#============================================================
# ファイル読み込み関数
#============================================================
sub ReadPPDataToHash
{
my ($this, $path) = @_;
open(IN, $path) or return undef;
my @a = Utils::Split("\\s+", );
close(IN);
my %hash = (
Z => $a[0],
nVEL => $a[1],
);
return \%hash;
}
sub MakeControlInp
{
my ($this, $path, $Crystal) = @_;
$path = 'control.inp' if(!defined $path);
open(OUT, ">$path") or return undef;
my ($ax,$ay,$az,$bx,$by,$bz,$cx,$cy,$cz) = $Crystal->LatticeVectorsByOutputMode(0);
my $a0 = Sci::a0() * 1.0e10;
printf OUT "origin %8.5f %8.5f %8.5f\n", 0.0, 0.0, 0.0;
printf OUT "vector1 %8.5f %8.5f %8.5f\n", $ax / $a0, $ay / $a0, $az / $a0;
printf OUT "vector1 %8.5f %8.5f %8.5f\n", $bx / $a0, $by / $a0, $bz / $a0;
printf OUT "vector1 %8.5f %8.5f %8.5f\n", $cx / $a0, $cy / $a0, $cz / $a0;
close(OUT);
}
sub MakeKPointFile
{
my ($this, $path, $Crystal) = @_;
$path = 'kpoint.txt' if(!defined $path);
open(OUT, ">$path") or return undef;
print OUT<GetCSpaceGroup();
my $SPGName = $SPG->SPGName();
my $LatticeSystem;
if($SPGName =~ /^\s*F/) {
$LatticeSystem = 'facecentered';
}
elsif($SPGName =~ /^\s*I/) {
$LatticeSystem = 'bodycentered';
}
elsif($SPGName =~ /^\s*R/ or $SPGName =~ /^\s*P\s*3/) {
$LatticeSystem = 'rhombohedral';
}
elsif($SPGName =~ /P\s*6/) {
$LatticeSystem = 'hexagonal';
}
elsif($SPGName =~ /^\s*C/) {
$LatticeSystem = 'basecentered';
}
elsif($SPGName =~ /^\s*P/) {
$LatticeSystem = 'primitive';
}
else {
$LatticeSystem = '';
}
return $LatticeSystem;
}
sub GetDefaultFileNames
{
my ($this, $Function, $filebody) = @_;
$Function = '' if(!defined $Function);
$filebody = '' if(!defined $filebody);
my %FileNameList = (
F_INP => "Input_${Function}_${filebody}.txt",
F_KPOINT => 'kpoint.txt',
F_DYNM => 'nfdynm.txt',
F_CHGT => 'nfchgt.data',
F_CNST => 'nfinp.cnst.txt',
F_ENF => 'nfefn.txt',
F_ENERG => 'nfenergy.txt',
F_CNTN => 'continue.txt',
F_CNTN_BIN => 'continue_bin.data',
F_ZAJ => 'zaj.data',
F_STOP => 'nfstop.txt',
F_CHR => 'nfchr.cube',
F_DOS => 'dos.txt',
F_MODE => 'mode.data',
F_EPSOUT => 'eps.data',
F_WANNIER => 'nfwannier.cube',
);
return %FileNameList;
}
sub MakeFileNamesData
{
my ($this, $WriteDir, $path, $pFileNameList, $Functional, $PPType, $Crystal, $CopyFile) = @_;
$path = 'file_names.data' if(!defined $path);
$path =~ s/\\/\//g;
$path = Utils::MakePath($WriteDir, $path, '/', 0) if(defined $WriteDir);
print("\nCreate [$path]\n");
my @AtomTypeList = $Crystal->GetCAtomTypeList();
for(my $i = 1 ; $i <= @AtomTypeList ; $i++) {
my $name = $AtomTypeList[$i-1]->AtomNameOnly();
my $PPPath = $this->GetPPPath($name, $PPType, $Functional);
my ($drive, $dir, $filename, $ext, $lastdir, $filebody) = Deps::SplitFilePath($PPPath);
if($CopyFile) {
$pFileNameList->{"F_POT($i)"} = $filename;
my $TargetPath = ($WriteDir ne '')? Utils::MakePath($WriteDir, $filename, '/', 0) : $filename;
if(Utils::CopyFile($PPPath, $TargetPath)) {
print(" Copy [$PPPath] to [$TargetPath]\n");
}
else {
print(" Error in PHASE.pl: Can not copy [$PPPath] to [$TargetPath]\n");
exit;
}
}
else {
$pFileNameList->{"F_POT($i)"} = $PPPath;
}
}
open(OUT, ">$path") or return undef;
print OUT<>===
c & : VPP, VP
c \$ : DEC, HP, SUN
&fnames
F_INP = '$pFileNameList->{F_INP}'
EOT
for(my $i = 1 ; $i <= @AtomTypeList ; $i++) {
my $key = "F_POT($i)";
printf OUT " %-10s = '%s'\n", $key, $pFileNameList->{$key};
}
foreach my $key qw(F_KPOINT F_DYNM F_CHGT F_CNST F_CNTN_BIN F_ENF F_ENERG F_CNTN F_ZAJ F_STOP
F_CHR F_DOS F_MODE F_EPSOUT F_WANNIER) {
printf OUT " %-10s = '%s'\n", $key, $pFileNameList->{$key} if(defined $pFileNameList->{$key});
}
print OUT " &end\n";
print OUT<