/
material-dispersion.py
49 lines (36 loc) · 1.51 KB
/
material-dispersion.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# Material dispersion example, from the Meep tutorial. Here, we simply
# simulate homogenous space filled with a dispersive material, and compute
# its modes as a function of wavevector k. Since omega/c = k/n, we can
# extract the dielectric function epsilon(omega) = (ck/omega)^2.
from __future__ import division
import meep as mp
cell = mp.Vector3()
resolution = 20
# We'll use a dispersive material with two polarization terms, just for
# illustration. The first one is a strong resonance at omega=1.1,
# which leads to a polaritonic gap in the dispersion relation. The second
# one is a weak resonance at omega=0.5, whose main effect is to add a
# small absorption loss around that frequency.
susceptibilities = [
mp.LorentzianSusceptibility(frequency=1.1, gamma=1e-5, sigma=0.5),
mp.LorentzianSusceptibility(frequency=0.5, gamma=0.1, sigma=2e-5)
]
default_material = mp.Medium(epsilon=2.25, E_susceptibilities=susceptibilities)
fcen = 1.0
df = 2.0
sources = [mp.Source(mp.GaussianSource(fcen, fwidth=df), component=mp.Ez, center=mp.Vector3())]
kmin = 0.3
kmax = 2.2
k_interp = 99
kpts = mp.interpolate(k_interp, [mp.Vector3(kmin), mp.Vector3(kmax)])
sim = mp.Simulation(
cell_size=cell,
geometry=[],
sources=sources,
default_material=default_material,
resolution=resolution
)
all_freqs = sim.run_k_points(200, kpts) # a list of lists of frequencies
for fs, kx in zip(all_freqs, [v.x for v in kpts]):
for f in fs:
print("eps:, {.6f}, {.6f}, {.6f}".format(f.real, f.imag, (kx / f)**2))