-
Notifications
You must be signed in to change notification settings - Fork 652
/
Copy pathpw-source.py
63 lines (51 loc) · 1.81 KB
/
pw-source.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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# This example creates an approximate Ez-polarized planewave in vacuum
# propagating at a 45-degree angle, by using a couple of current sources
# with amplitude exp(ikx) corresponding to the desired planewave.
import cmath
import math
import meep as mp
s = 11 # the size of the computational cell, not including PML
dpml = 1 # thickness of PML layers
sxy = s + 2 * dpml # cell size, including PML
cell = mp.Vector3(sxy, sxy, 0)
pml_layers = [mp.PML(dpml)]
resolution = 10
# pw-amp is a function that returns the amplitude exp(ik(x+x0)) at a
# given point x. (We need the x0 because current amplitude functions
# in Meep are defined relative to the center of the current source,
# whereas we want a fixed origin.) Actually, it is a function of k
# and x0 that returns a function of x ...
def pw_amp(k, x0):
def _pw_amp(x):
return cmath.exp(1j * k.dot(x + x0))
return _pw_amp
fcen = 0.8 # pulse center frequency
df = 0.02 # turn-on bandwidth
kdir = mp.Vector3(1, 1) # direction of k (length is irrelevant)
n = 1 # refractive index of material containing the source
k = kdir.unit().scale(2 * math.pi * fcen * n) # k with correct length
sources = [
mp.Source(
mp.ContinuousSource(fcen, fwidth=df),
component=mp.Ez,
center=mp.Vector3(-0.5 * s, 0),
size=mp.Vector3(0, s),
amp_func=pw_amp(k, mp.Vector3(x=-0.5 * s)),
),
mp.Source(
mp.ContinuousSource(fcen, fwidth=df),
component=mp.Ez,
center=mp.Vector3(0, -0.5 * s),
size=mp.Vector3(s, 0),
amp_func=pw_amp(k, mp.Vector3(y=-0.5 * s)),
),
]
sim = mp.Simulation(
cell_size=cell,
sources=sources,
boundary_layers=pml_layers,
resolution=resolution,
default_material=mp.Medium(index=n),
)
t = 400 # run time
sim.run(mp.at_end(mp.output_efield_z), until=t)