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 中设置优化

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

  2. 双击 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 步:查看优化结果

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

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

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

图片

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

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

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

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

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

2.在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中的“运行”按钮。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/216098.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(新手必看)自定义数据传输通信协议+STM32代码详解

前言 本篇博客主要学习和了解一些单片机协议的格式,在对传输大数据或者要求准确性的时候,都需要通过协议来发送接收,下面通过了解协议的基本构成和代码来分析和实现协议的发送和接收。本篇博客大部分是自己收集和整理,如有侵权请联…

机器学习-KL散度的直观理解+代码

KL散度 直观理解:KL散度是一种衡量两个分布之间匹配程度的方法。通常在概率和统计中,我们会用更简单的近似分布来代替观察到的数据或复杂的分布,KL散度帮我们衡量在选择近似值时损失了多少信息。 在信息论或概率论中,KL散度&#…

Java+Swing: 从数据库中查询数据并显示在表格中 整理11

分析:要想从数据库中查询数据并分页展示到表格中,我觉得应该按照这个思路:首先就是发起请求,此时需要向数据库中传递三个参数:当前页码(pageNum)、每一页的数量(pageSize&#xff09…

Knowledge Graph知识图谱—8. Web Ontology Language (OWL)

8. Web Ontology Language (OWL) 在RDFs不可能实现: Property cardinalities, Functional properties, Class disjointness, we cannot produce contradictions, circumvent the Non Unique Naming Assumption, circumvent the Open World Assumption 8.1 OWL Tr…

网工排查网络故障,有这两款软件就够了

网络工程师的工作中,排查网络故障占很大一部分。领导让你查网络故障,批量Ping几十台电脑,结果你Ping了一个小时还没好。你总不能说批量Ping就是这么慢吧? 所以,在这里介绍两款网络工程师常用的排查网络故障工具。 Qu…

知名火锅连锁企业,IT 团队如何在数千家门店中先于用户发现故障

该知名火锅连锁企业是中国领先的餐饮企业,上千家门店遍布全球,由于门店餐饮行业的特殊性,需要靠前部署服务,所以在每家餐厅中,会部署相应的服务器,及相应 IT 设备,本地会运行POS、会员、下单等业…

[NCTF2019]Fake XML cookbook1

提示 xml注入 一般遇到像登录页之类的就因该想到sql注入、弱口令或者xml等 随便输入抓包 这里明显就是xml注入 这里我们来简单了解一下xml注入 这里是普通的xml注入 xml注入其实和sql注入类似&#xff0c;利用了xml的解析机制如果系统没有将‘<’‘>’进行转义&#xff0…

u盘格式化和快速格式化的区别是什么?为您揭晓答案

在日常使用中&#xff0c;我们经常遇到U盘无法正常读取或存储数据的情况。这时候&#xff0c;格式化U盘成为一种常见的解决方法。然而&#xff0c;在格式化U盘时&#xff0c;我们面临两种选择&#xff1a;普通格式化和快速格式化。这两种格式化方式有什么区别&#xff1f;我们又…

Git 硬重置之后恢复历史提交版本

****硬重置之前一定要备份分支呀&#xff0c;谨慎使用硬重置&#xff0c;特别是很多人一起使用的分支**** 如果你在reset的时候选择了Hard选项&#xff0c;也就是硬重置 重置完且push过&#xff0c;那么被你本地和远端后面的提交记录肯定就会被抹去。 解决办法&#xff1a; …

【MAC】iStatistica Pro — 硬件性能状态监控工具

1、iStatistica Pro简介 iStatistica Pro (含iStatistica Sensors mac温度监控模块) 是一款非常漂亮的菜单栏mac系统监控工具。 他的功能包含&#xff1a;Mac 系统摘要&#xff0c;Mac电池信息&#xff0c;Mac网络监控&#xff0c;Mac温度传感器监控&#xff0c;Mac磁盘管理&a…

C/C++ 两数之和为目标值时返回下标

题目&#xff1a;给定一个整数数组nums和一个整数目标值target&#xff0c;在该数组中找出和为目标值target的那两个整数&#xff0c;并返回它们的数组下标。 前提假设&#xff1a;每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不能重复出现。可以按任意…

物联网僵尸网络和 DDoS 攻击的 CERT 分析

在攻击发生当天早上&#xff0c;Dyn 证实其位于东海岸的 DNS 基础设施遭受了来自世界各地的 DDoS 攻击。这些攻击严重影响了 Dyn 的 DNS 客户的业务&#xff0c;更糟糕的是&#xff0c;客户的网站变得无法访问。这些攻击一直持续到美国东部时间下午13&#xff1a;45。Dyn在其官…

C语言学习----指针和数组

&#x1f308;这篇blog记录一下指针学习~ 主要是关于指针和数组之间的关系&#xff0c;还有指针的使用等~ &#x1f34e;指针变量是一个变量 其本身也有一个地址 也需要存放&#xff0c;就和int char等类型一样的&#xff0c;也需要有一个地址来存放它 &#x1f34c;而指针变量…

手机显示此应用专为旧版android打造,因此可能无法运行,点击应用后闪退的问题解决方案

如果您在尝试安装并运行一个Android应用&#xff08;APK文件&#xff09;时遇到错误消息“此应用专为旧版Android打造, 因此可能无法运行”&#xff0c;或者应用在启动时立即崩溃&#xff0c;以下是一些您可以尝试的解决步骤&#xff1a; 图片来源&#xff1a;手机显示此应用专…

抖音小店开设条件和区别:个人店 vs 企业店解析

抖音小店是抖音平台为商家提供的一种电商服务&#xff0c;可以帮助商家建立线上店铺&#xff0c;通过短视频和直播等形式进行商品展示和销售。在抖音小店中&#xff0c;商家可以选择开设个人店或企业店。下面不若与众将介绍抖音小店个人店和企业店的开设条件和区别。 1. 个人店…

资深测试总结,性能测试目的如何做?主要看什么指标?

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、性能测试是什么…

Jenkins 添加node节点

安装SSH插件 Jenkins- 插件管理- 可选插件- 搜索SSH Agent 配置启用SSH Server Jenkins- 系统管理 - 全局安全配置&#xff0c; 把 SSH Server 设置为启用(默认是禁用) 新增节点 第一种方式&#xff08;SSH密钥连接&#xff09;&#xff1a; 1.Jenkins主机生成SSH密钥 [rootk…

Python简单网抑云数据采集 JS逆向

嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 环境使用: Python 3.10 Pycharm 模块使用: requests -> pip install requests execjs -> pip install execjs 爬虫实现基本思路流程: 一. 数据来源分析: 明确需求: 明确采集的网站以及数据内容 网址: https://mu…

【Spark精讲】Spark任务运行流程

Spark任务执行流程 部署模式是根据Drvier和Executor的运行位置的不同划分的。client模式提交任务与Driver进程在同一个节点上&#xff0c;而cluster模式提交任务与Driver进程不在同一个节点。 Client模式 Clinet模式是在spark-submit提交任务的节点上运行Driver进程。 执行流…

《码农的噩梦与修电脑的奇幻之旅》

故事从一个充满梦想的码农学习计算机编程开始。他对编写程序充满了热情&#xff0c;认为自己就像是一位能够编织魔法的巫师&#xff0c;能够创造出炫酷的虚拟世界。 然而&#xff0c;这个充满幻想的故事在码农入门的第一天就遭遇了突如其来的挫折。电脑故障了&#xff01;所有…