大功率激光器广泛用于各种领域当中,例如激光切割、焊接、钻孔等应用中。由于镜头材料的体吸收或表面膜层带来的吸收效应,将导致在光学系统中由于激光能量吸收所产生的影响也显而易见,大功率激光器系统带来的激光能量加热会降低此类光学系统的性能。为了确保焦距稳定性和激光光束的尺寸和质量,有必要对这种效应进行建模。在本系列的 5 篇文章中,我们将对激光加热效应进行仿真,包括由于镜头材料温度升高而引起的折射率变化,以及由机械应力和热弹性效应造成的结构变形。(联系我们获取文章附件)
FEA 分析准备
在本文中,我们将在 OpticStudio 中打开完整的光机系统,准备记录光束穿过镜头和反射镜时被吸收的激光功率。随后,我们使用可以导入到FEA软件的格式来导出此数据。打开附件中的 ‘system_NSC_2022.zar’ 文件。
体探测器物体
与 2D 探测器物体(例如矩形探测器、表面探测器、颜色探测器等)不同,体探测器为 3D 物体形式的探测器,探测器将通过像元(体积形式的像素)记录对应的吸收通量、入射通量以及体吸收通量。为了获得镜头中对应的吸收通量数据,我们将在系统中使用体探测器物体。
当使用体探测器时,我们可以充分利用非序列模式中的嵌套规则,计算镜头等物体内部吸收的通量。如果两个非序列模式物体在空间里重叠,则重叠区域中的光线行为由嵌套规则进行确定。嵌套规则规定:如果光线在空间里的同一位置上照射到一个以上的物体,NSC 编辑器中列出的最后一个物体将用于确定该位置上用于与光线相互作用的表面属性或体属性。
添加体探测器物体
为了获得镜头吸收的通量,我们将为每个元件添加一个体探测器物体。根据嵌套规则,在 NSCE 的每个镜头前面插入一个略大于相应镜头元件的体探测器。#X Pixel、#Y Pixel 和#Z Pixel 等参数可用于指定每个体探测器物体中的像元总数量。此时,我们应该与 FEA 工程师进行沟通如何设置该像元数量,这样有助于确保无需使用过多像元数量的情况下为 FEA 分析提供足够高的分辨率设置,以避免进行过多数量的光线追迹。在本例中,我们决定使用适中的像元采样100x100x100。
根据以下 NSCE 截图,添加对应的体探测器物体。
为机械元件应用膜层
现在,我们为所有机械元件(NSCE中的14-26号CAD物体)应用反射、吸收和散射属性,可通过物体属性…膜层/散射 (Object Properties…Coat/Scatter) 部分进行设置。我们可以针对 Face 0 设置膜层 AL_LASER 用于指定反射和吸收特性,散射则可以通过使用 散射分数=1 的朗伯散射模型进行定义。这些设置通用于 NSCE 中高亮表示的所有对应物体。
物体属性设置
在所有导入的CAD元件仍处于选中状态的情况下,我们打开物体属性……类型(Object Properties…Type)并勾选物体作为探测器(‘Object is A Detector’)选项。这样就能将这些物体设置为探测器(用于渲染CAD物体的三角形网格被视为像素网格记录数据),从而能够记录物体表面上吸收的通量。
对于被用作探测器的 CAD 元件而言,被用作像素探测面的默认数值可能不足以提供准确记录数据所需的分辨率。通过修改 物体属性…CAD…最大边长(Object Properties…CAD…Maximum edge length)参数为默认值 0,我们可以缩小探测面/像素尺寸(并增加像素数量)。
在本例中,我们将每个CAD元件的最大边长值设置为0.8mm。
系统选项:非序列模式设置
根据最小相对光线强度(Minimum Relative Ray Intensity)的默认设置,从 CAD 元件的膜层表面反射的光线在其功率降低至初始功率的0.1%(1e-3)以下时被终止。在我们对这个大功率激光器的分析中,即使功率阈值降低至初始功率相对较小的部分,每条光线所携带的能量仍然会导致系统加热,必须予以考虑。为避免这个阈值所导致的能量损耗,我们将最小相对光线强度(Minimum Relative Ray Intensity)设置为1.0000E-007。
本阶段操作的实例文件 ‘system_NSC_2022_Final.zar’ 可通过点击原文链接下载。
光线追迹和取回吸收数据
在使用如下所示设置运行光线追迹后,吸收的通量数据将存储在探测器中,并且可通过ZOS-API进行使用和取回。
任何物体作为探测器(‘Object is Detector’)的表面上辐照度都可以在实体(Shaded)模型中直观地显示。
而且体探测器内部的吸收通量可以在探测器查看器中进行查看。
ZOS-API 作为一种有助于自动化运行数据导出流程的强大工具。在下一部分中,我们将演示如何使用 ZOS-API 脚本来取回探测器上存储的通量数据,并对输出进行配置,以符合您 FEA 软件的输入要求。
示例中所需的数据格式
在 OpticStudio 中,不同类型的探测器能够存储不同类型的数据。下表总结了我们从 FEA 分析所使用的每种探测器中抽取的数据类型。
下方表格中总结了可从各种探测器中获取并用于 FEA 分析的数据类型:
本例中使用的 FEA 软件是 Ansys Mechanical,它可以将吸收通量数据作为外部热源导入,以用于热模拟。导入数据所需的格式如下:
X Y Z AbsorbedData
X、 Y、Z 是每个像素中心的全局坐标,而 AbsorbedData 是上面列出的数据类型的值。
请注意,当从 “探测器查看器” 窗口检查吸收通量数据时,针对 “物体作为探测器” 选项数据尽快在 “文本” 选项卡中进行查看。“文本” 选项卡将显示每个三角形像素的 “通量” 和 “辐照度” 值的文本列表。X、Y 和 Z 值是每个像素中心的局部坐标。在 STOP 分析过程中,最好使用一个统一的全局坐标系。如果要在全局坐标中导出数据,则需要进行适当的坐标转换。
使用 ZOS-API 导出吸收数据
我们创建了自动运行这个流程,用于取回、格式排版和导出数据的Python脚本,如文章附件 ‘ExportAbsorbedFlux.py’。以下章节内容将解释该部分代码的具体意义。
计算旋转矩阵
首先,我们需要确定系统中每个物体的旋转矩阵。如果未勾选 “物体属性…类型…使用全局 XYZ 旋转顺序” 选项,则使用以下公式计算物体的旋转矩阵,其中 A、B 和 C 是 NSCE 中列出的倾斜 X、Y、Z 角度。
相反,如果勾选了 “使用全局 XYZ 旋转顺序” 选项,则物体的旋转矩阵取决于:
以上计算将在 rotation_matrix 函数中得到定义:
将局部坐标转换为全局坐标
将物体局部坐标转换为全局坐标的公式形式可以表达为如下形式:
其中,g 下标表示全局坐标,o 表示偏移,l 表示局部物体坐标。R11、R12…R33 是物体旋转矩阵 R 的分量。
以上计算将在 convert_to_global 函数中得到定义:
计算局部坐标并取回吸收通量数值
对于 “物体作为探测器” 选项而言:
局部坐标将通过以下代码的各鳞甲像素循环形式进行计算:
detector.CurrentFace = j
position_1 = detector.GetVertex(0, 0.0, 0.0, 0.0)position_2 = detector.GetVertex(1, 0.0, 0.0, 0.0)position_3 = detector.GetVertex(2, 0.0, 0.0, 0.0)
x_position = (position_1[1] + position_2[1] + position_3[1])/3y_position = (position_1[2] + position_2[2] + position_3[2])/3z_position = (position_1[3] + position_2[3] + position_3[3])/3value = detector.AbsorbedIrradiance
position_1、position_2、position_3 代表各三角形像素的三个顶点。
bool GetVertex (int vertexNumber, out double X, out double Y, out double Z)
GetVertex 方法将用于取回指定顶点的 X、Y、Z 坐标值。之后,该三角形中心的坐标值将得到计算。
对于矩形探测器和体探测器而言,局部坐标将通过以下代码中的矩形像素/矩形体积像素循环中得到计算。
# Detector Rectanglelocal_x = ((j % pixelsX) – ((pixelsX – 1) / 2)) * (widthX / pixelsX)local_y = (((j // pixelsX) % pixelsX) – ((pixelsY – 1) / 2)) * (widthY / pixelsY)local_z = 0.0
value = TheNCE.GetDetectorData(i + 1, j + 1, 2, 0.0)[1]
# Detector Volumelocal_x = ((j % voxelsX) – ((voxelsX – 1) / 2)) * (widthX / voxelsX)local_y = (((j // voxelsX) % voxelsY) – ((voxelsY – 1) / 2)) * (widthY / voxelsY)local_z = ((j // (voxelsX * voxelsY)) – ((voxelsZ – 1) / 2)) * (widthZ / voxelsZ)
value = TheNCE.GetDetectorData(i + 1, j + 1, 2, 0.0)[1]
对吸收的数据进行逐像素数据取回,其中 i 表示物体序号的循环,j 表示像素序号的循环。参考的本地坐标系位于该物体的中心,在决定如何循环并依据从像素到像素顺序获取数据时,应注意探测器的像素编号。对于每种探测器类型,可以在 OpticStudio 帮助文件条目中查看探测器的像素编号注释。
将局部坐标转换为全局坐标并获取结果
将提前创建空的数据阵列,例如 ‘detectorData’ 将用于存放局部坐标以及探测器数据,‘global_detectorData’ 将用于存放全局坐标以及探测器数据:
detectorData = []
global_detectorData = []
局部数据将作为各探测器像素循环计算的附加项:
detectorData.append([local_x, local_y, local_z, float(value)])
最终,各探测器具有局部坐标的阵列将转换为具有全局坐标的数据阵列:
detectorData.append([local_x, local_y, local_z, float(value)])
如何使用 Python 代码
该代码将结合 OpticStudio 的交互扩展形式 (Interactive Extension) 运行。
1.首先打开非序列模式镜头文件,运行光线追迹,勾选使用偏振(‘Use Polarization’)。
2.点击编程……交互式扩展(Click Programming…Interactive Extension),然后在 Python IDE 中运行 ExportAbsorbedFlux.py 代码。
3.数据将保存为代码中指定的文件夹下的 txt 文件。在运行代码的过程中将显示附加数据的状态:
结论
我们已经成功仿真了激光光束穿过光学系统时的吸收情况,并生成了吸收通量数据的文件。该数据与完整光机系统的模型相结合,可以为 FEA 工具中的结构分析和热分析提供输入。在下一篇文章中,我们将演示如何使用 STAR 模块获得结构分析和热分析的输出,并导入到 OpticStudio 中。