2017-07-15 25 views
0

我正在尝试使用Python-Meep包进行一些FDTD模拟。首先,我想模拟在'z'方向上穿过真空的平面波。在三维情况下正确设置源代码时遇到问题。在2D情况下,我可以将源代码作为触及计算矩阵边界的线。在3D中,它看起来是不可能的。以下是简单的例子。 2D情况下,源是从(x,y)=(0,.1e-6)到(x,y)=(15e-6,.1e-6)(从边界到边界)。得益于此,平面波无扰动地传播到矩阵的另一端(它被反射的地方)。在Python-Meep中为FDTD模拟设置源代码

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)。这应该创建一个从边界到矩阵边界的平面。但是,由于未知原因,源不会触及边界(有一个小空间),无论我做什么,我都不能强迫它触摸它。结果,我无法创建一个以'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) 

回答

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