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
Ejemplo n.º 2
0
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)
Ejemplo n.º 3
0
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
Ejemplo n.º 4
0
    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)
Ejemplo n.º 5
0
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
Ejemplo n.º 6
0
    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!")
Ejemplo n.º 7
0
    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
Ejemplo n.º 8
0
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")
Ejemplo n.º 9
0
    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)
Ejemplo n.º 10
0
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) ]
Ejemplo n.º 11
0
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)

# ------------------------------------------------------------------ #
Ejemplo n.º 12
0
    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),
]
Ejemplo n.º 13
0
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
    
Ejemplo n.º 14
0
        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
Ejemplo n.º 15
0
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),
Ejemplo n.º 16
0
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)