此前,OpticStudio 为一维光栅仿真提供了一维 RCWA 插件。本文介绍了一种类似但功能强大得多的工作流程,该流程基于 Zemax OpticStudio 与 Lumerical RCWA 之间的动态链接。
在这一工作流程中,设计人员在 Zemax OpticStudio 中构建宏观光学系统,并在 Lumerical 中构建光栅的微结构。两款软件中的仿真可无缝连接。在 Zemax OpticStudio 的光线追迹过程中,如果某条光线打到光栅上,系统会自动调用 Lumerical RCWA 来求解电磁场响应,并返回相应数据。
该工作流程具有以下几个优势:
1.复杂的一维/二维光栅建模:借助强大的几何编辑器,用户可以轻松构建并仿真任意的一维或二维光栅。
2.快速原型设计:Lumerical 中的参数会暴露给 OpticStudio。在 OpticStudio 中所做的任何修改,都可以自动触发 Lumerical 针对新的光栅结构计算更新后的数据,并返回新结果,无需进行数据导入和导出。
3.优化能力:用户可以在 Lumerical 中方便地定义自定义参数化模型,并结合整个系统的性能对光栅形状进行优化。
4.光栅结构的导入与导出:该工作流程支持以 STEP、STL 和 GDS II 文件格式对光栅几何结构进行标准导入与导出。
5.空间变化:用户可以定义光栅参数在光栅不同位置处的变化方式。
1.1 静态工作流程与动态工作流程
值得一提的是,目前 Lumerical 与 OpticStudio 之间已有两种数据交换工作流程。其中一种是本文将要介绍的动态工作流程;另一种是以不同方式运行的静态工作流程。这两种工作流程在灵活性方面各有特点,并不存在绝对优劣之分。用户应根据具体的设计案例来选择使用哪一种工作流程。
2. 系统要求
要使用这一动态工作流程,Zemax OpticStudio 和 Lumerical 必须安装在同一台以 Windows 为操作系统的电脑上。
Zemax OpticStudio 的版本必须为 Ansys Zemax OpticStudio Premium 或 Ansys Zemax OpticStudio Enterprise。不支持 Legacy Zemax OpticStudio。Lease 和 Paid-Up 两类 Ansys Zemax 许可证均可用于使用该工具。
Lumerical 必须具备 FDTD 许可证,且版本必须为 2023 R1.0 或更高版本。
3. Lumerical:准备光栅文件(.fsp)
附件中提供了 6 个简单的光栅文件。用户可以将这些文件保存到 \Zemax\DLL\Diffractive\ 路径下,以便读取。下表对各个文件进行了说明。
| |
| 这是一个具有倾斜矩形结构的一维光栅。它包含 10 个参数,允许用户对细节变化进行定义。参数的定义见附录中的图示。 |
lswm_2D_hex_cylinder_221210.fsp | 这是一个二维光栅,其中圆柱结构以六边形排布方式进行周期性重复。 |
lswm_2D_hex_polygon4_221210.fsp | 这是一个二维光栅,其中四边形柱结构以六边形排布方式进行周期性重复。 |
lswm_2D_hex_rectangular_ pillar_221210.fsp | 这是一个二维光栅,其中矩形柱结构以六边形排布方式进行周期性重复。 |
lswm_2D_hex_rhombus_221210.fsp | 这是一个二维光栅,其中矩形柱结构以六边形排布方式进行周期性重复。这是一个二维光栅,其中菱形柱结构以六边形排布方式进行周期性重复。 |
lswm_2D_rec_cylinder_221210.fsp | 这是一个二维光栅,其中圆柱结构沿 x 和 y 方向进行周期性重复。 |
3.1 提示
• 对于六边形二维光栅,在搭建系统时,用户需要手动确保 period_y = sqrt(3) * period_x,这样才能形成六边形晶格。
• 对于折射率参数,例如 p4_slab_index,如果其值为 0,则使用 n_pos 的值;如果其值为 -1,则使用 n_neg 的值。这是通过在 Lumerical 文件中编写脚本来实现控制的。
如果这 6 种结构不能满足用户需求,用户可以按照附录中的说明自定义自己的光栅。
4.空间变化参数
空间变化功能自 2026R1.1 起可用。可通过将参数 “Spatial Vary File#” 设置为正整数来启用。插件将从 \Document\Zemax\DLL\Diffractive\ 中加载一个 spatial_vary_#.txt 文件,其中 # 就是参数 “Spatial Vary File#” 所设置的正整数。用户需要在 spatial_vary_#.txt 文件中定义参数如何变化的方程以及相应边界。
注意:该文件只会被加载一次。如果用户在文件加载后又对其进行了编辑,这些更改将不会生效。
4.1 输入文件 spatial_vary_#.txt 的格式
在 spatial_vary_#.txt 文件中,任何以 # 符号开头的行都会被忽略,所有空白字符也都会被跳过。
用户可以定义如下形式的方程,例如:p# = v0 * (1 + y/150 + v1),其中 p# 是需要进行空间变化的参数。变量 v0、v1、v2……对应于 DLL 插件界面中定义的数值,这些数值可以手动调整,也可以在优化过程中调整。变量 x 和 y 表示应用该 DLL 插件的对象的局部坐标。除基本算术运算符(+、-、*、/)外,解析器还支持三角函数(sin、cos、tan、asin、acos、atan)、高级函数(log、log10、sqrt、abs),以及常数π(pi)和e(e)。
Spatial Vary Mode = 0 —— 在 XY 空间中采样
当 Spatial Vary Mode 设置为 0 时,DLL 插件会在 x–y 位置空间中进行采样。
此时,spatial_vary_#.txt 文件中必须包含一行,格式如下:
xmin, xmax, xinterval, ymin, ymax, yinterval
其中,xmin/xmax 和 ymin/ymax 定义空间边界(单位为毫米),xinterval 和 yinterval 定义采样间隔。
如果某条光线在这些边界之外与光栅相交,则该光线会报错并停止。如果光线在边界之内与光栅相交,则 RCWA 只会在由上述六个数值定义的离散网格点上进行评估。
参数 Spatial Vary Interp 对采样的影响如下:
• 如果 Spatial Vary Interp = 0,则使用距离最近的采样网格点处的 RCWA 数据。
• 如果 Spatial Vary Interp ≠ 0,则使用最近四个网格点处的数据进行插值。
Spatial Vary Mode = 1 —— 在参数空间中采样
当 Spatial Vary Mode 设置为 1 时,DLL 插件会在参数空间中进行采样。
此时,spatial_vary_#.txt 文件中的每个方程后都必须跟随如下内容:
; min, max, interval
这些数值分别指定该参数的下限、上限和采样间隔。
示例:
p# = v0*(1 + y/150 + v1); -10, 10, 2.5
当一条光线打到光栅上时,系统会先根据所定义的方程计算交点处的参数值。如果某个参数超出了其定义的范围,则该光线会报错并停止。否则,RCWA 只会在由 min、max 和 interval 所定义的参数空间采样点上进行评估。
参数 Spatial Vary Interp 对采样的影响如下:
• 如果 Spatial Vary Interp = 0,则使用最近的参数空间采样点。
• 如果 Spatial Vary Interp ≠ 0,则在最近的参数采样点之间执行线性插值。
示例
1 个变化参数 → 2 个点
2 个变化参数 → 4 个点
3 个变化参数 → 8 个点
注意:由于采样点数量会随着发生空间变化的参数数量增加而呈指数增长,因此当存在较多参数发生空间变化时,建议用户使用 Spatial Vary Mode 0,以避免计算量过大。
5. 示例
在 OpticStudio 中打开附件 “Demo_simple_grating_test.zar”。然后进入该对象的 Diffraction 属性设置。将 Link Lumerical 参数改为非零值,并更新系统中的 3D Layout。
Lumerical FDTD 窗口会自动建立链接,随后 3D Layout 将如下图所示:
如果进行光线追迹,我们可以在探测器中看到如下所示的结果:
此外,在附件文件中,用户还可以找到更多应用示例,包括 AR 波导、Flash LiDAR 以及曲面上的光栅。
Appendix - 自定义你的光栅
请注意,如果光栅文件(.fsp)设置不正确,可能会导致仿真失败。我们已提供故障排查步骤,用于检查 .fsp 文件中可能存在的问题。
每个周期单元中的光栅几何结构都需要在 Lumerical 的 .fsp 文件中进行定义。在动态工作流程中,OpticStudio 会自动调用该 Lumerical .fsp 文件,应用由 OpticStudio 传入的参数,然后计算电场响应。建议 .fsp 文件名长度小于 50。
如果用户遵循以下规则,也可以自定义自己的参数化模型。
A.1 topcell
必须在 .fsp 文件中定义一个名为 “topcell” 的结构组。
Structure group 是 Lumerical 中一种对象组类型。简单来说,structure group 可以看作一个复合对象,它由多个基本结构构成,例如 Polygon 和 Rectangle。当两个结构发生重叠时,其优先级由对象的 mesh order 决定。更多信息可参见 Lumerical 知识库中的以下内容:
Structure Groups - Simulation object
链接:https://optics.ansys.com/hc/en-us/articles/360034382434-Structure-Groups-Simulation-object
Understanding mesh order for overlapping objects
链接:https://optics.ansys.com/hc/en-us/articles/360034915233-Understanding-mesh-order-for-overlapping-objects
在 Lumerical 的 structure group 中,我们可以定义 “Properties” 和 “Script”。其中,Properties 类似于对象的参数。我们可以编写脚本,使其读取这些属性值,并更新组内的基本结构。该脚本非常灵活,甚至可以在组内添加或删除结构。这使得 structure group 本身就像一个新对象一样,你可以通过 Properties 来设置它的形状和材料。
A.2 topcell 中的结构
在 topcell 组中,除了光栅结构本身之外,还必须定义两个 Rectangle 对象,用于表示正侧和负侧的材料。
这两个对象应以 (x=0, y=0) 为中心,其 x 和 y 尺寸应大于 period_x 和 period_y。如下面的示意图所示,它们应位于“仿真区域”之外的顶部(+z)和底部(-z)。
这两个 Rectangle 对象的名称可以任意指定。为了便于阅读并保持中性,在我们提供的示例中,分别使用了 “negative_z_material” 和 “positive_z_material”。
需要注意的是,这里所说的 “simulation region”,是指在 RCWA 对象设置中,由最上层和最下层所定义的区域。这是我们在 RCWA 计算中考虑结构的区域。
还需要特别注意,实际的 RCWA 对象尺寸必须略大于 simulation region。在动态链接中,RCWA 对象区域始终会比 simulation region 大 0.1 µm。因此,我们建议将 positive_z_material 和 negative_z_material 在 z 方向上的尺寸设置为 0.2 µm。
下图展示了 positive_z_material、negative_z_material 以及 RCWA 对象区域的三维视图。simulation region 应位于 positive_z_material 与 negative_z_material 之间。RCWA 对象区域则应始终略大于 simulation region。
A.3 topcell 的属性
我们必须定义如下红框所示的 4 个用户属性。这些用户属性将由动态链接进行设置。在脚本中,我们会读取这些属性的值,以修改该组中的结构。需要使用的 4 个属性如下:
•period_x、period_y:x 和 y 方向上的周期
•n_neg、n_pos:基底(n_neg)和超基底(n_pos)的折射率
还可以定义更多属性。如果将它们的名称写成 p#_* 的形式,其中 # 为数字,*** 为任意字符串,那么这些参数就会被动态链接读取,并显示在 OpticStudio 的界面中。
A.4 topcell 的脚本
我们可以像下图所示那样,在 topcell 中定义脚本。
脚本定义不是可选项,有一些必须编写的必要脚本。我们建议用户打开本文提供的示例文件,并将其中的脚本作为模板使用。
以下是必须包含的脚本内容:
A.5 RCWA 对象
这里仅说明 RCWA 对象中必须设置的内容。关于该求解器对象的更多细节,可参见这篇文章:RCWA Solver - Simulation Object – Ansys Optics。
对这个 .fsp 文件的最后一项要求是:必须定义一个 RCWA 区域。该区域可通过点击 “Simulation > Add RCWA” 来添加。
用户唯一必须仔细检查的设置是 interfaces。该设置与 z 方向上的网格数量有关。如果用户未正确设置该值,仿真结果可能会不准确。可以通过右键单击 RCWA 对象并选择 Edit object 来访问 RCWA 的相关设置。
在编辑 interfaces 之前,请先确保你已经打开了 simulation region 的网格视图。
interfaces 的设置有两种方式。用户可以直接定义其绝对位置,但这意味着光栅的最高和最低位置不能发生变化。另一种方式是使用参考位置(reference positions)。采用这种方式时,当你在 OpticStudio 界面中修改光栅参数、导致光栅形状发生变化时,界面位置也会自动更新。
用户可以尝试调整 interfaces 的取值;一般来说,interfaces 的数值越大,也就意味着网格数量越多。
A.6 可忽略的参数
以下参数会由动态链接自动控制,用户无需在 .fsp 文件中修改它们的取值。
topcell 结构中的 p#_** 参数**。
topcell 结构中的 period_x、period_y、n_neg、n_pos。其中,period_x 和 period_y 会跟随 OpticStudio 界面中的设置;n_neg 和 n_pos 则由 OpticStudio 中的 Material 设置决定。
RCWA 对象的 x、y、z 尺寸。其中,x 和 y 尺寸跟随 OpticStudio 界面中的 period_x 和 period_y 设置;z 尺寸则通过在 RCWA 对象中最上层和最下层设置的基础上额外增加 0.1 µm 的裕量来确定。
RCWA 对象中 excitation(入射光) 的全部设置。这些设置将基于 OpticStudio 中入射光线的数据自动确定。
RCWA 对象中的 k 空间离散化(k-space discretization) 设置。关于这一点,请参见下文 “Max Order” 的说明。
A.7 如何修改 x/y 方向网格
我们无法直接编辑 x/y 方向的网格,而且通常也没有必要修改 x/y 方向的网格。不过,如果用户确实希望改变网格尺寸,那么这些数值实际上是由 k 矢量域(k vector domains) 的数量自动决定的。如果用户增加 k 的数量,那么网格数量也会随之增加。
A.8 如何在光栅中支持色散(折射率随波长变化)
如下图所示,本文提供的示例 .fsp 文件,例如 lswm_2D_hex_cylinder_221210.fsp,其设计方式是让用户能够精确指定柱体的折射率,并且该折射率不随波长变化。
不过,用户也可以对这些 .fsp 文件进行修改,使折射率能够根据波长自动变化。下面给出实现这一修改的简要说明。
1.首先,需要从 topcell 对象中删除对应的属性,例如 “p4_pillar_index”。
2.然后,需要从 topcell 的脚本中删除相关代码。例如,如果我们从 topcell 中删除了属性 “p4_pillar_index”,那么也需要从 topcell 脚本中删除下面这一行:
setnamed("circle_"+lbls{j},"index",p4_pillar_index);
3.最后,需要将 topcell 组中对应的对象修改为使用正确的材料,如下所示。
A.8 如何考虑切向矢量(tangential vector)
为了使 .fsp 文件支持 lattice vector angle,需要在 topcell 对象中添加一个名为 “lattice_vector_angle” 的参数。
脚本还应正确考虑该角度变化,并相应修改光栅结构。下面仅给出一段示例代码,用于说明如何修改上方和下方的块结构。这只是一个示例。作为一种省事的方法,设计人员也可以直接将上方和下方的块尺寸做成原来的 2~3 倍,这样通常可以覆盖大多数可能的 lattice vector angle 设置。
设计人员还需要特别注意一点:当在 RCWA 设置中修改 lattice vector angle 时,RCWA 区域会以左下角锚点为基准发生倾斜。因此,RCWA 区域看起来会像是在 x 方向上发生了偏移。
为方便起见,当动态链接插件修改 RCWA 设置中的 lattice vector angle 时,它还会像下面这样为 RCWA 区域设置一个 x shift,使其在 x 方向上始终保持“居中”:
setnamed('RCWA', 'x', -tan((90-latticeVectorAngle)/180*pi) * period_y / 2);
换句话说,如果 lattice vector 是通过动态链接插件来设置的,那么 RCWA 区域将会如下图所示。
相关阅读
Lumerical案例 | OLED显示中的反射式偏振片
Lumerical案例 | INTERCONNECT和photonic Verilog-A紧凑模型的说明和应用
Ansys 2026 R1 | Ansys Lumerical功能更新
Lumerical案例 | 获得理想FDTD性能
Lumerical案例 | 使用Synopsys OptoCompiler和Lumerical工具进行光子器件版图绘制和紧凑模型仿真