在Python-Meep中设置源以进行FDTD模拟

时间:2017-07-15 20:35:16

标签: 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, 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)。这应该创建从矩阵的边界到边界的平面。然而,由于未知原因,源不会触及边界(有一个小的空白区域),无论我做什么,我都不能强迫它触摸它。结果,我不能创造一个在'&#39; z&#39;方向。到目前为止,我尝试过:(a)明确给出no_pml论证(b)给出pml(0)论证,(c)改变抽样,(d)改变&#39; z&#39;来源的位置。没有运气。我会很感激任何建议。

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)

1 个答案:

答案 0 :(得分:1)

Screenshot of Ex1.vtk from Paraview您无法发送具有沿X轴极化的电场的均匀平面波确实在垂直于Y轴的模拟体积边界处出现,其中场振幅下降到零。在垂直于X的两个边界上不会发生这种麻烦。

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

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

f.use_bloch(meep.X, 0) f.use_bloch(meep.Y, 0)

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

有关更高级(更方便)的示例,请参阅https://github.com/FilipDominec/python-meep-utils/blob/master/scatter.py