■入力データ:
SPR_Au_2d.oth,
SPR_Ag_2d.oth
図1のように上半分にガラスを置き、その下に金属の薄膜を貼り(Kretschmann配置)、
上からP偏光を全反射させたとき、特定の薄膜の厚さと入射角のとき反射率が小さくなります。
これを表面プラズモン共鳴(SPR: Surface Plasmon Resonance)と呼びます。
ここでは2次元モデルを計算します。
X方向とY方向に周期境界条件を設定しています。
図1 表面プラズモン共鳴の計算モデル(2Dモデル, P偏光, セルサイズ=5nm)
図2、図3に金と銀の薄膜(厚さh=50nm)の入射角と反射率の計算結果と後述の解析解を示します。
ここで反射率RはZ方向の入射側の電界の最大値と最小値から次式で計算します。
(1)
図2、図3から反射率が最小になる入射角は金が銀より少し大きくまたその範囲が広いことがわかります。
反射率が最小になる入射角の計算値は解析解に比べて金では0.3度、銀では0.1度小さくなっています。
なお、全反射の臨界角はsin-1(1/1.515)=41.3度です。
図2 金薄膜の入射角と反射率の関係(h=50nm、λ=632.8nm、n=1.515)
図3 銀薄膜の入射角と反射率の関係(h=50nm、λ=632.8nm、n=1.515)
図4に金の文献値を示します。
反射率が最小になる入射角が44.4度となり図2の解析解より0.6度大きくなっています。
図4 金薄膜の入射角と反射率の関係(文献値[26]、h=50nm、λ=632.8nm、n=1.515)
図5と図6に反射率が最小のときの電界分布を示します。
図5の入射側(右半分)では反射波が小さいためにX成分もZ成分もほぼ一定になります。
透過側では表面に大きな電界が発生し、その後エバネッセント波が指数関数で減衰します。
なおエバネッセント波はZ成分が支配的になります。
図5 反射率が小さいときの電界分布(Z方向)
図6 反射率が小さいときの電界分布(XZ面)
図7のように3層または4層の平板の集合にP偏波の平面波が入射したモデルを考えます。
この場合は1次元モデルなので反射率を解析的に求めることができます。
図7 表面プラズモン共鳴のモデル(全反射、P偏波)
図7(a),(b)の振幅反射係数は式(2),(3)となります[27]。
本節の反射率は振幅反射係数の絶対値の2乗です。
なお、時間因子をejωtとしているために、
式(4)の第2式の平方根の中が負の実数のときは√-a = -j √aとする必要があります。
(通常の数学関数を使うと√-a = j √aになります)
(2)
(3)
(4)
図8と図9に金と銀の薄膜の厚さを変えたときの反射率の入射角特性を示します。
図8から金薄膜では厚さ45~50nmのとき反射率が最小になり、そのときの入射角は約43.8度です。
図9から銀薄膜では厚さ50~55nmのとき反射率が最小になり、そのときの入射角は約42.8度です。
図8 金薄膜の入射角と反射率の関係(Kretschmann配置, λ=632.8nm, n1=1.515, n3=1)
図9 銀薄膜の入射角と反射率の関係(Kretschmann配置, λ=632.8nm, n1=1.515, n3=1)
図10に金薄膜の厚さを一定とし(d2=50nm)、第3層の屈折率n3を変えたときの反射率の入射角特性を示します。
n3が大きくなると入射角特性の角度が大きくなることがわかります。
図10 金薄膜の入射角と反射率の関係(Kretschmann配置, λ=632.8nm, n1=1.515, d2=50nm)
図11にOtto配置の金薄膜の反射率の入射角特性を示します。
入射角46.5度で反射率が最小になっています。
図11 金薄膜の入射角と反射率の関係(Otto配置, λ=532nm, n1=1.4607, n2=n4=1, n3=0.166-3.15j, d2=10nm, d3=40nm)
リスト1 Kretschmann配置の反射率を計算するC++プログラム
/* SPR反射率計算 Kretschmann配置:3層 */ #include <iostream> #include <complex> using namespace std; static complex<double> _sqrt(complex<double> z) { complex<double> ret = sqrt(z); if ((real(z) < 0) && (fabs(imag(z)) < 1e-14)) ret = -ret; // sqrt(-a) = -j sqrt(a) return ret; } static double spr3( complex<double> er1, complex<double> er2, complex<double> er3, double d2, double k0, double angle) { const complex<double> j(0, 1); const double dtor = atan(1.0) / 45; const double sint = sin(angle * dtor); const complex<double> k1z = k0 * _sqrt(er1 - er1 * sint * sint); const complex<double> k2z = k0 * _sqrt(er2 - er1 * sint * sint); const complex<double> k3z = k0 * _sqrt(er3 - er1 * sint * sint); const complex<double> r12 = - (er1 * k2z - er2 * k1z) / (er1 * k2z + er2 * k1z); const complex<double> r23 = - (er2 * k3z - er3 * k2z) / (er2 * k3z + er3 * k2z); const complex<double> e2 = exp(-j * 2.0 * k2z * d2); const complex<double> r = (r12 + r23 * e2) / (1.0 + r12 * r23 * e2); return norm(r); } int main() { const complex<double> er1(2.2952, 0); // 第1層複素比誘電率 const complex<double> er2(-11.822, -1.242); // 第2層複素比誘電率:Au //const complex<double> er2(-18.346, -0.478); // 第2層複素比誘電率:Ag const complex<double> er3(1, 0); // 第3層複素比誘電率 const double d2 = 50e-9; // 第2層厚さ[m] const double wavelength = 632.8e-9; // 波長[m] const double angle_min = 42; // 開始入射角[度] const double angle_max = 45; // 終了入射角[度] const double angle_div = 30; // 入射角分割数 const double pi = 4 * atan(1.0); const double k0 = (2 * pi) / wavelength; for (int i = 0; i <= angle_div; i++) { double angle = angle_min + i * (angle_max - angle_min) / angle_div; double r = spr3(er1, er2, er3, d2, k0, angle); cout << angle << " " << r << endl; } return 0; }
リスト2 Otto配置の反射率を計算するC++プログラム
/* SPR反射率計算 Otto配置:4層 */ #include <iostream> #include <complex> using namespace std; static complex<double> _sqrt(complex<double> z) { complex<double> ret = sqrt(z); if ((real(z) < 0) && (fabs(imag(z)) < 1e-14)) ret = -ret; // sqrt(-a) = -j sqrt(a) return ret; } static double spr4( complex<double> er1, complex<double> er2, complex<double> er3, complex<double> er4, double d2, double d3, double k0, double angle) { const complex<double> j(0, 1); const double dtor = atan(1.0) / 45; const double sint = sin(angle * dtor); const complex<double> k1z = k0 * _sqrt(er1 - er1 * sint * sint); const complex<double> k2z = k0 * _sqrt(er2 - er1 * sint * sint); const complex<double> k3z = k0 * _sqrt(er3 - er1 * sint * sint); const complex<double> k4z = k0 * _sqrt(er4 - er1 * sint * sint); const complex<double> r12 = - (er1 * k2z - er2 * k1z) / (er1 * k2z + er2 * k1z); const complex<double> r23 = - (er2 * k3z - er3 * k2z) / (er2 * k3z + er3 * k2z); const complex<double> r34 = - (er3 * k4z - er4 * k3z) / (er3 * k4z + er4 * k3z); const complex<double> e2 = exp(-j * 2.0 * k2z * d2); const complex<double> e3 = exp(-j * 2.0 * k3z * d3); const complex<double> r234 = (r23 + r34 * e3) / (1.0 + r23 * r34 * e3); const complex<double> r = (r12 + r234 * e2) / (1.0 + r12 * r234 * e2); return norm(r); } int main() { const complex<double> er1(1.4607 * 1.4607, 0); // 第1層複素比誘電率 const complex<double> er2(1, 0); // 第2層複素比誘電率 const complex<double> er3(0.166 * 0.166 - 3.15 * 3.15, -2 * 0.166 * 3.156); // 第3層複素比誘電率:Au const complex<double> er4(1, 0); // 第4層複素比誘電率 const double d2 = 10e-9; // 第2層厚さ[m] const double d3 = 40e-9; // 第3層厚さ[m] const double wavelength = 532e-9; // 波長[m] const double angle_min = 40; // 開始入射角[度] const double angle_max = 50; // 終了入射角[度] const double angle_div = 100; // 入射角分割数 const double pi = 4 * atan(1.0); const double k0 = (2 * pi) / wavelength; for (int i = 0; i <= angle_div; i++) { double angle = angle_min + i * (angle_max - angle_min) / angle_div; double r = spr4(er1, er2, er3, er4, d2, d3, k0, angle); cout << angle << " " << r << endl; } return 0; }