一方で、多層膜は、材料と膜厚を選べば反射率を高めることもでき、縦型のレーザー(VCSEL)に使われます。VCSELでは、発光層を、ミラーである誘電体多層膜(DBR)で挟むことで、レーザー発振させます。100%に近いミラーを実現することで、特定の波長の光を閉じ込めることができ、VCSELの効率が向上します。VCSEL実現には、DBR(とcavity長)がとても重要な要素です。
GaN上のSiO2/TiO2多層膜の反射率を計算してみました。波長410 nm、多層膜の周期を7層、それぞれの膜厚はλ/4としました。(横軸:エネルギ(eV)、縦軸:反射率(%))。
【補足】
お礼:複素数計算のモジュールとして、ここを使わせて頂きました。クラスtest以外はそこのコピペです。感謝申し上げます。
練習目的:VBAでの複素数(EXP(ix))の計算
懸念事項1:誘電体の反射率の値。ネットにあるindexを参照したが、短波長側の情報が少ない。もっと正確な実験値を用いるべき。
懸念事項2:3.5eV付近で反射率が100%を超えている。計算おかしい?
およそ2.5~3.5eV(波長350-500nm)までの光(青と紫色)を、ほぼ100%反射させることができるのが分かります。実際にDBRを蒸着すると、透明だったサンプルが青紫色の光沢がでます。InGaN活性層の光の波長は、400-450nm程度なのでこの条件で使えそうです。3.4eV以上(波長360 nm以下)の光は、GaNのバンドギャップよりも大きくなるため、GaN層に吸収されます(本計算では考慮していない)。
VCSEL用のソフトウエアや、MATLABのmultidiel関数を使えば、非常に簡単にかつ正確に描けます。しかし、MATLABや専門ソフトは1万円以上するので、一般家庭でも計算できるようにVBAで計算してみました。実際に、MATLABの計算結果と比較してみましたが、ほぼ同じ形状と値が出ているので、参考程度に使えると思います。さらに発展させれば、フォトニック結晶も計算できそうですね。
実際のDBRでは、高誘電体材料であるTiO2は、アナターゼとルチル相の混在により、正確な制御が難しく、より高いindexを持つTa2O5が優位とされています。SiO2/TiO2の代わりにAlN/GaNとすれば、BottomのDBRの反射率も計算できます。30層は要りそうですね(一日成長?)。
Option Explicit
'=======【 標準モジュール 】============
' ※ 直接[Real, Imag, Value]へ値を代入しない事!
' 変数は初期化し、値の代入は必ず[CompSet, CompSetStr]で行なう事
Public Type Complex
Real As Double '実数部
Imag As Double '虚数部
Value As String '複素数表示
End Type
'<< 初期化 >>
Public Function CompInit() As Complex
Dim CmpWK As Complex
CmpWK.Real = 0
CmpWK.Imag = 0
CmpWK.Value = "0"
CompInit = CmpWK
End Function
'<< 加算 >>
Public Function CompSum(ByRef Cmp1 As Complex, ByRef Cmp2 As Complex) As Complex
Dim CmpWK As Complex
CmpWK.Real = Cmp1.Real + Cmp2.Real
CmpWK.Imag = Cmp1.Imag + Cmp2.Imag
CmpWK.Value = CompStr(CmpWK)
CompSum = CmpWK
End Function
'<< 引算 >>
Public Function CompDiff(ByRef Cmp1 As Complex, ByRef Cmp2 As Complex) As Complex
Dim CmpWK As Complex
CmpWK.Real = Cmp1.Real - Cmp2.Real
CmpWK.Imag = Cmp1.Imag - Cmp2.Imag
CmpWK.Value = CompStr(CmpWK)
CompDiff = CmpWK
End Function
'<< 乗算 >>
Public Function CompMult(ByRef Cmp1 As Complex, ByRef Cmp2 As Complex) As Complex
Dim CmpWK As Complex
CmpWK.Real = Cmp1.Real * Cmp2.Real - Cmp1.Imag * Cmp2.Imag
CmpWK.Imag = Cmp1.Real * Cmp2.Imag + Cmp1.Imag * Cmp2.Real
CmpWK.Value = CompStr(CmpWK)
CompMult = CmpWK
End Function
'<< 除算 >>
Public Function CompDiv(ByRef Cmp1 As Complex, ByRef Cmp2 As Complex) As Complex
Dim CmpWK As Complex
Dim dblDIV As Double
If (Cmp2.Real = 0) And (Cmp2.Imag = 0) Then
'初期化されていない可能性もあるので[Value = "0"]では比較しない
CmpWK.Real = 0
CmpWK.Imag = 0
Else
dblDIV = (Cmp2.Real ^ 2) + (Cmp2.Imag ^ 2)
CmpWK.Real = ((Cmp1.Real * Cmp2.Real) _
+ (Cmp1.Imag * Cmp2.Imag)) / dblDIV
CmpWK.Imag = ((Cmp1.Imag * Cmp2.Real) _
- (Cmp1.Real * Cmp2.Imag)) / dblDIV
End If
CmpWK.Value = CompStr(CmpWK)
CompDiv = CmpWK
End Function
'<< 共役複素数 >>
Public Function CompCnj(ByRef Cmp1 As Complex) As Complex
Dim CmpWK As Complex
CmpWK.Real = Cmp1.Real
CmpWK.Imag = (-1) * Cmp1.Imag
CmpWK.Value = CompStr(CmpWK)
CompCnj = CmpWK
End Function
'<< 絶対値 >>
Public Function CompAbs(ByRef Cmp1 As Complex) As Complex
Dim CmpWK As Complex
CmpWK.Real = Sqr(Cmp1.Real ^ 2 + Cmp1.Imag ^ 2)
CmpWK.Imag = 0
CmpWK.Value = CompStr(CmpWK)
CompAbs = CmpWK
End Function
'<< 複素数 生成(実数/虚数 指定) >>
Public Function CompSet(ByVal Real As Double, ByVal Imag As Double) As Complex
Dim CmpWK As Complex
CmpWK.Real = Real
CmpWK.Imag = Imag
CmpWK.Value = CompStr(CmpWK)
CompSet = CmpWK
End Function
'<< 複素数 生成(複素数 表示) >>
Public Function CompSetStr(ByVal CmpStr As String) As Complex
Dim i As Integer
Dim cntP As Integer
Dim cntM As Integer
Dim cntI As Integer
Dim strReal As String
Dim strImag As String
Dim CmpWK As Complex
For i = 1 To Len(CmpStr)
Select Case Mid(CmpStr, i, 1)
Case "+": cntP = cntP + 1
Case "-": cntM = cntM + 1
Case "i": cntI = cntI + 1
Case "."
Case "0" To "9"
Case Else
cntI = cntI + 2 'Errにする為
End Select
Next i
If (cntP > 2) Or (cntM > 2) Or ((cntP + cntM) > 2) Then
GoTo Err
ElseIf (cntI > 1) Or _
((cntI = 1) And (Right(CmpStr, 1) <> "i")) Then
GoTo Err
ElseIf ((cntP + cntM) = 2) Then
Select Case Left(CmpStr, 1)
Case "+", "-"
Case Else
GoTo Err
End Select
End If
Select Case (cntP + cntM)
Case 0
If (cntI = 0) Then '正の実数のみ
strReal = CmpStr
strImag = ""
Else '正の虚数のみ
strReal = ""
strImag = CmpStr
End If
Case 1
If (cntI = 0) Then '(正)/負の実数のみ
strReal = CmpStr
strImag = ""
Else '(正)の実数と正/負の虚数
i = InStr(CmpStr, "+")
If (i = 0) Then
i = InStr(CmpStr, "-")
End If
strReal = Left(CmpStr, i - 1)
strImag = Mid(CmpStr, i)
End If
Case 2 '正/負の実数と正/負の虚数
i = InStr(2, CmpStr, "+")
If (i = 0) Then
i = InStr(2, CmpStr, "-")
End If
strReal = Left(CmpStr, i - 1)
strImag = Mid(CmpStr, i)
End Select
CmpWK.Real = Val(strReal)
Select Case strImag
Case ""
CmpWK.Imag = 0
Case "i", "+i"
CmpWK.Imag = 1
Case "-i"
CmpWK.Imag = -1
Case Else
strImag = Left(strImag, Len(strImag) - 1)
CmpWK.Imag = Val(strImag)
End Select
CmpWK.Value = CompStr(CmpWK)
CompSetStr = CmpWK
Exit Function
Err:
CmpWK.Real = 0
CmpWK.Imag = 0
CmpWK.Value = CompStr(CmpWK)
CompSetStr = CmpWK
End Function
'<< 複素数表現(文字列) >>
Private Function CompStr(ByRef Cmp1 As Complex) As String
If (Cmp1.Real = 0) And (Cmp1.Imag = 0) Then
CompStr = "0"
ElseIf (Cmp1.Imag = 0) Then
CompStr = CStr(Cmp1.Real)
ElseIf (Cmp1.Real = 0) Then
Select Case Cmp1.Imag
Case 1
CompStr = "i"
Case -1
CompStr = "-i"
Case Else
CompStr = CStr(Cmp1.Imag) & "i"
End Select
Else
Select Case Cmp1.Imag
Case 1
CompStr = CStr(Cmp1.Real) & "+i"
Case -1
CompStr = CStr(Cmp1.Real) & "-i"
Case Is < 0
CompStr = CStr(Cmp1.Real) & CStr(Cmp1.Imag) & "i"
Case Else
CompStr = CStr(Cmp1.Real) & "+" & CStr(Cmp1.Imag) & "i"
End Select
End If
End Function
'ここからメイン
Sub test()
Dim Nc(2000), Nl(2000), Nh(2000) As Double
Dim x, y, i, W, Na, L, H, m, Dl, Dh As Double
Dim Rm, Rb, Rt, R, S, T, Z As Double
Dim Pi As Double
Dim Vo As Complex
Dim Vm As Complex
Dim Val As Complex
Dim Vah As Complex
Dim Vb As Complex
Dim Vmb As Complex
Dim Vr As Complex
Dim Vt As Complex
Dim Vrt As Complex
Dim Vz As Complex
Dim Vmm As Complex
Dim Vmu As Complex
Dim Vmv As Complex
Dim V(2000) As Complex
Dim U(2000) As Complex
Dim Vmp As Complex
Dim Vp As Complex
Dim Vmq As Complex
Dim Vq As Complex
Pi = Application.WorksheetFunction.Pi()
Vo = CompInit
Vm = CompInit
Val = CompInit
Vah = CompInit
Vb = CompInit
Vmb = CompInit
Vr = CompInit
Vt = CompInit
Vrt = CompInit
Vz = CompInit
Vmm = CompInit
Vmu = CompInit
Vmv = CompInit
V(2000) = CompInit
U(2000) = CompInit
Vmp = CompInit
Vp = CompInit
Vmq = CompInit
Vq = CompInit
For x = 1 To 1000
y = 0.29 + x / 1000
W = Cells(2, 8)
Na = 1 'air
Nc(y) = Sqr(3.6 + 1.75 * y ^ 2 / (y ^ 2 - 0.256 ^ 2) + 4.1 * y ^ 2 / (y ^ 2 - 17.86 ^ 2)) 'GaN
Nl(y) = 1.553 - 0.249 * y + 0.2573 * y ^ 2 - 0.113 * y ^ 3 + 0.0178 * y ^ 4 'SiO2 single layer
Nh(y) = 0.2 + Sqr(3.6 + 1.75 * y ^ 2 / (y ^ 2 - 0.256 ^ 2) + 4.1 * y ^ 2 / (y ^ 2 - 17.86 ^ 2)) 'TiO2 single layer(4eV付近のデータが見つからなかったため、GaNの関数を参考にしている。適切ではない)
L = Nl(W) 'SiO2 index
H = Nh(W) 'TiO2 index
Cells(3, 5) = L
Cells(2, 5) = H
Dl = W / (4 * L) 'SiO2 thickness, 300um
Dh = W / (4 * H) 'TiO2 thickness, 300um
Cells(3, 6) = Dl
Cells(2, 6) = Dh
m = Cells(2, 7) 'period
Rt = (Nc(y) - Nl(y)) / (Nc(y) + Nl(y)) 'reflectivity between air and siO2
Rm = (Nl(y) - Nh(y)) / (Nl(y) + Nh(y)) ' reflectivity between siO2 and TiO2
Rb = (Nh(y) - Na) / (Nh(y) + Na) 'reflectivity between TiO2 and GaN
Vo = CompSet(1, 0)
Vm = CompSet(Rm, 0)
Vb = CompSet(Rb, 0)
Vmb = CompMult(Vm, Vb)
Val = CompSet(Cos((4 * Pi * Nl(y) * Dl / y)), Sin((4 * Pi * Nl(y) * Dl / y)))
Vah = CompSet(Cos((4 * Pi * Nh(y) * Dh / y)), Sin((4 * Pi * Nh(y) * Dh / y)))
Vr = CompDiv(CompSum(Vm, CompMult(Vb, Vah)), CompSum(Vo, CompMult(Vmb, Vah)))
Vmm = CompSet(-Rm, 0)
If m > 1 Then
For i = 1 To m
Vmv = CompMult(V(i - 1), Vmm)
Vmu = CompMult(U(i), Vm)
V(0) = Vr
U(i) = CompDiv(CompSum(Vmm, CompMult(V(i - 1), Val)), CompSum(Vo, CompMult(Vmv, Val)))
V(i) = CompDiv(CompSum(Vm, CompMult(U(i), Vah)), CompSum(Vo, CompMult(Vmu, Vah)))
Next
Vmp = CompMult(V(m), Vmm)
Vp = CompDiv(CompSum(Vmm, CompMult(V(m), Val)), CompSum(Vo, CompMult(Vmp, Val)))
Vmq = CompMult(Vp, Vm)
Vq = CompDiv(CompSum(Vm, CompMult(Vp, Vah)), CompSum(Vo, CompMult(Vmq, Vah)))
Else
Vq = Vr
End If
Vt = CompSet(Rt, 0)
Vrt = CompMult(Vq, Vt)
Vz = CompDiv(CompSum(Vt, CompMult(Vq, Val)), CompSum(Vo, CompMult(Vrt, Val)))
Cells(x + 1, 1) = 1.2398 / y
Cells(x + 1, 2) = (CompAbs(Vz).Value) ^ 2 * 100
Cells(x + 1, 12) = Nc(y) 'GaNのindex
Cells(x + 1, 13) = Nl(y)'SiO2
Cells(x + 1, 14) = Nh(y)'TiO2
Next
End Sub