在Python-Meep中设置FDTD模拟源
我正在尝试使用Python Meep包进行一些FDTD模拟。首先,我想模拟一个平面波沿“z”方向穿过真空。我在正确设置三维场景中的源时遇到问题。在2D的情况下,我可以使源成为一条线,它接触到计算矩阵的边界。在3D中,这看起来是不可能的。下面是一些简单的例子 2D案例:在2D案例中,源是从x、y=0、.1e-6到x、y=15e-6、.1e-6从边界到边界的一条线。由于这一点,平面波在不受干扰的情况下传播到矩阵的另一端,在那里被反射在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
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)