#=============================================== # ElectricalMultiLayer #=============================================== package ElectricalMultiLayer; use Common; @ISA = qw(Common); #公開したいサブルーチン #@EXPORT = qw(aa ); use strict; use Math::Complex; use Utils; use Sci qw($pi $pi2 $e0 $e $c $h $hbar $me $kB $torad $todeg); use Sci::ConductingMaterial; #=============================================== # 大域変数 #=============================================== #============================================================ # 変数等取得関数 #============================================================ sub nLayer { return shift->{nLayer}; } sub pLayerArray { return shift->{pLayerArray}; } sub pLayer { my($this,$idx)=@_; return $this->{pLayerArray}->[$idx]; } sub SetLayerThickness { my ($this, $idx, $Thickness) = @_; my $pLayer = $this->pLayer($idx); return $this->{"Thickness$idx"} = $Thickness; } sub LayerThickness { my ($this, $idx) = @_; return $this->{"Thickness$idx"}; } sub pLayerThickness { my ($this, $idx) = @_; my $p = \$this->{"Thickness$idx"}; return $p; } sub SetTemperature { my ($this, $T) = @_; my $n = $this->nLayer(); for(my $i = 0 ; $i < $n ; $i++) { return $this->pLayer($i)->SetTemperature($T); } } sub Temperature { my($this,$i)=@_; return $this->pLayer($i)->Temperature(); } sub SetCrossSectionArea { my($this,$S)=@_; return $this->{S} = $S; } sub CrossSectionArea { return shift->{S}; } sub SetVariable { my ($this, $idx, $VarName, $val) = @_; my $pLayer = $this->pLayer($idx); return $pLayer->SetVariable($VarName, $val); } sub pVariable { my ($this, $idx, $VarName) = @_; my $pLayer = $this->pLayer($idx); if(!defined $pLayer) { print "MultiLayer::pVariable: Undefined pLayer for index=$idx.\n"; return undef; } my $p = $pLayer->pVariable($VarName); if(!defined $p) { print "MultiLayer::pVariable: Undefined Variable [$VarName] for index=$idx.\n"; return undef; } return $p; } #============================================================ # コンストラクタ、デストラクタ #============================================================ sub new { my ($module) = @_; my $this = {}; bless $this; $this->Initialize(); return $this; } sub DESTROY { my $this = shift; } #============================================================ # 一般関数 #============================================================ sub Initialize { my ($this) = @_; $this->{nLayer} = 0; $this->{pLayerArray} = []; } sub AddLayer { # $pMaterial = Object: ConductingMaterial # $Thickness: m my ($this, $pMaterial, $Thickness) = @_; my $n = $this->{nLayer}; $this->{pLayerArray}->[$n] = $pMaterial; if(defined $Thickness) { $this->SetLayerThickness($n, $Thickness); } return $this->{nLayer}++; } sub PrintLayers { my ($this) = @_; print("Layers:\n"); my $nLayer = $this->nLayer(); for(my $i = 0 ; $i < $nLayer ; $i++) { my $pLayer = $this->pLayer($i); my $name = $pLayer->Name(); my $d = $this->LayerThickness($i) * 1.0e9; # nm if($d < 0.0) { print("$i: $name (infinite)\n"); } elsif($d < 500.0) { print("$i: $name ($d nm)\n"); } elsif($d < 500.0e3) { $d *= 1.0e-3; print("$i: $name ($d um)\n"); } elsif($d < 500.0e6) { $d *= 1.0e-6; print("$i: $name ($d mm)\n"); } elsif($d < 500.0e9) { $d *= 1.0e-9; print("$i: $name ($d m)\n"); } } } 1;