在 Python-Meep 中设置源以进行 FDTD 模拟
Setting source in Python-Meep for FDTD simulation
我正在尝试使用 Python-Meep 包进行一些 FDTD 模拟。首先,我想模拟在 'z' 方向穿过真空的平面波。我在三维情况下正确设置源时遇到问题。在 2D 情况下,我可以将源作为接触计算矩阵边界的线。在 3D 中,这看起来是不可能的。下面是简单的例子。
2D 情况:在 2D 情况下,源是从 (x,y)=(0 , .1e-6) 到 (x,y)=(15e-6 , .1e-6) (从边界到边界)。由于这一点,平面波不受干扰地传播到矩阵的另一端(在那里被反射)。
import meep_mpi as meep
x, y, voxelsize = 15e-6, 15e-6, 50e-9
vol = meep.vol2d(x, y, 1/voxelsize)
class Model(meep.Callback):
def __init__(self):
meep.Callback.__init__(self)
def double_vec(self, r):
return 1
model = Model()
meep.set_EPS_Callback(model.__disown__())
struct = meep.structure(vol, meep.EPS)
f = meep.fields(struct)
f.add_volume_source(meep.Ex,
meep.continuous_src_time(473.755e12/3e8), # 632.8nm
meep.volume(meep.vec(0e-6, .1e-6), meep.vec(15e-6, .1e-6)))
while f.time()/3e8 < 30e-15:
f.step()
meep.del_EPS_Callback()
output = meep.prepareHDF5File("Ex1.h5")
f.output_hdf5(meep.Ex, vol.surroundings(), output)
del(output)
3D 情况:源是从 (x,y,z)=(0 , 0 , .1e-6) 到 (x,y,z)=(15e-6 , 15e-6 , .1e-6).这应该创建一个从矩阵边界到边界的平面。但是,由于未知原因,源没有触及边界(有一个小空space),无论我做什么,我都不能强迫它触及它。因此,我无法创建沿 'z' 方向传播的平面波。到目前为止,我尝试过:(a)明确给出 no_pml
参数(b)给出 pml(0)
参数,(c)改变采样,(d)改变源的 'z' 位置。没有运气。如果有任何建议,我将不胜感激。
import meep_mpi as meep
x, y, z, voxelsize = 15e-6, 15e-6, 15e-6, 50e-9
vol = meep.vol3d(x, y, z, 1/voxelsize)
class Model(meep.Callback):
def __init__(self):
meep.Callback.__init__(self)
def double_vec(self, r):
return 1
model = Model()
meep.set_EPS_Callback(model.__disown__())
struct = meep.structure(vol, meep.EPS)
f = meep.fields(struct)
f.add_volume_source(meep.Ex,
meep.continuous_src_time(473.755e12/3e8), # 632.8nm
meep.volume(meep.vec(0, 0, .1e-6), meep.vec(15e-6, 15e-6, .1e-6)))
while f.time()/3e8 < 30e-15:
f.step()
meep.del_EPS_Callback()
output = meep.prepareHDF5File("Ex1.h5")
f.output_hdf5(meep.Ex, vol.surroundings(), output)
del(output)
您无法发送电场沿 X 轴极化的均匀平面波,这确实体现在垂直于 Y 轴的模拟体积边界处,场振幅降至零。在垂直于X的两个边界上不会出现这个问题。
然而,这是完全物理的解决方案;默认情况下,边界表现为完美的 electric/magnetic 导体;平行于 PEC 的电场分量在其附近必须为零。 (良导体屏蔽外部电场。)
如果你需要一个精确的平面波,你必须在场初始化后附加另一个命令,将边界定义为周期性的:
f.use_bloch(meep.X, 0)
f.use_bloch(meep.Y, 0)
请注意,第二个参数不必为零,从而可以定义任意倾斜波源。
有关更高级(也更方便)的示例,请参阅 https://github.com/FilipDominec/python-meep-utils/blob/master/scatter.py
我正在尝试使用 Python-Meep 包进行一些 FDTD 模拟。首先,我想模拟在 'z' 方向穿过真空的平面波。我在三维情况下正确设置源时遇到问题。在 2D 情况下,我可以将源作为接触计算矩阵边界的线。在 3D 中,这看起来是不可能的。下面是简单的例子。
2D 情况:在 2D 情况下,源是从 (x,y)=(0 , .1e-6) 到 (x,y)=(15e-6 , .1e-6) (从边界到边界)。由于这一点,平面波不受干扰地传播到矩阵的另一端(在那里被反射)。
import meep_mpi as meep
x, y, voxelsize = 15e-6, 15e-6, 50e-9
vol = meep.vol2d(x, y, 1/voxelsize)
class Model(meep.Callback):
def __init__(self):
meep.Callback.__init__(self)
def double_vec(self, r):
return 1
model = Model()
meep.set_EPS_Callback(model.__disown__())
struct = meep.structure(vol, meep.EPS)
f = meep.fields(struct)
f.add_volume_source(meep.Ex,
meep.continuous_src_time(473.755e12/3e8), # 632.8nm
meep.volume(meep.vec(0e-6, .1e-6), meep.vec(15e-6, .1e-6)))
while f.time()/3e8 < 30e-15:
f.step()
meep.del_EPS_Callback()
output = meep.prepareHDF5File("Ex1.h5")
f.output_hdf5(meep.Ex, vol.surroundings(), output)
del(output)
3D 情况:源是从 (x,y,z)=(0 , 0 , .1e-6) 到 (x,y,z)=(15e-6 , 15e-6 , .1e-6).这应该创建一个从矩阵边界到边界的平面。但是,由于未知原因,源没有触及边界(有一个小空space),无论我做什么,我都不能强迫它触及它。因此,我无法创建沿 'z' 方向传播的平面波。到目前为止,我尝试过:(a)明确给出 no_pml
参数(b)给出 pml(0)
参数,(c)改变采样,(d)改变源的 'z' 位置。没有运气。如果有任何建议,我将不胜感激。
import meep_mpi as meep
x, y, z, voxelsize = 15e-6, 15e-6, 15e-6, 50e-9
vol = meep.vol3d(x, y, z, 1/voxelsize)
class Model(meep.Callback):
def __init__(self):
meep.Callback.__init__(self)
def double_vec(self, r):
return 1
model = Model()
meep.set_EPS_Callback(model.__disown__())
struct = meep.structure(vol, meep.EPS)
f = meep.fields(struct)
f.add_volume_source(meep.Ex,
meep.continuous_src_time(473.755e12/3e8), # 632.8nm
meep.volume(meep.vec(0, 0, .1e-6), meep.vec(15e-6, 15e-6, .1e-6)))
while f.time()/3e8 < 30e-15:
f.step()
meep.del_EPS_Callback()
output = meep.prepareHDF5File("Ex1.h5")
f.output_hdf5(meep.Ex, vol.surroundings(), output)
del(output)
然而,这是完全物理的解决方案;默认情况下,边界表现为完美的 electric/magnetic 导体;平行于 PEC 的电场分量在其附近必须为零。 (良导体屏蔽外部电场。)
如果你需要一个精确的平面波,你必须在场初始化后附加另一个命令,将边界定义为周期性的:
f.use_bloch(meep.X, 0)
f.use_bloch(meep.Y, 0)
请注意,第二个参数不必为零,从而可以定义任意倾斜波源。
有关更高级(也更方便)的示例,请参阅 https://github.com/FilipDominec/python-meep-utils/blob/master/scatter.py