FDTD 教程:绿光在自由空间中的传播
1. 概述:你将要模拟什么
本教程使用最简单的物理系统来介绍 OghmaNano 中的时域有限差分(FDTD)引擎: 电磁波在自由空间中的传播。波长为 530 nm 的单色绿光源 被注入一个空的计算域中。这里没有 波导、没有谐振器,也没有除真空之外的其他材料。其目的不是演示某个器件,而是 让数值计算机制本身变得可见。
FDTD 模块在离散空间网格上直接在时域中求解 Maxwell 旋度方程。在每一个 时间步,电场和磁场都会在整个网格上更新。由于该算法具有高度 并行性,OghmaNano 使用 OpenCL 执行它,并会在可用时自动使用你的 GPU。本教程 因此既是一个物理演示,也是对 GPU 加速 FDTD 后端的首次介绍。
在本页结束时,你将完成一个仿真的创建,检查世界尺寸和空间网格,运行 求解器,并可视化绿光如何在三维空间中传播。
2. 创建 Free space 仿真
打开 New simulation 窗口并选择 FDTD examples 类别,然后选择 名为 Free space 的示例。下面显示了这两个选择窗口。
加载后,主 OghmaNano 窗口会显示一个简单的三维场景。计算世界 初始时除了一个光源和一个探测器区域之外是空的。在 3D 视图中右键单击并启用 Show world box。一个红色边界框将出现,用于定义 FDTD 域的范围。
可以通过点击左侧工具栏上的 Substrate xz-size 按钮来检查世界尺寸。 这会打开 world size 编辑器,其中以 微米为单位定义仿真域的物理尺寸。在本教程中你无需更改任何内容;该域已经被配置为 足以舒适地容纳数个波长的绿光。
3. 检查光学设置和网格
接下来,打开窗口顶部的 Optical 功能区。
点击 Optical mesh 打开网格编辑器。
网格编辑器显示了每个空间方向上使用的网格点数量。这些参数决定了 FDTD 计算的 空间分辨率。波长范围设置为 531 nm 到 532 nm,这 对应于绿光。在本示例中,网格编辑器中显示的厚度参数会自动 按世界尺寸缩放,因此可以忽略。重要的一点是,空间网格足够精细, 能够分辨电磁波长。
4. 运行 GPU 加速的 FDTD 求解器
点击 Run simulation 按钮或按下 F9 启动仿真。 Terminal 选项卡将显示求解器信息。
snapshots/ 目录。
在 Terminal 输出中,请注意绿色文本 Searching for OpenCL devices。在这一阶段, 程序正在扫描你的系统以查找兼容的 GPU。在具有受支持显卡的系统上,求解器将 选择 GPU 并在那里运行时间步进循环。在所示示例中,计算运行在一个 使用 CPU 模拟的 OpenCL 后端上,但在现代工作站上,同样的仿真会自动使用 图形处理器进行加速。
5. 检查输出和场快照
完成后,切换到 Output 选项卡。生成的文件会列在其中。
双击 snapshots 目录以打开快照查看器。 在窗口底部的下拉列表中选择 power density。彩色场表示 瞬时电磁能量密度。使用水平滑块前后移动时间,并使用 空间滑块检查域的不同截面。在某些计算机上,特别是在 运行大网格时,查看器在加载每个数据集时可能会稍作停顿。
随着你逐步推进时间,你将观察到波前在整个域中扩展。在自由空间中,没有 边界或结构,传播是均匀且对称的,仅受计算盒边缘吸收边界 条件的限制。
6. 查看探测器功率
主窗口中可见的紫色网格代表放置在仿真域内的一个探测器平面。 双击 Output 选项卡中的 detector 0 以打开其记录的功率曲线。
得到的图显示了穿过该平面的电磁功率随时间的变化。初始时, 探测器记录到零信号。当波前到达该平面时,测得的功率开始上升, 然后根据光源的时间轮廓趋于稳定。这一简单配置使得将 快照查看器中波的可视传播与定量功率测量直接联系起来变得容易。
你现在已经完成了在 OghmaNano 中的第一个 FDTD 仿真。尽管该系统不包含材料或 器件,它仍展示了完整的数值计算流程:世界定义、网格构建、GPU 设备选择、 时间步进、场可视化以及探测器提取。在后续教程中,这些相同的工具将 应用于具有结构的光子和光电系统。
7. 切换到 2D(XZ)以加速仿真
在很多情况下,并不需要完整的三维仿真来理解结构和器件,尤其是当物理过程 在某一个方向上本质上保持不变时。在这种情况下,你可以通过将问题降为二维来 获得显著的加速。对于 Free space 示例,从 3D 世界切换到 XZ 仿真会移除整个 Y 方向的计算网格。其结果是 网格点更少、场数据更少、运行时间大幅缩短——通常足够快,使得重复运行几乎变成交互式操作。
要执行此操作,请返回 Optical 功能区,打开 Optical mesh,并选择 如 ?? 所示的 2D 网格配置。 关键变化是抑制 Y 轴,从而使仿真变为一个 XZ 平面 计算。
现在网格已经缩减为二维,请再次运行仿真。你会立刻注意到,与 3D 情况相比,
求解器几乎是瞬间完成的。再次打开 snapshots/ 目录,并在快照查看器中
滚动浏览时间
(??)。
由于数据集小得多,查看器不仅加载更快,而且在拖动
时间滑块或移动空间截面控制时响应也更迅速。
需要注意的一点是,动画的感知平滑性可能会发生变化。在 2D 运行中, 仿真推进得非常快,而你通常会转储更少的帧,因此在拖动时间时, 演化看起来可能会稍微有些跳跃——这只是因为在相邻时间索引之间记录的快照更少。 如果你希望更细致地跟踪波传播的时间细节,可以增加写入磁盘的输出量。
为此,请再次进入 Optical 选项卡,点击 FDTD simulation 按钮打开 FDTD 配置窗口,并将 Output verbosity to disk 从 Write everything to disk every 8th step 更改为 Write everything to disk (??)。 这会在每一个时间步都写入一个快照。当你重新打开快照查看器时,将能够非常精确地 跟踪波随时间传播,在播放和拖动浏览时获得更高的时间分辨率。