#!/usr/bin/perl

use lib 'd:/Programs/Perl/lib';

use strict;

use Sci::OpticalMaterial;
use Sci::MultiLayer;

#=========================================================
# Ο
#=========================================================
my $SubstrateEpsPath  = "substrate.csv";
my $BackgroundEpsPath = "HQ_annealed-Layer1-Film1.csv";
my $CalSpectrumCSV    = "CalSpectrum.csv";

my $Emin  = 0.0001; #0.50; #eV
my $Emax  = 3.0000; #4.95;
my $Estep = 0.0050; #0.05;
my $nE    = int( ($Emax - $Emin) / $Estep + 1.001);

my $IncidentAngle      = 0.0;
my $SubstrateThickness = 0.5e-3;  # m, Substrate thickness
my $FilmThickness      = 365.878; # nm, Film thickness

# Constant background
my $e1inf =   0.0;
my $e2inf =   0.0;

# For Tauc-Lorentz
my $A     =  100.0;
my $Eg    =   3.10; # eV, Tauc gap
my $En0   =   3.70; # eV, Lorentz oscillation energy
my $C     =   4.50; # eV, Damping factor

# For Lorentz
my $LorentzNe    = 0.4;  # 1e26 m-3
my $LorentzE0    = 2.80; # eV
my $Lorentzgamma = 0.30; # eV

# For Drude
my $DrudeEp      = 0.60; # eV
my $Drudetau     = 5.00; # fs

# For Epsilon Array
my (@E, @e1sub, @e2sub, @e1film, @e2film);
for(my $i = 0 ; $i < $nE ; $i++) {
	$E[$i] = $Emin + $i * $Estep;
	$e1sub[$i]  = 1.5;
	$e2sub[$i]  = 0.0;
	$e1film[$i] = 2.0;
	$e2film[$i] = 0.0;
}

#=========================================================
# ΟwfΜμ»
#=========================================================
my $Layers = new MultiLayer;
$Layers->SetIncidentAngle($IncidentAngle);

my $Air       = new OpticalMaterial("air");
my $Substrate = new OpticalMaterial("Specify", "Substrate");
my $Film      = new OpticalMaterial("Specify", "Film");
$Layers->AddLayer($Air,       -1.0,                  0.0);
$Layers->AddLayer($Film,      $FilmThickness*1.0e-9, 1.0);
$Layers->AddLayer($Substrate, $SubstrateThickness,   0.0);
$Layers->AddLayer($Air,       -1.0,                  0.0);

#$Substrate->AddDielectricModel(
#		"SubstrateFile1",
#		"EFile",
#		"Path", $SubstrateEpsPath,
#	);
$Substrate->AddDielectricModel(
		"SubstrateEps1",
		"EpsArray",
		"pE",  \@E,
		"pe1", \@e1sub,
		"pe2", \@e2sub,
	);

$Film->SetThickness($FilmThickness*1.0e-9);
#$Film->AddDielectricModel(
#		"FilmFile1",
#		"EFile",
#		"Path", $BackgroundEpsPath,
#	);
$Film->AddDielectricModel(
		"FilmEps1",
		"EpsArray",
		"pE",  \@E,
		"pe1", \@e1film,
		"pe2", \@e2film,
	);
$Film->AddDielectricModel(
		"Constant1",
		"Constant",
		"e1inf", $e1inf,
		"e2inf", $e2inf,
	);
$Film->AddDielectricModel(
		"TaucLorentz1",
		"TaucLorentz",
		"A",     $A,
		"Eg",    $Eg,
		"En0",   $En0,
		"C",     $C
	);
$Film->AddDielectricModel(
		"Lorentz1",
		"Lorentz",
		"Ne", $LorentzNe*1.0e26, # m-3
		"E0", $LorentzE0,
		"G",  $Lorentzgamma,
	);
$Film->AddDielectricModel(
		"Drude1",
		"Drude",
		"Ep",  $DrudeEp,          # eV
		"tau", $Drudetau*1.0e-15, # s
	);

#=========================================================
# UdΦAXyNgΜvZ
#=========================================================
open(OUT, ">$CalSpectrumCSV") or die "$!: $CalSpectrumCSV\n";
printf(OUT "E(eV),wl(nm),f(THz),e1,e2,n,k,alpha(cm-1),T,R\n");
for(my $i = 0 ; $i < $nE ; $i++) {
	my $E = $Emin + $i * $Estep; # eV
	my $WL = Optics::eVTonm($E); # nm
	my $nu = Optics::nmToHz($WL) * 1.0e-12; # THz

# ΜUdΦ
	my ($e1film, $e2film) = $Film->CalEps($E);
	my ($nfilm, $kfilm)   = Optics::EpsToNK($e1film, $e2film);
	my $alpha             = Optics::KToAlpha($WL, $kfilm);

# ^σ//ξΒ/^σ\’ΜU½ΛE§ί¦ΖGlM[½Λ¦E§ί¦isΞυApΞυj
	my ($rs123, $rp123, $ts123, $tp123, $Rtots, $Rtotp, $Ttots, $Ttotp) = $Layers->CalFresnelCoefficient($E);
	printf("%6.4g eV: e=(%8.4g, %8.4g) T=%8.4g R=%8.4g\n", $E, $e1film, $e2film, $Ttots, $Rtots);
	print(OUT "$E,$WL,$nu,$e1film,$e2film,$nfilm,$kfilm,$alpha,$Ttots,$Rtots\n");
}
close(OUT);

exit;

#==================================================================
# C[`IΉ
#==================================================================


#==================================================================
# Φ
#==================================================================
