Ansys Lumerical | 采用一维光栅的出瞳扩展器的优化

附件下载

联系工作人员获取附件


本文演示了一种仿真方法,并举例说明了使用一维光栅的出瞳扩张器(EPE)系统的优化示例。

在此工作流程中,我们使用 Lumerical 构建光栅模型,并使用 RCWA 求解器模拟其响应。完整的EPE系统内置于OpticStudio中,并与Lumerical动态链接,以集成精确的光栅模型。最后,利用optiSLang对光栅模型进行整体控制,实现整个EPE系统所需的光学性能。



概述



设计具有EPE的AR系统,可以增加眼盒的尺寸,这对系统级的优化来说是一个挑战,因为它需要大量的参数。在本文中,波导由三个在Lumerical中设计的1D倾斜光栅组成。这些光栅分别用于 OpticStudio 光学系统中的内耦合器 (IC)、折叠光栅和外耦合器 (OC),通过动态链路。折叠光栅和超频光栅都被划分为几个区域,在优化过程中分别调整光栅参数。


然后,optiSLang 通过 Python 节点处理优化。optiSLang 的使用具有很大的优势,例如能够在每个优化周期内执行预处理和后处理(例如,使用瞳孔函数对结果进行卷积)。此外,可以通过在 python 代码中定义函数来控制参数,而不是直接使用不同区域中的所有单个光栅特性,从而减少变量总数,从而缩短优化时间。该过程由 Sensitivity 模块启动,以便系统在运行优化时可以识别影响最大的参数。


本文分为以下 4 个主要步骤:


第 1 步:使用 Zemax 和 Lumerical 设置光学系统

在本节中,我们将介绍要优化的光学系统。我们可以在文章中找到系统类型相同的增强现实光学系统 。请注意,在原始设计中,能量不会扩散到整个眼盒中,因为大部分光在与折叠光栅和外耦合器进行几次交互后被外耦合。

第 2 步:在 optiSLang 中设置优化

本文的目的是演示如何使用 optiSlang 来控制使用 Zemax 构建的光学系统的优化。本节介绍将用于优化的参数,以及用作优化目标的指标。

第 3 步:查看优化结果

优化已经设置,结果可用。在本节中,我们将提供有关 optiSlang 文件结构的信息,并解释如何可视化来自多个优化运行的结果。

第 4 步:使用所需设计更新系统

最后一部分是分步指南,用于从不同的运行中选择特定设计,并将相应的参数推送到光学系统。



运行和结果


第 1 步:使用 Zemax 和 Lumerical 设置光学系统

1.在Zemax OpticStudio中打开文件EPE_1D_out-coupler.zar,检查系统设置。

三个一维光栅以 Lumerical 形式构建为倾斜光栅,但折叠光栅和 OC 光栅被初始化为倾斜角为 1° 的简单二元光栅。优化将使用倾斜角度、深度和占空比作为折叠和超频光栅的每个部分中的变量。



在OpticStudio内置的波导系统中,准直光束入射到IC光栅上,通过波导传播到折叠光栅,然后将光线重定向到OC。



探测器设置为直接在超频光栅的输出端捕获光线。优化的目标是增强朝向眼睛的辐照度图输出的均匀性,同时最大限度地提高总功率。


为了准备优化,折叠和超频光栅被分成多个部分。这些部分的数量和形状可以根据用户的需要轻松定制。在本例中,波导上的光栅区域形状为圆形(耦合光栅)、矩形(耦合光栅)和多边形(折叠光栅)。


第 2 步:在 optiSLang 中设置优化

2.在 optiSLang 中打开 EPE_1D_optimization.opf 文件以检查优化设置。

3.双击 Python 图标“EPE_1D_for_OptiSlang.py”以可视化代码。

在附件中,准备了一个python文件EPE_1D_for_OptiSlang.py,用于将optiSLang链接到OpticStudio。


在本文中,我们希望控制折叠光栅和超频的光栅高度、占空比和倾斜角度。不是在每个部分中单独设置所有这些参数,而是使用定义如下的参数函数来控制给定光栅的多个区域的光栅参数:



其中 i 是区域编号,N 是光栅中的区域总数。



这些参数通过optiSlang按照预定义的优化算法(例如进化算法)进行变化。不同的参数值被设置到python代码中,并将其向下传输到OpticStudio中的每个光栅部分。在这个过程中,Python代码在OpticStudio中将这些变量转换为确切的参数。只有当我们使用optiSLang而不是OpticStudio中的内置优化器来优化系统时,才能使用Python中定义的函数进行这种预数据处理。通过这种方式,optiSLang可以基于一些在OpticStudio UI中没有直接公开的虚拟或高级变量来优化系统。

