def material_map(sigma): sigma_Si = sigma cSi_range = mp.FreqRange(min=um_scale, max=um_scale / 0.4) cSi_frq1 = 3.64 / um_scale cSi_gam1 = 0 cSi_sig1 = 8 cSi_frq2 = 2.76 / um_scale cSi_gam2 = 2 * 0.063 / um_scale cSi_sig2 = 2.85 cSi_frq3 = 1.73 / um_scale cSi_gam3 = 2 * 2.5 / um_scale cSi_sig3 = -0.107 cSi_susc = [ mp.LorentzianSusceptibility(frequency=cSi_frq1, gamma=cSi_gam1, sigma=cSi_sig1 * sigma_Si), mp.LorentzianSusceptibility(frequency=cSi_frq2, gamma=cSi_gam2, sigma=cSi_sig2 * sigma_Si), mp.LorentzianSusceptibility(frequency=cSi_frq3, gamma=cSi_gam3, sigma=cSi_sig3 * sigma_Si) ] cSi = mp.Medium(epsilon=1.0, E_susceptibilities=cSi_susc, valid_freq_range=cSi_range) return cSi
def calc(varibles,orginal,depth): um_scale = 1 say = 0 eV_um_scale = um_scale/1.23984193 Au_plasma_frq = 9.03*eV_um_scale metal_range = mp.FreqRange(min=um_scale/6.1992, max=um_scale/.24797) out = [] var = [np.linspace(varibles[j][0],varibles[j][1],5) for j in range(6)] correlation = -1 Au_f0 = 0.760 for i in range(5): Au_frq0 = var[0][i] Au_gam0 = 0.053*eV_um_scale Au_sig0 = Au_f0*Au_plasma_frq**2/Au_frq0**2 Au_f1 = 0.024 for j in range(5): Au_frq1 = var[1][j]*eV_um_scale # 2.988 um Au_gam1 = 0.241*eV_um_scale Au_sig1 = Au_f1*Au_plasma_frq**2/Au_frq1**2 Au_f2 = 0.010 for k in range(5): Au_frq2 = var[2][k]*eV_um_scale # 1.494 um Au_gam2 = 0.345*eV_um_scale Au_sig2 = Au_f2*Au_plasma_frq**2/Au_frq2**2 Au_f3 = 0.071 for l in range(5): Au_frq3 = var[3][l]*eV_um_scale # 0.418 um Au_gam3 = 0.870*eV_um_scale Au_sig3 = Au_f3*Au_plasma_frq**2/Au_frq3**2 Au_f4 = 0.601 for m in range(5): Au_frq4 = var[4][m]*eV_um_scale # 0.288 um Au_gam4 = 2.494*eV_um_scale Au_sig4 = Au_f4*Au_plasma_frq**2/Au_frq4**2 Au_f5 = 4.384 for n in range(5): Au_frq5 = var[5][n]*eV_um_scale # 0.093 um Au_gam5 = 2.214*eV_um_scale Au_sig5 = Au_f5*Au_plasma_frq**2/Au_frq5**2 Au_susc = [mp.DrudeSusceptibility(frequency=Au_frq0, gamma=Au_gam0, sigma=Au_sig0), mp.LorentzianSusceptibility(frequency=Au_frq1, gamma=Au_gam1, sigma=Au_sig1), mp.LorentzianSusceptibility(frequency=Au_frq2, gamma=Au_gam2, sigma=Au_sig2), mp.LorentzianSusceptibility(frequency=Au_frq3, gamma=Au_gam3, sigma=Au_sig3), mp.LorentzianSusceptibility(frequency=Au_frq4, gamma=Au_gam4, sigma=Au_sig4), mp.LorentzianSusceptibility(frequency=Au_frq5, gamma=Au_gam5, sigma=Au_sig5)] Au = mp.Medium(epsilon=1.0, E_susceptibilities=Au_susc, valid_freq_range=metal_range) freqs = np.linspace(um_scale/0.7,um_scale/0.35,101) au = np.empty(101,dtype=np.cdouble) say=say+1 for ii in range (101): au[ii]= Au.epsilon(freqs[ii])[1][1] temp = np.corrcoef(au,orginal)[0][1] if(correlation<temp): correlation = temp print(correlation) out = [i,j,k,l,m,n] print(out)
def lossy_Pd(r): """Give a input r between 0 and 1, the function will return a modified Pd with lower reflection. The absorption coefficient is lower too. We have to use a thicker layer the prevent any transmission. """ um_scale = 1.0 # conversion factor for eV to 1/um [=1/hc] eV_um_scale = um_scale / 1.23984193 metal_range = mp.FreqRange(min=um_scale / 12.4, max=um_scale / 0.2) Pd_plasma_frq = 9.72 * eV_um_scale Pd_f0 = 0.330 Pd_frq0 = 1e-10 Pd_gam0 = 0.008 * eV_um_scale Pd_sig0 = Pd_f0 * Pd_plasma_frq**2 / Pd_frq0**2 Pd_f1 = 0.649 Pd_frq1 = 0.336 * eV_um_scale # 3.690 um Pd_gam1 = 2.950 * eV_um_scale Pd_sig1 = Pd_f1 * Pd_plasma_frq**2 / Pd_frq1**2 Pd_f2 = 0.121 Pd_frq2 = 0.501 * eV_um_scale # 2.475 um Pd_gam2 = 0.555 * eV_um_scale Pd_sig2 = Pd_f2 * Pd_plasma_frq**2 / Pd_frq2**2 Pd_f3 = 0.638 Pd_frq3 = 1.659 * eV_um_scale # 0.747 um Pd_gam3 = 4.621 * eV_um_scale Pd_sig3 = Pd_f3 * Pd_plasma_frq**2 / Pd_frq3**2 Pd_f4 = 0.453 Pd_frq4 = 5.715 * eV_um_scale # 0.217 um Pd_gam4 = 3.236 * eV_um_scale Pd_sig4 = Pd_f4 * Pd_plasma_frq**2 / Pd_frq4**2 Pd_susc = [ mp.DrudeSusceptibility(frequency=Pd_frq0, gamma=Pd_gam0, sigma=Pd_sig0 * r), mp.LorentzianSusceptibility(frequency=Pd_frq1, gamma=Pd_gam1, sigma=Pd_sig1 * r), mp.LorentzianSusceptibility(frequency=Pd_frq2, gamma=Pd_gam2, sigma=Pd_sig2 * r), mp.LorentzianSusceptibility(frequency=Pd_frq3, gamma=Pd_gam3, sigma=Pd_sig3 * r), mp.LorentzianSusceptibility(frequency=Pd_frq4, gamma=Pd_gam4, sigma=Pd_sig4 * r) ] Pd = mp.Medium(epsilon=1.0, E_susceptibilities=Pd_susc, valid_freq_range=metal_range) return Pd
def test_check_material_frequencies(self): mat = mp.Medium(valid_freq_range=mp.FreqRange(min=10, max=20)) invalid_sources = [ [mp.Source(mp.GaussianSource(5, fwidth=1), mp.Ez, mp.Vector3())], [mp.Source(mp.ContinuousSource(10, fwidth=1), mp.Ez, mp.Vector3())], [mp.Source(mp.GaussianSource(10, width=1), mp.Ez, mp.Vector3())], [mp.Source(mp.GaussianSource(20, width=1), mp.Ez, mp.Vector3())], ] cell_size = mp.Vector3(5, 5) resolution = 5 def check_warnings(sim, should_warn=True): with warnings.catch_warnings(record=True) as w: warnings.simplefilter("always") sim.run(until=5) if should_warn: self.assertEqual(len(w), 1) self.assertIn("material", str(w[-1].message)) else: self.assertEqual(len(w), 0) geom = [mp.Sphere(0.2, material=mat)] for s in invalid_sources: # Check for invalid extra_materials sim = mp.Simulation(cell_size=cell_size, resolution=resolution, sources=s, extra_materials=[mat]) check_warnings(sim) # Check for invalid geometry materials sim = mp.Simulation(cell_size=cell_size, resolution=resolution, sources=s, geometry=geom) check_warnings(sim) valid_sources = [ [mp.Source(mp.GaussianSource(15, fwidth=1), mp.Ez, mp.Vector3())], [mp.Source(mp.ContinuousSource(15, width=5), mp.Ez, mp.Vector3())] ] for s in valid_sources: sim = mp.Simulation(cell_size=cell_size, resolution=resolution, sources=s, extra_materials=[mat]) check_warnings(sim, False) # Check DFT frequencies # Invalid extra_materials sim = mp.Simulation(cell_size=cell_size, resolution=resolution, sources=valid_sources[0], extra_materials=[mat]) fregion = mp.FluxRegion(center=mp.Vector3(0, 1), size=mp.Vector3(2, 2), direction=mp.X) sim.add_flux(18, 6, 2, fregion) check_warnings(sim) # Invalid geometry material sim = mp.Simulation(cell_size=cell_size, resolution=resolution, sources=valid_sources[0], geometry=geom) sim.add_flux(18, 6, 2, fregion) check_warnings(sim)
import meep as mp import numpy as np from meep.materials import Au import matplotlib.pyplot as plt import pandas as pd from functions import mixsolver # default unit length is 1 um df = pd.read_csv (r'./gold-polymer-mix/RefractiveIndexINFO.csv') polimer = df['n'].to_numpy()**2 um_scale = 1.0 # conversion factor for eV to 1/um [=1/hc] eV_um_scale = um_scale/1.23984193 var = np.linspace(1e-10,25,5) metal_range = mp.FreqRange(min=um_scale/6.1992, max=um_scale/.24797) Au_plasma_frq = 9.03*eV_um_scale Au_f0 = 0.760 Au_frq0 = var[3] Au_gam0 = 0.053*eV_um_scale Au_sig0 = Au_f0*Au_plasma_frq**2/Au_frq0**2 Au_f1 = 0.024 Au_frq1 = var[0]*eV_um_scale # 2.988 um Au_gam1 = 0.241*eV_um_scale Au_sig1 = Au_f1*Au_plasma_frq**2/Au_frq1**2 Au_f2 = 0.010 Au_frq2 = var[0]*eV_um_scale # 1.494 um Au_gam2 = 0.345*eV_um_scale Au_sig2 = Au_f2*Au_plasma_frq**2/Au_frq2**2 Au_f3 = 0.071 Au_frq3 = var[0]*eV_um_scale # 0.418 um
def __init__(self, epsilon_diag=mp.Vector3(1, 1, 1), epsilon_offdiag=mp.Vector3(), mu_diag=mp.Vector3(1, 1, 1), mu_offdiag=mp.Vector3(), E_susceptibilities=[], H_susceptibilities=[], E_chi2_diag=mp.Vector3(), E_chi3_diag=mp.Vector3(), H_chi2_diag=mp.Vector3(), H_chi3_diag=mp.Vector3(), D_conductivity_diag=mp.Vector3(), D_conductivity_offdiag=mp.Vector3(), B_conductivity_diag=mp.Vector3(), B_conductivity_offdiag=mp.Vector3(), epsilon=None, index=None, mu=None, chi2=None, chi3=None, D_conductivity=None, B_conductivity=None, E_chi2=None, E_chi3=None, H_chi2=None, H_chi3=None, valid_freq_range=mp.FreqRange(min=-mp.inf, max=mp.inf), material="Au", paper="JC", reference="RIinfo", from_um_factor=1e-3, have_logger=False): self.material = material self.paper = paper self.reference = reference self.from_um_factor = from_um_factor epsilon_function = epsilon_function_from_file( material=material, paper=paper, reference=reference, from_um_factor=from_um_factor) super().__init__(epsilon_diag=epsilon_diag, epsilon_offdiag=epsilon_offdiag, mu_diag=mu_diag, mu_offdiag=mu_offdiag, E_susceptibilities=[], H_susceptibilities=[], E_chi2_diag=E_chi2_diag, E_chi3_diag=E_chi3_diag, H_chi2_diag=H_chi2_diag, H_chi3_diag=H_chi3_diag, D_conductivity_diag=D_conductivity_diag, D_conductivity_offdiag=D_conductivity_offdiag, B_conductivity_diag=B_conductivity_diag, B_conductivity_offdiag=B_conductivity_offdiag, epsilon=epsilon, index=index, mu=mu, chi2=chi2, chi3=chi3, D_conductivity=D_conductivity, B_conductivity=B_conductivity, E_chi2=E_chi2, E_chi3=E_chi3, H_chi2=H_chi2, H_chi3=H_chi3, valid_freq_range=valid_freq_range, epsilon_function=epsilon_function, mu_function=lambda wlen: 1, have_logger=have_logger) if len(E_susceptibilities) > 0 or len(H_susceptibilities) > 0: raise ValueError("This class doesn't take susceptibilities!")
def __init__(self, epsilon_diag=mp.Vector3(1, 1, 1), epsilon_offdiag=mp.Vector3(), mu_diag=mp.Vector3(1, 1, 1), mu_offdiag=mp.Vector3(), E_susceptibilities=[], H_susceptibilities=[], E_chi2_diag=mp.Vector3(), E_chi3_diag=mp.Vector3(), H_chi2_diag=mp.Vector3(), H_chi3_diag=mp.Vector3(), D_conductivity_diag=mp.Vector3(), D_conductivity_offdiag=mp.Vector3(), B_conductivity_diag=mp.Vector3(), B_conductivity_offdiag=mp.Vector3(), epsilon=None, index=None, mu=None, chi2=None, chi3=None, D_conductivity=None, B_conductivity=None, E_chi2=None, E_chi3=None, H_chi2=None, H_chi3=None, valid_freq_range=mp.FreqRange(min=-mp.inf, max=mp.inf), epsilon_function=lambda wlen: 1, mu_function=lambda wlen: 1, have_logger=False): super().__init__(epsilon_diag=epsilon_diag, epsilon_offdiag=epsilon_offdiag, mu_diag=mu_diag, mu_offdiag=mu_offdiag, E_susceptibilities=[], H_susceptibilities=[], E_chi2_diag=E_chi2_diag, E_chi3_diag=E_chi3_diag, H_chi2_diag=H_chi2_diag, H_chi3_diag=H_chi3_diag, D_conductivity_diag=D_conductivity_diag, D_conductivity_offdiag=D_conductivity_offdiag, B_conductivity_diag=B_conductivity_diag, B_conductivity_offdiag=B_conductivity_offdiag, epsilon=epsilon, index=index, mu=mu, chi2=chi2, chi3=chi3, D_conductivity=D_conductivity, B_conductivity=B_conductivity, E_chi2=E_chi2, E_chi3=E_chi3, H_chi2=H_chi2, H_chi3=H_chi3, valid_freq_range=valid_freq_range) self.epsilon_function = epsilon_function self.mu_function = mu_function if len(E_susceptibilities) > 0 or len(H_susceptibilities) > 0: raise ValueError("This class doesn't take susceptibilities!") try: eps_wlen_range = epsilon_function._wlen_range_ except: eps_wlen_range = np.array([-mp.inf, mp.inf]) try: mu_wlen_range = mu_function._wlen_range_ except: mu_wlen_range = np.array([-mp.inf, mp.inf]) if self.valid_freq_range.min == -mp.inf: max_current_wlen = np.inf else: max_current_wlen = 1 / self.valid_freq_range.min if self.valid_freq_range.max == mp.inf: min_current_wlen = -np.inf else: min_current_wlen = 1 / self.valid_freq_range.max self.valid_wlen_range = np.array([ max([eps_wlen_range[0], mu_wlen_range[0], min_current_wlen]), min([eps_wlen_range[1], mu_wlen_range[1], max_current_wlen]) ]) if self.valid_wlen_range[1] == np.inf: min_freq = -mp.inf elif 1 / self.valid_wlen_range[1] < mp.inf: min_freq = 1 / self.valid_wlen_range[1] else: min_freq = -mp.inf if self.valid_wlen_range[0] == -np.inf: max_freq = mp.inf elif 1 / self.valid_wlen_range[0] > -mp.inf: max_freq = 1 / self.valid_wlen_range[0] else: max_freq = -mp.inf self.valid_freq_range = mp.FreqRange(min_freq, max_freq) self._logger_list = [] self._have_logger = have_logger
def import_medium(name, from_um_factor=1, paper="R"): """Returns Medium instance from string with specified length scale It's widely based on Meep Materials Library, merely adapted to change according to the length unit scale used. Parameters ---------- name: str Name of the desired material. from_um_factor=1 : int, float, optional Factor to transform from SI μm to the chosen length unit. For example, to work with 100 nm as 1 Meep unit, from_um_factor=.1 must be specified. paper="R": str Name of desired source for experimental input data of medium. Returns ------- medium : mp.Medium The mp.Medium instance of the desired material. Raises ------ "No media called ... is available" : SyntaxError If no material is found whose name matches the string given. """ if "Ag" not in name and "Au" not in name: raise SyntaxError("No media called {} is available".format(name)) return # Default unit length is 1 um eV_from_um_factor = from_um_factor / 1.23984193 # Conversion factor: eV to 1/um [=1/hc] # from_um_factor used to be um_scale (but that's a shady name) ############ GOLD ################################################# if name == "Au" and paper == "R": #------------------------------------------------------------------ # Elemental metals from A.D. Rakic et al., Applied Optics, Vol. 37, No. 22, pp. 5271-83, 1998 # Wavelength range: 0.2 - 12.4 um # Gold (Au) metal_range = mp.FreqRange(min=from_um_factor * 1e3 / 6199.2, max=from_um_factor * 1e3 / 247.97) Au_plasma_frq = 9.03 * eV_from_um_factor Au_f0 = 0.760 Au_frq0 = 1e-10 Au_gam0 = 0.053 * eV_from_um_factor Au_sig0 = Au_f0 * Au_plasma_frq**2 / Au_frq0**2 Au_f1 = 0.024 Au_frq1 = 0.415 * eV_from_um_factor # 2.988 um Au_gam1 = 0.241 * eV_from_um_factor Au_sig1 = Au_f1 * Au_plasma_frq**2 / Au_frq1**2 Au_f2 = 0.010 Au_frq2 = 0.830 * eV_from_um_factor # 1.494 um Au_gam2 = 0.345 * eV_from_um_factor Au_sig2 = Au_f2 * Au_plasma_frq**2 / Au_frq2**2 Au_f3 = 0.071 Au_frq3 = 2.969 * eV_from_um_factor # 0.418 um Au_gam3 = 0.870 * eV_from_um_factor Au_sig3 = Au_f3 * Au_plasma_frq**2 / Au_frq3**2 Au_f4 = 0.601 Au_frq4 = 4.304 * eV_from_um_factor # 0.288 um Au_gam4 = 2.494 * eV_from_um_factor Au_sig4 = Au_f4 * Au_plasma_frq**2 / Au_frq4**2 Au_f5 = 4.384 Au_frq5 = 13.32 * eV_from_um_factor # 0.093 um Au_gam5 = 2.214 * eV_from_um_factor Au_sig5 = Au_f5 * Au_plasma_frq**2 / Au_frq5**2 Au_susc = [ mp.DrudeSusceptibility(frequency=Au_frq0, gamma=Au_gam0, sigma=Au_sig0), mp.LorentzianSusceptibility(frequency=Au_frq1, gamma=Au_gam1, sigma=Au_sig1), mp.LorentzianSusceptibility(frequency=Au_frq2, gamma=Au_gam2, sigma=Au_sig2), mp.LorentzianSusceptibility(frequency=Au_frq3, gamma=Au_gam3, sigma=Au_sig3), mp.LorentzianSusceptibility(frequency=Au_frq4, gamma=Au_gam4, sigma=Au_sig4), mp.LorentzianSusceptibility(frequency=Au_frq5, gamma=Au_gam5, sigma=Au_sig5) ] Au = mp.Medium(epsilon=1.0, E_susceptibilities=Au_susc, valid_freq_range=metal_range) Au.from_um_factor = from_um_factor return Au elif name == "Au" and paper == "JC": #------------------------------------------------------------------ # Metals from D. Barchiesi and T. Grosges, J. Nanophotonics, Vol. 8, 08996, 2015 # Wavelength range: 0.4 - 0.8 um # Gold (Au) # Fit to P.B. Johnson and R.W. Christy, Physical Review B, Vol. 6, pp. 4370-9, 1972 # metal_visible_range = mp.FreqRange(min=from_um_factor*1e3/800, # max=from_um_factor*1e3/400) # Au_JC_visible_frq0 = 1*from_um_factor/0.139779231751333 # Au_JC_visible_gam0 = 1*from_um_factor/26.1269913352870 # Au_JC_visible_sig0 = 1 # Au_JC_visible_frq1 = 1*from_um_factor/0.404064525036786 # Au_JC_visible_gam1 = 1*from_um_factor/1.12834046202759 # Au_JC_visible_sig1 = 2.07118534879440 # Au_JC_visible_susc = [mp.DrudeSusceptibility(frequency=Au_JC_visible_frq0, gamma=Au_JC_visible_gam0, sigma=Au_JC_visible_sig0), # mp.LorentzianSusceptibility(frequency=Au_JC_visible_frq1, gamma=Au_JC_visible_gam1, sigma=Au_JC_visible_sig1)] # Au_JC_visible = mp.Medium(epsilon=6.1599, # E_susceptibilities=Au_JC_visible_susc, # valid_freq_range=metal_visible_range) # Au_JC_visible.from_um_factor = from_um_factor # return Au_JC_visible #------------------------------------------------------------------ # Metal from my own fit # Wavelength range: 0.1879 - 1.937 um # Gold (Au) # Fit to P.B. Johnson and R.W. Christy, Physical Review B, Vol. 6, pp. 4370-9, 1972 Au_JC_range = mp.FreqRange(min=from_um_factor / 1.937, max=from_um_factor / .1879) freq_0 = 1.000000082740371e-10 * from_um_factor gamma_0 = 4.4142682842363e-09 * from_um_factor sigma_0 = 3.3002903009040977e+21 freq_1 = 0.3260039379724786 * from_um_factor gamma_1 = 0.03601307014052124 * from_um_factor sigma_1 = 103.74591029640469 freq_2 = 0.47387215165339414 * from_um_factor gamma_2 = 0.34294093699162054 * from_um_factor sigma_2 = 14.168079504545002 freq_3 = 2.3910144662345445 * from_um_factor gamma_3 = 0.5900378254265015 * from_um_factor sigma_3 = 0.8155991478264435 freq_4 = 3.3577076082530537 * from_um_factor gamma_4 = 1.6689250252226686 * from_um_factor sigma_4 = 2.038193481751111 freq_5 = 8.915719663759013 * from_um_factor gamma_5 = 7.539763092679264 * from_um_factor sigma_5 = 3.74409654935571 Au_JC_susc = [ mp.DrudeSusceptibility(frequency=freq_0, gamma=gamma_0, sigma=sigma_0), mp.LorentzianSusceptibility(frequency=freq_1, gamma=gamma_1, sigma=sigma_1), mp.LorentzianSusceptibility(frequency=freq_2, gamma=gamma_2, sigma=sigma_2), mp.LorentzianSusceptibility(frequency=freq_3, gamma=gamma_3, sigma=sigma_3), mp.LorentzianSusceptibility(frequency=freq_4, gamma=gamma_4, sigma=sigma_4), mp.LorentzianSusceptibility(frequency=freq_5, gamma=gamma_5, sigma=sigma_5) ] Au_JC = mp.Medium( epsilon=1.0, #6.1599, E_susceptibilities=Au_JC_susc, valid_freq_range=Au_JC_range) Au_JC.from_um_factor = from_um_factor return Au_JC elif name == "Au" and paper == "P": #------------------------------------------------------------------ # Metals from D. Barchiesi and T. Grosges, J. Nanophotonics, Vol. 8, 08996, 2015 # Wavelength range: 0.4 - 0.8 um # Gold (Au) # Fit to E.D. Palik, Handbook of Optical Constants, Academic Press, 1985 metal_visible_range = mp.FreqRange(min=from_um_factor * 1e3 / 800, max=from_um_factor * 1e3 / 400) Au_visible_frq0 = 1 * from_um_factor / 0.0473629248511456 Au_visible_gam0 = 1 * from_um_factor / 0.255476199605166 Au_visible_sig0 = 1 Au_visible_frq1 = 1 * from_um_factor / 0.800619321082804 Au_visible_gam1 = 1 * from_um_factor / 0.381870287531951 Au_visible_sig1 = -169.060953137985 Au_visible_susc = [ mp.DrudeSusceptibility(frequency=Au_visible_frq0, gamma=Au_visible_gam0, sigma=Au_visible_sig0), mp.LorentzianSusceptibility(frequency=Au_visible_frq1, gamma=Au_visible_gam1, sigma=Au_visible_sig1) ] Au_visible = mp.Medium(epsilon=0.6888, E_susceptibilities=Au_visible_susc, valid_freq_range=metal_visible_range) Au_visible.from_um_factor = from_um_factor return Au_visible elif name == "Au": raise ValueError("No source found for Au with that name") ############ SILVER ############################################### if name == "Ag" and paper == "R": #------------------------------------------------------------------ # Elemental metals from A.D. Rakic et al., Applied Optics, Vol. 37, No. 22, pp. 5271-83, 1998 # Wavelength range: 0.2 - 12.4 um # Silver (Ag) metal_range = mp.FreqRange(min=from_um_factor * 1e3 / 12398, max=from_um_factor * 1e3 / 247.97) Ag_plasma_frq = 9.01 * eV_from_um_factor Ag_f0 = 0.845 Ag_frq0 = 1e-10 Ag_gam0 = 0.048 * eV_from_um_factor Ag_sig0 = Ag_f0 * Ag_plasma_frq**2 / Ag_frq0**2 Ag_f1 = 0.065 Ag_frq1 = 0.816 * eV_from_um_factor # 1.519 um Ag_gam1 = 3.886 * eV_from_um_factor Ag_sig1 = Ag_f1 * Ag_plasma_frq**2 / Ag_frq1**2 Ag_f2 = 0.124 Ag_frq2 = 4.481 * eV_from_um_factor # 0.273 um Ag_gam2 = 0.452 * eV_from_um_factor Ag_sig2 = Ag_f2 * Ag_plasma_frq**2 / Ag_frq2**2 Ag_f3 = 0.011 Ag_frq3 = 8.185 * eV_from_um_factor # 0.152 um Ag_gam3 = 0.065 * eV_from_um_factor Ag_sig3 = Ag_f3 * Ag_plasma_frq**2 / Ag_frq3**2 Ag_f4 = 0.840 Ag_frq4 = 9.083 * eV_from_um_factor # 0.137 um Ag_gam4 = 0.916 * eV_from_um_factor Ag_sig4 = Ag_f4 * Ag_plasma_frq**2 / Ag_frq4**2 Ag_f5 = 5.646 Ag_frq5 = 20.29 * eV_from_um_factor # 0.061 um Ag_gam5 = 2.419 * eV_from_um_factor Ag_sig5 = Ag_f5 * Ag_plasma_frq**2 / Ag_frq5**2 Ag_susc = [ mp.DrudeSusceptibility(frequency=Ag_frq0, gamma=Ag_gam0, sigma=Ag_sig0), mp.LorentzianSusceptibility(frequency=Ag_frq1, gamma=Ag_gam1, sigma=Ag_sig1), mp.LorentzianSusceptibility(frequency=Ag_frq2, gamma=Ag_gam2, sigma=Ag_sig2), mp.LorentzianSusceptibility(frequency=Ag_frq3, gamma=Ag_gam3, sigma=Ag_sig3), mp.LorentzianSusceptibility(frequency=Ag_frq4, gamma=Ag_gam4, sigma=Ag_sig4), mp.LorentzianSusceptibility(frequency=Ag_frq5, gamma=Ag_gam5, sigma=Ag_sig5) ] Ag = mp.Medium(epsilon=1.0, E_susceptibilities=Ag_susc, valid_freq_range=metal_range) Ag.from_um_factor = from_um_factor return Ag elif name == "Ag" and paper == "P": #------------------------------------------------------------------ # Metals from D. Barchiesi and T. Grosges, J. Nanophotonics, Vol. 8, 08996, 2015 # Wavelength range: 0.4 - 0.8 um ## WARNING: unstable; field divergence may occur # Silver (Au) # Fit to E.D. Palik, Handbook of Optical Constants, Academic Press, 1985 metal_visible_range = mp.FreqRange(min=from_um_factor * 1e3 / 800, max=from_um_factor * 1e3 / 400) Ag_visible_frq0 = 1 * from_um_factor / 0.142050162130618 Ag_visible_gam0 = 1 * from_um_factor / 18.0357292925015 Ag_visible_sig0 = 1 Ag_visible_frq1 = 1 * from_um_factor / 0.115692151792108 Ag_visible_gam1 = 1 * from_um_factor / 0.257794324096575 Ag_visible_sig1 = 3.74465275944019 Ag_visible_susc = [ mp.DrudeSusceptibility(frequency=Ag_visible_frq0, gamma=Ag_visible_gam0, sigma=Ag_visible_sig0), mp.LorentzianSusceptibility(frequency=Ag_visible_frq1, gamma=Ag_visible_gam1, sigma=Ag_visible_sig1) ] Ag_visible = mp.Medium(epsilon=0.0067526, E_susceptibilities=Ag_visible_susc, valid_freq_range=metal_visible_range) Ag_visible.from_um_factor = from_um_factor return Ag_visible elif name == "Ag": raise ValueError("No source found for Ag with that name") else: raise ValueError("No source found for that material")
def __init__(self, epsilon_diag=mp.Vector3(0, 0, 0), epsilon_offdiag=mp.Vector3(), mu_diag=mp.Vector3(1, 1, 1), mu_offdiag=mp.Vector3(), E_susceptibilities=[], H_susceptibilities=[], E_chi2_diag=mp.Vector3(), E_chi3_diag=mp.Vector3(), H_chi2_diag=mp.Vector3(), H_chi3_diag=mp.Vector3(), D_conductivity_diag=mp.Vector3(), D_conductivity_offdiag=mp.Vector3(), B_conductivity_diag=mp.Vector3(), B_conductivity_offdiag=mp.Vector3(), epsilon=None, index=None, mu=None, chi2=None, chi3=None, D_conductivity=None, B_conductivity=None, E_chi2=None, E_chi3=None, H_chi2=None, H_chi3=None, valid_freq_range=mp.FreqRange(min=-mp.inf, max=mp.inf), material="Au", paper="JC", reference="RIinfo", from_um_factor=1e-3, have_logger=False): if len(E_susceptibilities) > 0 or len(H_susceptibilities) > 0: raise ValueError( "This class doesn't take external susceptibilities!") self.material = material self.paper = paper self.reference = reference self.from_um_factor = from_um_factor interpolated_susceptibility = FromFileSusceptibility( material=material, paper=paper, reference=reference, from_um_factor=from_um_factor, have_logger=have_logger) try: eps_wlen_range = interpolated_susceptibility.epsilon_function._wlen_range_ except: eps_wlen_range = np.array([-mp.inf, mp.inf]) self.valid_wlen_range = eps_wlen_range if self.valid_wlen_range[1] == np.inf: min_freq = -mp.inf elif 1 / self.valid_wlen_range[1] < mp.inf: min_freq = 1 / self.valid_wlen_range[1] else: min_freq = -mp.inf if self.valid_wlen_range[0] == -np.inf: max_freq = mp.inf elif 1 / self.valid_wlen_range[0] > -mp.inf: max_freq = 1 / self.valid_wlen_range[0] else: max_freq = -mp.inf valid_freq_range = mp.FreqRange(min_freq, max_freq) super().__init__(epsilon_diag=epsilon_diag, epsilon_offdiag=epsilon_offdiag, mu_diag=mu_diag, mu_offdiag=mu_offdiag, E_susceptibilities=[interpolated_susceptibility], H_susceptibilities=[], E_chi2_diag=E_chi2_diag, E_chi3_diag=E_chi3_diag, H_chi2_diag=H_chi2_diag, H_chi3_diag=H_chi3_diag, D_conductivity_diag=D_conductivity_diag, D_conductivity_offdiag=D_conductivity_offdiag, B_conductivity_diag=B_conductivity_diag, B_conductivity_offdiag=B_conductivity_offdiag, epsilon=epsilon, index=index, mu=mu, chi2=chi2, chi3=chi3, D_conductivity=D_conductivity, B_conductivity=B_conductivity, E_chi2=E_chi2, E_chi3=E_chi3, H_chi2=H_chi2, H_chi3=H_chi3, valid_freq_range=valid_freq_range)
import meep as mp # default unit length is 1 um um_scale = 1.0 # conversion factor for eV to 1/um [=1/hc] eV_um_scale = um_scale/1.23984193 #------------------------------------------------------------------ # crystalline silicon (cSi) from A. Deinega et al., J. Optical Society of America A, Vol. 28, No. 5, pp. 770-77, 2011 # based on experimental data for intrinsic silicon at T=300K from M.A. Green and M. Keevers, Progress in Photovoltaics, Vol. 3, pp. 189-92, 1995 # wavelength range: 0.4 - 1.0 um cSi_range = mp.FreqRange(min=1, max=1/0.4) cSi_frq1 = 3.64/um_scale cSi_gam1 = 0 cSi_sig1 = 8 cSi_frq2 = 2.76/um_scale cSi_gam2 = 2*0.063/um_scale cSi_sig2 = 2.85 cSi_frq3 = 1.73/um_scale cSi_gam3 = 2*2.5/um_scale cSi_sig3 = -0.107 cSi_susc = [ mp.LorentzianSusceptibility(frequency=cSi_frq1, gamma=cSi_gam1, sigma=cSi_sig1), mp.LorentzianSusceptibility(frequency=cSi_frq2, gamma=cSi_gam2, sigma=cSi_sig2), mp.LorentzianSusceptibility(frequency=cSi_frq3, gamma=cSi_gam3, sigma=cSi_sig3) ]
eV_um_scale = um_scale/1.23984193 # Speed of light in vacuum, m/s c = 299792458 # ------------------------------------------------------------------ # # Silicon (Si) # ------------------------------------------------------------------ # # silicon (Si) from Palik's Handbook & Lukas's book # wavelength range: 1.15 - 1.8 um # Reference: # H. H. Li. Refractive index of silicon and germanium and its wavelength and # temperature derivatives, J. Phys. Chem. Ref. Data 9, 561-658 (1993) Si_range = mp.FreqRange(min=1/1.8, max=1/1.15) eps = 7.9874 eps_lorentz = 3.6880 omega0 = 3.9328e15 delta0 = 0 Si_frq1 = omega0 / (2 * np.pi * c) * 1e-6 Si_gam1 = 0 Si_sig1 = eps_lorentz Si_susc = [ mp.LorentzianSusceptibility(frequency=Si_frq1, gamma=Si_gam1, sigma=Si_sig1) ] Si = mp.Medium(epsilon=eps, E_susceptibilities=Si_susc, valid_freq_range=Si_range) # ------------------------------------------------------------------ #
return cmath.sqrt(epsi) ######################################################## ######################################################## ######################################################## ######################################################## # material library ######################################################## ######################################################## ######################################################## ######################################################## um_scale = 1.0 eV_um_scale = um_scale / 1.23984193 metal_range = mp.FreqRange(min=um_scale / 12.4, max=um_scale / 0.2) ############################ # Indium 295K ############################ metal_range = mp.FreqRange(min=um_scale / 10, max=um_scale / 0.1) In295_plasma_frq = 7.462 * um_scale In295_frq0 = 1e-10 In295_gam0 = 0.147 * um_scale In295_sig0 = In295_plasma_frq**2 / In295_frq0**2 In295_susc = [ mp.DrudeSusceptibility(frequency=In295_frq0, gamma=In295_gam0, sigma=In295_sig0), ]
c=3*10**8 #m/s speed of light Omega_p=Omega_p*np.sqrt(0.34*10**-9)/np.sqrt(alpha/resolution*10**-6)/np.sqrt(alpha/tr_z) # eV (normalize to meep thickness 1/(resolution*stretch) taking into account resolution and stretch courant=0.5/tr_x # Courant factor ## Convert to frequency (meep units) frq_min = 1/wvl_max frq_max = 1/wvl_min frq_cen = 0.5*(frq_min+frq_max) dfrq = frq_max-frq_min um_scale = alpha# default unit length is 1 um eV_um_scale = um_scale/1.23984193# conversion factor for eV to 1/um [=1/hc] h_plankeV=4.135667662*10**-15 # eVs ## Define material susceptibility # Drude drude_range = mp.FreqRange(min=um_scale/(wvl_max*2), max=um_scale/(wvl_min/2)) # Valid frequency range um_scale/wavelength drude_frq = Omega_p*eV_um_scale # converts energy to meep frequency drude_gam = Gama*eV_um_scale # converts energy to meep frequency drude_sig = Sigma drude_sig_diag=Sigma_diag epsilon = epsilon_inf # epsilon infinity drude_susc = [mp.DrudeSusceptibility(frequency=drude_frq, gamma=drude_gam, sigma=drude_sig, sigma_diag=drude_sig_diag)] drude = mp.Medium(epsilon_diag=mp.Vector3(epsilon, epsilon, epsilon), E_susceptibilities=drude_susc, valid_freq_range=drude_range) c1=mp.Vector3(tr_x, 0.0, 0.0) c2=mp.Vector3(0.0, tr_y, 0.0) c3=mp.Vector3(0.0, 0.0, tr_z) m_tr=mp.Matrix(c1,c2,c3) drude.transform(m_tr) material_set=drude
elif (ORAN == 1): # for 1 portion guess = [ 2.74596985e+00, 2.55454715e-01, 8.30476963e+00, 1.10151790e+01, -2.39854301e-01, 1.00000000e-10, 9.30170074e-02, 2.10186777e+00, 2.44996696e-01, 4.24986161e+00, 3.73509890e+00, 1.00135561e+00, 2.49007699e-01, 2.76360724e+00, 3.71637890e-01, 6.68914595e-01, 3.00816822e+00, 5.91449138e-01, 4.46871264e+00 ] x = guess um_scale = 1.0 # conversion factor for eV to 1/um [=1/hc] eV_um_scale = um_scale / 1.23984193 metal_range = mp.FreqRange(min=um_scale / 0.7, max=um_scale / .3) Au_plasma_frq = x[0] * eV_um_scale Au_f0 = x[1] Au_frq0 = 1e-10 Au_gam0 = x[2] * eV_um_scale Au_sig0 = Au_f0 * Au_plasma_frq**2 / Au_frq0**2 Au_f1 = x[3] Au_frq1 = x[4] # 0.42 um Au_gam1 = x[5] * eV_um_scale Au_sig1 = Au_f1 * Au_plasma_frq**2 / Au_frq1**2 Au_f2 = x[6] Au_frq2 = x[7] # 0.42 um Au_gam2 = x[8] * eV_um_scale
import meep as mp # default unit length is 1 um um_scale = 1.0 # conversion factor for eV to 1/um [=1/hc] eV_um_scale = um_scale / 1.23984193 #------------------------------------------------------------------ # crystalline silicon (cSi) from A. Deinega et al., J. Optical Society of America A, Vol. 28, No. 5, pp. 770-77, 2011 # based on experimental data for intrinsic silicon at T=300K from M.A. Green and M. Keevers, Progress in Photovoltaics, Vol. 3, pp. 189-92, 1995 # wavelength range: 0.4 - 1.0 um cSi_range = mp.FreqRange(min=um_scale, max=um_scale / 0.4) cSi_frq1 = 3.64 / um_scale cSi_gam1 = 0 cSi_sig1 = 8 cSi_frq2 = 2.76 / um_scale cSi_gam2 = 2 * 0.063 / um_scale cSi_sig2 = 2.85 cSi_frq3 = 1.73 / um_scale cSi_gam3 = 2 * 2.5 / um_scale cSi_sig3 = -0.107 cSi_susc = [ mp.LorentzianSusceptibility(frequency=cSi_frq1, gamma=cSi_gam1, sigma=cSi_sig1),
libPath = os.path.abspath(os.path.join(d, 'lib')) sys.path.insert(0, libPath) import meep as mp import SiP_Materials import matplotlib import matplotlib.pyplot as plt import numpy as np # Speed of light in vacuum, m/s c = 3e8 # default unit length is 1 um um_scale = 1.0 SiO2_range = mp.FreqRange(min=1 / 1.77, max=1 / 0.25) SiO2_frq1 = 1 / (0.103320160833333 * um_scale) SiO2_gam1 = 0 #1/(12.3984193000000*um_scale) SiO2_sig1 = 1.12 SiO2_susc = [ mp.LorentzianSusceptibility(frequency=SiO2_frq1, gamma=SiO2_gam1, sigma=SiO2_sig1) ] SiO2 = mp.Medium(epsilon=1.0, E_susceptibilities=SiO2_susc, valid_freq_range=SiO2_range)