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.mfbz.cn/a/250781.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

云演CTF Blog

1、啥也搞不了,扫目录。出来个console 2、有显示锁掉了 3、抓包,改返回包 改成true,放包 不好意思,不会了,哈哈哈哈哈哈哈哈哈 你会的话,请告诉我,大佬

MyBatis问题记录

org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): 原因:标注了MapperScan 在 Spring Boot 中,MapperScan 注解用于扫描 MyBatis Mapper 接口的包路径,并将其注册为 Spring Bean。在一些简单的情况下&…

基于SSM的图书馆预约座位系统的设计与实现(部署+源码+LW)

项目描述 临近学期结束,还是毕业设计,你还在做java程序网络编程,期末作业,老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。今天给大家介绍一篇基于SSM的图书馆预约座位…

【AI】YOLO学习笔记

作为经典的图像识别网络模型,学习YOLO的过程也是了解图像识别的发展过程,对于初学者来说,也可以了解所采用算法的来龙去脉,构建解决问题的思路。 1.YOLO V1 论文地址:https://arxiv.org/abs/1506.02640 YOLO&#x…

Spring框架知识总结

目录 1、Spring框架有哪些设计模式? 2、介绍一下Spring框架和SpringBoot框架? 3、介绍一下SpringBoot具有哪些功能模块? 4、Spring用到了什么组件? 5、什么是IoC? 什么是AOP? 6、SpringBoot运行原理&#xff1…

YOLOv8-Seg改进:轻量化卷积设计 | DualConv双卷积魔改v8结构

🚀🚀🚀本文改进: DualConv双卷积魔改v8结构,达到轻量化的同时并能够实现小幅涨点 🚀🚀🚀YOLOv8-seg创新专栏:http://t.csdnimg.cn/KLSdv 学姐带你学习YOLOv8,从入门到创新,轻轻松松搞定科研; 1)手把手教你如何训练YOLOv8-seg; 2)模型创新,提升分割性能…

性能提升100%、存储节约50%!猕猴桃游戏搭载OceanBase开启云端手游新篇章

近日,武汉灵动在线科技有限公司(以下简称“灵动在线”)与 OceanBase 达成合作,旗下品牌猕猴桃游戏的“游戏用户中心(微信小程序)”和“BI 分析报表业务系统“两大关键业务系统全面接入 OB Cloud 云数据库&a…

1128:图像模糊处理(C语言)

一:题目 二:思路分析 1:输入图像 2.根据题目描述1,得出图像四周的数是不变的,即i 1,in,j1,jm时,图像所表示的数值不变 3根据题目描述2可得,中间的值为四周及…

如何装好Home Assistant,四种方式安装HA OS测试

环境: 1.haos_generic-x86-64-11.1.img 2.Balena Etcher 1.18.11 3.haos_ova-11.1.qcow2 4.Ubuntu20.04 5.KVM 6.Docker version 24.0.5 7.HA OS11.2 8.联想E14笔记本 问题描述: 如何装好Home Assistant,四种方式安装HA OS测试 解决…

黑色翻页时钟HTML源码-倒计时单页翻页时钟

黑色翻页时钟HTML源码-倒计时单页翻页时钟这是一个类似fliqlo的黑色翻页时钟HTML源码,它仅包含一个HTML文件,上传到网站后即可使用。该时钟具有查看当前时间、秒表和倒计时功能,并且可以在页面的右下角进行设置。 红色动态炫酷数字时钟html网…

自动化测试如何管理测试数据

在之前的自动化测试框架相关文章中,无论是接口自动化还是UI自动化,都谈及data模块和config模块,也就是测试数据和配置文件。 随着自动化用例的不断增加,需要维护的测试数据也会越来越多,维护成本越来越高,…

(2)Linux 操作系统||基本创建与操作

本章将浅谈一下 "操作系统是什么" 的问题,随后通过讲解一些 Linux 下的基本指令,显示目录内容、跳转操作和文件的创建与删除。在讲解的同时我会穿插一些知识点,比如 Linux 隐藏文件、路径等基础知识。 了解操作系统 什么是操作系统…

【腾讯云云上实验室】用向量数据库融合AI技术:构建下一代智能客服平台

文章目录 前言为什么说用好大模型离不开向量数据库呢?AI训练中的向量维度快速检索非结构化数据的利器 --- 向量数据库AI的海马体--腾讯云向量数据库 一、腾讯云向量数据库介绍重磅组合,行业领先智能化能力产品亮点 二、AI技术在智能客服中的作用AI技术在智能客服平…

【Docker】5. Dockerfile 构建和管理容器化应用程序

▒ 目录 ▒ 🛫 导读开发环境 1️⃣ Dockerfile介绍 基本语法 指令 2️⃣ 实战:Python 的 Flask Web 代码 编译运行 发布到服务器 🛬 文章小结📖 参考资料 🛫 导读 开发环境 版本号描述文章日期2023-12-15操作系统…

在vue3的js中将一组数据赋值的问题

代码: if (res.data) { myPrizeList.value res.data console.log(myPrizeList.value,myPrizeList.value) const giftList ref() console.log(JSON.parse(JSON.stringify(myPrizeList.val…

如何预防最新的.locked、.locked1勒索病毒感染您的计算机?

尊敬的读者: 近期,网络安全领域迎来一股新潮——.locked、.locked1勒索病毒的威胁,其先进的加密技术令人生畏。本文将深入剖析.locked、.locked1勒索病毒的阴谋,提供特色数据恢复策略,并揭示锁定恶劣行径的先锋预防手…

【已解决】解决无法找到sun.misc.BASE64Encoder的jar包的解决方法

idea中可能会出现没有sun.misc.BASE64Encoder的jar包。但是64位编码却需要用到.BASE64Encoder。有以下两种方法: 错误现象: 错误原因: 1.JDK改为8(原因是/lib/tool.jar和/lib/rt.jar已经从Java SE 9中删除)&#xff…

在线客服系统定价因素解析:影响价格的关键因素

跨境电子商务公司必不可少的工具就是在线客服系统。企业选择在线客服系统的时候免不了要对不同产品的功能性、价格、服务等因素进行考量。今天这篇文章,我们就来探讨一下在线客服系统的定价因素有哪些?探究市面上的在线客服系统价格各异的影响因素。为大…

《Kotlin核心编程》笔记:反射、注解和加锁

Kotlin 和 Java 反射 1)Kotlin 的 KClass 和 Java 的 Class 可以看作同一个含义的类型,并且可以通过.java和.kotlin方法在KClass和Class之间互相转化。2)Kotlin 的 KCallable 和 Java 的 AccessiableObject 都可以理解为可调用元素。Java 中构…

深入理解JVM设计的精髓与独特之处

这是Java代码的执行过程 从软件工程的视角去深入拆解,无疑极具吸引力:首个阶段仅依赖于源高级语言的细微之处,而第二阶段则仅仅专注于目标机器语言的特质。 不可否认,在这两个编译阶段之间的衔接(具体指明中间处理步…