在Python-Meep中设置FDTD模拟源

在Python-Meep中设置FDTD模拟源,python,meep,Python,Meep,我正在尝试使用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, vo

我正在尝试使用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)
在电场沿X轴极化的情况下,无法发送均匀的平面波,这在垂直于Y轴的模拟体积边界处确实表现出来,在该边界处,场振幅降为零。这种故障不会发生在垂直于X的两个边界上

然而,这是完全物理的解决方案;默认情况下,边界表现为完美的电/磁导体;平行于PEC的电场分量在其附近必须为零。良导体屏蔽外部电场

如果需要精确的平面波,则必须在字段初始化后附加另一个命令,以将边界定义为周期:

f、 使用\u blochmeep.X,0 f、 使用\u blochmeep.Y,0

请注意,第二个参数不必为零,从而可以定义任意倾斜波源

有关更高级、更方便的示例,请参见

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)