设置好参数后,代码的其余部分包括调用OpticStudio来追踪光线并从探测器收集结果。使用 optiSLang 优化系统的另一个好处是后数据处理。在这个优化过程中,我们不直接优化眼盒上的辐照度分布。取而代之的是,我们首先使用瞳孔函数对辐照度分布进行卷积,然后根据这个卷积结果设置优化目标。在此示例中,优化目标是对比度、总功率和均匀性,定义如下:



Python 代码的最后一部分是绘制眼框处的辐照度结果,以及其卷积结果,然后导出图片。这对于用户直接在optiSLang后处理中检查每个优化系统的辐照度很有用。


第 3 步:查看优化结果

4.双击“optiSLang (1)”图标以可视化优化结果。

优化开始时,首先执行灵敏度分析以确定最重要的参数。使用此输入,进化算法运行并生成一系列结果。这些结果可以直接在帕累托图中的optiSLang中可视化。

下图中红色标记的设计称为帕累托前。帕累托前沿说明了多个目标之间的权衡,其中没有一个设计在性能方面主导另一个目标。这意味着所有这些设计都显示了多个标准(例如均匀性与总功率)的不同平衡。我们收集了 2 个结果并在下面显示它们。对于每个设计点,对应一对图,分别显示眼框内的对比度和均匀性。



第 4 步:使用所需设计更新系统

5.将“敏感度”块复制/粘贴到页面中,然后双击块标题“敏感度 (1)”进行编辑。

a.在“动态采样”选项卡中,取消选中“动态采样”选项

b.在“其他”选项卡中,选中“隐藏评估设置”菜单中的“再次求解开始设计”选项

