#=============================================== # Optics #=============================================== package Optics; use Exporter; @ISA = qw(Exporter); #公開したいサブルーチン #@EXPORT = qw(aa ); use strict; use Math::Complex; use Utils; use JFile; use CSV; use GraphData; use Sci::GeneralFileFormat; use Sci::Science; my $pi = Sci::pi(); my $e0 = Sci::e0(); my $e = Sci::e(); my $c = Sci::c(); my $h = Sci::h(); my $hbar = Sci::hbar(); my $me = Sci::me(); my $kB = Sci::kB(); sub new { my ($module) = @_; my $this = {}; bless $this; return $this; } sub DESTROY { my $this = shift; } sub KKConversion { my ($this, $pE, $pf, $ExtraporateLow, $ExtraporateHigh, $Integrator) = @_; my $nData = @$pE; my $Minf = $pE->[0]; my $df = $pE->[1] - $pE->[0]; my @Q; my $Coeff = 2.0/$pi * $df; for(my $i = 0 ; $i < $nData ; $i++) { my $fg = $pE->[$i]; my $idx = int(($fg - $Minf) / $df + 0.001); my $j0 = 0; $j0 = 1 if($idx % 2 == 0); my $v = 0.0; if($Integrator eq "Rectangular") { for(my $j = $j0 ; $j < $nData ; $j += 2) { my $fj = $pf->[$j]; $v += ($pf->[$j] - $pf->[$i]) / ($fj*$fj - $fg*$fg); } } elsif($Integrator eq "Simpson") { for(my $j = $j0 ; $j <= $nData-3 ; $j += 2) { next if($i-3 <= $j and $j <= $i); my $fj = $pE->[$j]; my $fj1 = $pE->[$j+1]; my $fj2 = $pE->[$j+2]; $v += 1.0/3.0 * ( 0.5 * ($pf->[$j] - $pf->[$i]) / ($fj*$fj - $fg*$fg) + 2.0 * ($pf->[$j+1] - $pf->[$i]) / ($fj1*$fj1 - $fg*$fg) + 0.5 * ($pf->[$j+2] - $pf->[$i]) / ($fj2*$fj2 - $fg*$fg) ); } } else { $this->print("Error!!: Invalid Integrator [$Integrator]\n"); return -5; } $v *= $Coeff * $fg; my $jmax = $nData - 1; $jmax-- if(($j0+$jmax) % 2 != 0); $j0 = 0 if($j0 == 1); my $fmin = $pE->[$j0] - $df; $fmin -= $df if(abs($fmin-$fg) < 1.0); my $lnR2min = $pf->[$j0]; my $fmax = $pE->[$jmax] + $df; $fmax += $df if(abs($fmax-$fg) < 1.0); my $lnR2max = $pf->[$nData-1]; if($ExtraporateLow eq "Drude") { $v += $lnR2min / $pi * log( ($fg-$fmin)/($fmin+$fg) ) } elsif($ExtraporateLow eq "None") { } else { $this->print("Error!!: Invalid Extraporation to low f [$ExtraporateLow]\n"); return -3; } if($ExtraporateHigh eq "Constant") { $v += $lnR2max / $pi * log( ($fmax+$fg)/($fmax-$fg) ); } elsif($ExtraporateHigh eq "None") { } else { $this->print("Error!!: Invalid Extraporation to high f [$ExtraporateHigh]\n"); return -3; } $Q[$i] = -$v; } return (\@Q); } 1;