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<