在pythoneep中设置源进行FDTD模拟

2024-10-02 22:31:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用pythonmeep包来进行一些FDTD模拟。首先,我想模拟一个平面波在真空中沿z方向传播。我有问题在三维情况下正确地设置源。在二维的情况下,我可以把源作为一条接触计算矩阵边界的线。在3D里看起来这是不可能的。下面是一些简单的例子。在

二维情况:在二维情况下,源是一条从(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,z)=(0,0,.1e-6)到(x,y,z)=(15e-6,15e-6,.1e-6)。这将创建一个从矩阵边界到边界的平面。然而,不知为什么,源没有接触到边界(有一个很小的空白),无论我做什么,我都不能强迫它接触它。因此,我无法产生沿z方向传播的平面波。直到现在,我尝试:(a)显式地给出no_pml参数(b)给出pml(0)参数,(c)更改采样,(d)更改源的“z”位置。运气不好。如有任何建议,我将不胜感激。在

^{pr2}$

Tags: selfoutputmodeldefcallback情况矩阵eps
1条回答
网友
1楼 · 发布于 2024-10-02 22:31:38

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

相关问题 更多 >