In [1]:
import meep as mp
from meep import mpb
import math
import numpy as np
import matplotlib.pyplot as plt
from scipy.ndimage.filters import gaussian_filter
In [2]:
num_bands = 31
gaas = mp.Medium(epsilon=12.96)
k_points = [mp.Vector3(0., 0.5),]
geometry_lattice = mp.Lattice(size=mp.Vector3(5, 5),
basis1=mp.Vector3(math.sqrt(3)/2, 0.5),
basis2=mp.Vector3(math.sqrt(3)/2, -0.5))
geometry = [mp.Cylinder(0.25, material=gaas)]
geometry = mp.geometric_objects_lattice_duplicates(geometry_lattice, geometry)
defect = mp.Cylinder(0.6, material=gaas)
geometry.append(defect)
default_material = mp.Medium(epsilon=2.4)
resolution = 32
target_freq = (0.229 + 0.307) / 2
ms = mpb.ModeSolver(num_bands=num_bands,
k_points=k_points,
geometry=geometry,
geometry_lattice=geometry_lattice,
resolution=resolution,
default_material=default_material,
)
efields = []
def get_efields(ms, band):
efields.append(ms.get_efield(band, bloch_phase=False))
ms.run_tm(mpb.output_at_kpoint(k_points[0]), mpb.fix_efield_phase,
get_efields)
In [14]:
#for i, freq in enumerate(ms.get_freqs()):
# if 0.229 < freq < 0.307:
# ms.get_dfield(i, bloch_phase=False)
# ms.compute_field_energy()
# # energy = ms.compute_energy_in_objects([defect])
# energy = ms.compute_energy_in_dielectric(12, 13)
# print(i, freq, energy)
# Create an MPBData instance to transform the efields
md = mpb.MPBData(rectify=True, resolution=32, periods=1)
converted = []
for i, f in enumerate(efields[25:31]):
if i in (1, 3):
continue
# Get just the z component of the efields
f = f[..., 0, 2]
converted.append(md.convert(f))
#smooth_eps = gaussian_filter(converted_eps.T, sigma=1)
eps = ms.get_epsilon()
converted_eps = md.convert(eps)
smooth_eps = gaussian_filter(converted_eps.T, sigma=1)
fig, ax = plt.subplots(2, 2, squeeze=False)
labels = ['dipole', 'quadrupole', 'monopole', 'hexapole']
for i, f in enumerate(converted):
ax[i//2, i%2].contour(smooth_eps, levels=[3,], cmap='binary_r')
ax[i//2, i%2].imshow(np.real(f).T, interpolation='spline36', cmap='RdBu', alpha=0.9)
ax[i//2, i%2].axis('off')
ax[i//2, i%2].set_title(labels[i])
#result = ms.run_tm(mpb.output_at_kpoint(k_points[0], mpb.fix_efield_phase,
# mpb.output_efield_z))
In [ ]: