|
@@ -0,0 +1,171 @@
|
|
|
+#!/usr/bin/env python3
|
|
|
+# -*- coding: UTF-8 -*-
|
|
|
+import cmath
|
|
|
+
|
|
|
+import numpy as np
|
|
|
+import scipy.io
|
|
|
+from matplotlib import pyplot as plt
|
|
|
+from optical_constants import read_refractive_index_from_yaml as read_nk
|
|
|
+
|
|
|
+from scattnlay import mesomie, mie
|
|
|
+# shell 0.4-0.6 nm
|
|
|
+# omega_p goes down
|
|
|
+shell_h = 0.4
|
|
|
+
|
|
|
+from_disk = np.loadtxt('silver-d_perp_interpolated.txt')
|
|
|
+omega_star_ratio = from_disk[0, :]
|
|
|
+d_perp = from_disk[1, :] + 1j*from_disk[2, :]
|
|
|
+from_disk = np.loadtxt('silver-d_parl_interpolated.txt')
|
|
|
+d_parl = from_disk[1, :] + 1j*from_disk[2, :]
|
|
|
+
|
|
|
+c = 299792458 # m/s
|
|
|
+h_reduced = 6.5821e-16 # eV s
|
|
|
+omega_p = 9.02 # eV
|
|
|
+omega_p_star = 3.81 # eV
|
|
|
+gamma = 0.15 # eV
|
|
|
+eps_inf_drud = 4.65
|
|
|
+# eps_inf = 4.65
|
|
|
+
|
|
|
+eps_d = 1
|
|
|
+
|
|
|
+R = 2.5
|
|
|
+y_min = 0
|
|
|
+y_max = 2
|
|
|
+
|
|
|
+min_lim_omega_star_ratio = 0.87
|
|
|
+max_lim_omega_star_ratio = 0.99
|
|
|
+
|
|
|
+# min_lim_omega_ratio = min_lim_omega_star_ratio * omega_p_star/omega_p
|
|
|
+# max_lim_omega_ratio = max_lim_omega_star_ratio * omega_p_star/omega_p
|
|
|
+
|
|
|
+# 2 pi / lambda = (omega/c) /h_reduced
|
|
|
+
|
|
|
+
|
|
|
+WL = 2*np.pi/((omega_star_ratio * omega_p_star/c)/h_reduced)*1e6 # mkm
|
|
|
+min_WL_available = 0.1879
|
|
|
+max_WL_available = 1.9370
|
|
|
+WL[WL < min_WL_available] = min_WL_available
|
|
|
+WL[WL > max_WL_available] = max_WL_available
|
|
|
+index_Ag = read_nk('Ag-Johnson-1972.yml', WL, kind=1)
|
|
|
+eps_Ag = index_Ag**2
|
|
|
+# print(index_Ag)
|
|
|
+
|
|
|
+factor = 1
|
|
|
+
|
|
|
+
|
|
|
+def eps_m(omega, eps_inf, omega_p_local):
|
|
|
+ return eps_inf - omega_p_local * omega_p_local / (omega*omega + 1j*omega*gamma*factor)
|
|
|
+
|
|
|
+
|
|
|
+def eps_inf(omega, eps_exp):
|
|
|
+ return eps_exp + omega_p * omega_p / (omega*omega + 1j*omega*gamma*factor)
|
|
|
+
|
|
|
+
|
|
|
+Qext = []
|
|
|
+Qext_mie = []
|
|
|
+Qext_drude_nc = []
|
|
|
+om_rat_plot = []
|
|
|
+eps_inf_drude = []
|
|
|
+eps_m_drude = []
|
|
|
+for i in range(len(omega_star_ratio)):
|
|
|
+ om_star_rat = omega_star_ratio[i]
|
|
|
+ if (om_star_rat < min_lim_omega_star_ratio
|
|
|
+ or om_star_rat > max_lim_omega_star_ratio):
|
|
|
+ continue
|
|
|
+ omega = om_star_rat*omega_p_star
|
|
|
+ WL_mkm = 2*np.pi/((omega/c)/h_reduced)*1e6
|
|
|
+ if WL_mkm < min_WL_available or WL_mkm > max_WL_available:
|
|
|
+ continue
|
|
|
+
|
|
|
+ x_const = (omega/c) * 1e-9/h_reduced
|
|
|
+ x = R * x_const
|
|
|
+ m = index_Ag[i, 1]
|
|
|
+ eps_m_drude.append(m**2)
|
|
|
+ eps_inf_drude.append(eps_inf(omega, m**2))
|
|
|
+ m_drude = cmath.sqrt(eps_m(omega, eps_inf(omega, m**2), omega_p))
|
|
|
+ # m_drude = cmath.sqrt(eps_m(omega, eps_inf_drud, omega_p))
|
|
|
+ # m_drude = cmath.sqrt(eps_inf(omega, m**2))
|
|
|
+ print(x, m)
|
|
|
+ # m = m_drude
|
|
|
+ mesomie.calc_ab(R*10, # R in angstrem
|
|
|
+ x, # xd
|
|
|
+ x * m, # xm
|
|
|
+ 1, # eps_d
|
|
|
+ m * m, # eps_m
|
|
|
+ d_parl[i], # d_parallel
|
|
|
+ d_perp[i]) # d_perp
|
|
|
+ mesomie.calc_Q()
|
|
|
+ Qext.append(mesomie.GetQext())
|
|
|
+
|
|
|
+ mie.SetLayersSize(x)
|
|
|
+ mie.SetLayersIndex(m)
|
|
|
+ mie.RunMieCalculation()
|
|
|
+ Qext_mie.append(mie.GetQext())
|
|
|
+
|
|
|
+ # m = m_drude
|
|
|
+ # mesomie.calc_ab(R*10, # R in angstrem
|
|
|
+ # x, # xd
|
|
|
+ # x * m, # xm
|
|
|
+ # 1, # eps_d
|
|
|
+ # m * m, # eps_m
|
|
|
+ # d_parl[i], # d_parallel
|
|
|
+ # d_perp[i]) # d_perp
|
|
|
+ # mesomie.calc_Q()
|
|
|
+ # Qext_drude_nc.append(mesomie.GetQext())
|
|
|
+
|
|
|
+ # print(x, m, Qext[-1] - mie.GetQext())
|
|
|
+
|
|
|
+ om_rat_plot.append(om_star_rat)
|
|
|
+
|
|
|
+plt.plot(om_rat_plot, Qext_mie,
|
|
|
+ label='classic', color='black', lw=4)
|
|
|
+
|
|
|
+# plt.plot(om_rat_plot, np.real(eps_inf_drude),
|
|
|
+# label='real drude', color='blue', lw=1)
|
|
|
+# plt.plot(om_rat_plot, np.imag(eps_inf_drude),
|
|
|
+# label='imag drude', color='red', lw=1)
|
|
|
+
|
|
|
+# plt.plot(om_rat_plot, np.real(eps_m_drude),
|
|
|
+# label='real drude', color='blue', lw=2)
|
|
|
+# plt.plot(om_rat_plot, np.imag(eps_m_drude),
|
|
|
+# label='imag drude', color='red', lw=2)
|
|
|
+
|
|
|
+
|
|
|
+plt.plot(om_rat_plot, Qext,
|
|
|
+ label='non-classic', color='red', lw=4)
|
|
|
+# plt.plot(om_rat_plot, Qext_drude_nc,
|
|
|
+# label='non-classic drude fixed\nomega_p = 9.02 eV\ngamma = 0.15eV\neps_inf_drud = 4.65', color='blue', lw=2)
|
|
|
+for j in range(7):
|
|
|
+ Qext_drude = []
|
|
|
+ step = 0.02
|
|
|
+ for i in range(len(omega_star_ratio)):
|
|
|
+ om_star_rat = omega_star_ratio[i]
|
|
|
+ if (om_star_rat < min_lim_omega_star_ratio
|
|
|
+ or om_star_rat > max_lim_omega_star_ratio):
|
|
|
+ continue
|
|
|
+ omega = om_star_rat*omega_p_star
|
|
|
+ WL_mkm = 2*np.pi/((omega/c)/h_reduced)*1e6
|
|
|
+ if WL_mkm < min_WL_available or WL_mkm > max_WL_available:
|
|
|
+ continue
|
|
|
+ x_const = (omega/c) * 1e-9/h_reduced
|
|
|
+
|
|
|
+ x_cs = [(R-shell_h) * x_const, R * x_const],
|
|
|
+ m = index_Ag[i, 1]
|
|
|
+ m_drude = cmath.sqrt(eps_m(omega, eps_inf(omega, m**2), omega_p))
|
|
|
+ m_drude_shell = cmath.sqrt(
|
|
|
+ eps_m(omega, eps_inf(omega, m**2), omega_p*(0.96+step*j)))
|
|
|
+ m_cs = [m_drude, m_drude_shell]
|
|
|
+ mie.SetLayersSize(x_cs)
|
|
|
+ mie.SetLayersIndex(m_cs)
|
|
|
+ mie.RunMieCalculation()
|
|
|
+ Qext_drude.append(mie.GetQext())
|
|
|
+ plt.plot(om_rat_plot, Qext_drude,
|
|
|
+ label=f'omega_p*{((0.96+step*j)*100)/100}', color='gray', lw=2)
|
|
|
+
|
|
|
+plt.legend()
|
|
|
+# plt.yscale('log')
|
|
|
+plt.xlim((min_lim_omega_star_ratio, max_lim_omega_star_ratio))
|
|
|
+# plt.ylim((y_min, y_max))
|
|
|
+plt.title(
|
|
|
+ "R="+str(R)+f'\nfor core-shell totalR is the same,\nshell_h={shell_h}')
|
|
|
+plt.show()
|