#=============================================== # EnergyBandArray #=============================================== package EnergyBandArray; #use Exporter; #@ISA = qw(Exporter); use strict; use Sci::EnergyBand; sub SetTitle { my ($this,$t)=@_; return $this->{'Title'} = $t; } sub Title { return shift->{'Title'}; } sub GetpEnergyBandArray { return shift->{'pEnergyBnadArray'}; } sub SetCrystal { my ($this,$crystal) = @_; $this->{'Crystal'} = $crystal; my $pBandArray = $this->GetpEnergyBandArray(); for(my $i = 0 ; $i < @$pBandArray ; $i++) { $pBandArray->[$i]->SetCrystal($crystal); } return $this->Crystal(); } sub Crystal { return shift->{'Crystal'}; } sub SetUnit { my ($this,$u) = @_; $this->{'Unit'} = $u; my $pBandArray = $this->GetpEnergyBandArray(); for(my $i = 0 ; $i < @$pBandArray ; $i++) { $pBandArray->[$i]->CalMinMax(); } return $this->Unit(); } sub Unit { return shift->{'Unit'}; } sub CalXMinMax { my ($this) = @_; my $pBandArray = $this->GetpEnergyBandArray(); for(my $i = 0 ; $i < @$pBandArray ; $i++) { $pBandArray->[$i]->CalMinMax(); } } sub CalYMinMax { my ($this) = @_; my $pBandArray = $this->GetpEnergyBandArray(); for(my $i = 0 ; $i < @$pBandArray ; $i++) { $pBandArray->[$i]->CalMinMax(); } } sub CalMinMax { my ($this) = @_; my $pBandArray = $this->GetpEnergyBandArray(); for(my $i = 0 ; $i < @$pBandArray ; $i++) { $pBandArray->[$i]->CalMinMax(); } } sub nEnergyBand { my ($this) = @_; my $pEnergyBandArray = $this->GetpEnergyBandArray(); return @$pEnergyBandArray; } sub GetEnergyBand { my ($this,$i) = @_; my $pEnergyBandArray = $this->GetpEnergyBandArray(); return $pEnergyBandArray->[$i]; } sub pDistance { my ($this, $i) = @_; return undef unless(defined $this->GetEnergyBand($i)); return $this->GetEnergyBand($i)->pDistance(); } sub pEnergy { my ($this, $i) = @_; return $this->GetEnergyBand($i)->pEnergy(); } sub GetXMinMax { my ($this, $i) = @_; return $this->GetEnergyBand($i)->GetXMinMax(); } sub GetYMinMax { my ($this, $i) = @_; return $this->GetEnergyBand($i)->GetYMinMax(); } #============================================================ # コンストラクタ、デストラクタ #============================================================ sub new { my ($module) = @_; my $this = {}; bless $this; my @EnergyBandArray; $this->{'pEnergyBnadArray'} = \@EnergyBandArray; return $this; } sub DESTROY { my $this = shift; } sub AddEnergyBand { my ($this) = @_; my $n = $this->nEnergyBand(); my $pEnergyBandArray = $this->GetpEnergyBandArray(); $pEnergyBandArray->[$n] = new EnergyBand; $pEnergyBandArray->[$n]->SetCrystal($this->Crystal()); } sub GetBandBoundary { my ($this, $fRecalc) = @_; my $n = $this->nEnergyBand(); my $pEnergyBandArray = $this->GetpEnergyBandArray(); my @BandBoundaryDistance; my @BoundaryPositions; for(my $i = 0 ; $i < $n ; $i++) { my ($pBandBoundaryDistance, $pBoundaryPositions) = $pEnergyBandArray->[$i]->GetBandBoundary($fRecalc); next unless(defined $pBoundaryPositions); @BandBoundaryDistance = (@BandBoundaryDistance, @$pBandBoundaryDistance); @BoundaryPositions = (@BoundaryPositions, @$pBoundaryPositions); } return (\@BandBoundaryDistance, \@BoundaryPositions); } sub AddByKE { my ($this, $i, $kx, $ky, $kz, $e) = @_; $this->GetEnergyBand($i)->AddByKDE($kx, $ky, $kz, undef, $e); } sub AddByKDE { my ($this, $i, $kx, $ky, $kz, $ktot, $e) = @_; $this->GetEnergyBand($i)->AddByKDE($kx, $ky, $kz, $ktot, $e); } sub SetGraphDataArray { my ($this, $DataArray) = @_; my $Data = new GraphData; $Data->SetTitle($this->Title()); for(my $iL = 0 ; ; $iL++) { last unless(defined $this->pDistance($iL)); $Data->{"x$iL"} = $this->pDistance($iL); $Data->{"y$iL"} = $this->pEnergy($iL); my ($ymin, $ymax) = $this->GetYMinMax($iL); my $s = "Band $iL ($ymin - $ymax)"; $Data->{"x${iL}_Name"} = "k"; $Data->{"y${iL}_Name"} = $s; } $Data->CalMinMax(); my ($pBandBoundaryDistance, $pBoundaryPositions) = $this->GetBandBoundary(); $DataArray->{'pBandBoundaryDistances'} = $pBandBoundaryDistance; $DataArray->{'pBandBoundaryPositions'} = $pBoundaryPositions; # $DataArray->{'pKPointNameArray'} = $pKPointNameArray; $DataArray->AddGraphData($Data); } 1;