c.在“开始设计”选项卡中,选择“从系统导入起始值”选项,然后选择在帕累托图上标识的所需设计(例如#449)。

6.在OpticsStudio中,点击编程选项卡中的“交互式扩展”按钮,然后运行OptiSlang仿真。

优化已经在附件中完成,打开文件时可以可视化优化结果。有时,我们可能想选择一个优化的设计,并在OpticStudio中进行研究。但是,optiSLang 仅将输入参数保存在表格中。我们不保留OpticStudio系统。为了在optiSLang中选择特定的设计,并将参数推送到OpticStudio的光学系统中,我们可以复制灵敏度模块,并将其起点定义为所需的设计。通过禁用动态采样,运行该模块将简单地从所选设计中读取参数值,并将相应的数据推送到OpticStudio中。然后,用户可以手动将新系统保存为其他名称。在optiSLang中获取具有任何设计外观设计的OpticStudio系统的另一种选择是在python代码中添加一个命令,以便在optiSLang中运行优化时直接将系统保存为.zmx文件(例如TheSystem.SaveAs('design_optimized.zmx')。请注意,第二种方法仅在我们在 optiSLang 中运行优化之前在 Python 中进行更改时才有效。



重要模型设置

·由于系统依赖于 Python 代码,因此假定已安装 Python 以及脚本中调用的所有其他模块。

·在optiSLang中运行任何内容之前,确保“交互式扩展”在OpticStudio(编程选项卡)中处于活动状态非常重要。


使用参数更新模型

·本例中的光学系统呈现的是具有两个一维光栅的 EPE,这些光栅分为几个区域。由用户自定义光栅的形状、性质和位置。每个部分的形状和数量也可以直接在光学系统中定制。

·变量和优化目标在设置 optiSLang 时定义,并且可以自定义。

·在本文中,变量是使用函数间接定义的。在示例的 Python 代码中,它的名称为“linsp”。任何自定义函数也可以由用户使用,定义可以简单地在Python代码中更新。


进一步发展模型

·在这个演示中,我们只考虑中心场,即通常入射到波导上的准直光束。为了进行更全面的优化,可以添加更多视场以覆盖全视场的均匀性。

·同样,该系统仅针对单个波长而设计。根据系统设计,优化可以包括多个波长。

·一些辐照度分布看起来更均匀,但会导致更高的对比度。可以通过修改 Python 代码来改进标准。


准备 Python 代码

Python 代码的基本结构可以通过转到 OpticStudio > 编程> Python > 交互式扩展来启动。还有一些模块被导入到样板中,例如 numpy、scipy 和 matplotlib。



通过尝试读取变量OSL_WORKING_DIR,我们可以知道这个Python代码是由optiSLang调用的还是手动执行的。在灵敏度分析或优化过程中,optiSLang会自动改变定义的变量的值。另一方面,如果我们直接运行这段Python代码而不使用optiSLang,那么这些变量的值将是常数。

可以完成代码以将变量值链接到光学系统的参数,跟踪光线,从探测器收集数据并处理结果。例如,在此示例中,我们先使用瞳孔函数对检测器输出进行卷积,然后再计算均匀性和对比度等关键参数。


在 optiSLang 代码中设置变量和优化目标

Python代码准备好后,我们就可以开始在optiSLang中规划优化了。第一步是打开一个空文件,将“求解器”向导拖动到场景中,然后选择“Python 集成”以选择事先准备好的代码。

在求解器向导窗口中,可以通过浏览 python 代码来选择变量。突出显示变量名称,右键单击它,然后选择“用作参数”。



参数设置好后,我们应该测试 Python 代码是否可以成功运行。为此,我们打开OpticStudio并打开交互式扩展模式,如下所示。然后在求解器向导中,我们可以单击向下箭头并选择“使用输入测试运行”,如下所示。如果效果良好,您应该会在OpticStudio中看到交互式扩展对话框,指示“已连接”。



计算完成后,可以按照与设置变量相同的方式选择响应参数。在此示例中,我们右键单击 Python 代码中的变量“Uniformity”、“Contrast”和“TotalPower”,然后选择“用作响应”。然后 3 个变量将显示在右侧列中。

向导的下一页将要求用户定义每个参数的参考值和范围。参考值将遵循我们在上一步中设置参数时的设置。范围由设计师决定,没有标准答案。请注意,此范围是绝对的。在优化过程中,参数不会突破边界。这与我们通常对Zemax OpticStudio优化器的期望不同。

在向导的下一页中,我们需要根据给定的响应设置优化标准。如下图所示,我们只需将响应拖动到底部即可设置约束或目标。在这种情况下,我们设定了 3 个目标:最小化对比度、均匀性和最大化总功率。我们还可以为对比度和总功率设置 2 个额外的约束,以避免一些极端情况,即结果均匀而总功率极低,或相反的情况。



(可选)设置并行计算

这不是绝对必要的,但可以为 OptiSLang 设置并行计算以加快优化速度。如果用户拥有多个Lumerical FDTD求解器许可证,则可以考虑这样做。要进行设置,第一步是右键单击参数化系统模块,选择“编辑”,然后在窗口底部并行设置最大限制。将该数字设置为不大于 8 的任何数字,或 Lumerical FDTD 求解器许可证总数的编号。

应直接在 Python 节点上执行相同的操作,如下图所示。右键单击 Python 节点,然后选择“编辑”。要设置详细信息,我们需要首先单击右上角的汉堡包状标记,选中“属性和占位符”,然后单击“确定”按钮。然后我们可以将“MaxParallel”设置为所需的数字,如下所示(为了说明,我们将其设置为 6)。还需要在窗口底部将“最大并行”选项设置为所需的数字。如果先设置此参数,则上面的 MaxParallel 也会自动更改,但仔细检查它是否按预期设置会更安全。

最后,建议勾选“重试执行”,将“重试次数”设置为20,将“尝试之间的延迟”设置为1000毫秒。此设置避免了 OptiSLang 尝试访问具有 1 个以上线程的同一 OpticStudio 实例的竞争情况。



请注意,如果并行设置设置为大于 1 的数字,则还需要打开相同数量的 OpticStudio 实例,以便 OptiSLang 可以为每个实例创建一个线程。


灵敏度和优化设置

可以通过将向导拖动到参数化系统模块来设置灵敏度系统。参数和条件将被复制,我们不需要再次设置它们。默认情况下,它将建议 AMOP 模型,我们可以保留此设置。AMOP 是一种迭代抽样方法,它将设计采样到设计空间中,直到达到目标标准(设计的最大值或模型质量)。

同样,可以通过将优化向导的实例拖动到 AMOP 模块来设置优化。请注意,当它询问优化方法时,我们应该选择 Real Run,因为这个系统永远不会有高质量的最佳预后元模型 (MOP)。MOP 是在 (Most and Will 2008) 中提出的,它基于对最佳输入变量集和最合适的近似模型(多项式或具有线性或二次基础的 MLS)的搜索。对于优化算法,建议使用进化算法,该算法适用于非常不均匀和不连续的解空间。

一切设置完成后,转到OpticStudio以激活编程选项卡中的“交互式扩展”,然后单击OptiSlang中的“运行”按钮。