大功率激光器廣泛用于各種領(lǐng)域當(dāng)中,例如激光切割、焊接、鉆孔等應(yīng)用中。由于鏡頭材料的體吸收或表面膜層帶來的吸收效應(yīng),將導(dǎo)致在光學(xué)系統(tǒng)中由于激光能量吸收所產(chǎn)生的影響也顯而易見,大功率激光器系統(tǒng)帶來的激光能量加熱會降低此類光學(xué)系統(tǒng)的性能。為了確保焦距穩(wěn)定性和激光光束的尺寸和質(zhì)量,有必要對這種效應(yīng)進(jìn)行建模。在本系列的 5 篇文章中,我們將對激光加熱效應(yīng)進(jìn)行仿真,包括由于鏡頭材料溫度升高而引起的折射率變化,以及由機(jī)械應(yīng)力和熱彈性效應(yīng)造成的結(jié)構(gòu)變形。
在本文中,我們將在OpticStudio中打開完整的光機(jī)系統(tǒng),準(zhǔn)備記錄光束穿過鏡頭和反射鏡時被吸收的激光功率。隨后,我們使用可以導(dǎo)入到FEA軟件的格式來導(dǎo)出此數(shù)據(jù)。打開附件中的?‘system_NSC_2022.zar’ 文件。
在使用如下所示設(shè)置運(yùn)行光線追跡后,吸收的通量數(shù)據(jù)將存儲在探測器中,并且可通過ZOS-API進(jìn)行使用和取回。
任何物體作為探測器(‘Object is Detector’)的表面上輻照度都可以在實體(Shaded)模型中直觀地顯示。
而且體探測器內(nèi)部的吸收通量可以在探測器查看器中進(jìn)行查看。
ZOS-API 作為一種有助于自動化運(yùn)行數(shù)據(jù)導(dǎo)出流程的強(qiáng)大工具。在下一部分中,我們將演示如何使用ZOS-API腳本來取回探測器上存儲的通量數(shù)據(jù),并對輸出進(jìn)行配置,以符合您FEA軟件的輸入要求。如果您不熟悉ZOS-API,請參閱 ZOS-API – Zemax入門(https://www.zemax.com/blogs/free-tutorials/getting-started-with-zos-api)了解完整指南和技巧提示,以充分發(fā)揮其功能優(yōu)勢。
在OpticStudio中,不同類型的探測器能夠存儲不同類型的數(shù)據(jù)。下表總結(jié)了我們從FEA分析所使用的每種探測器中抽取的數(shù)據(jù)類型。
探測器類型 | 數(shù)據(jù)類型 | 輻射單位 | 能量單位 |
矩形探測器 | 輻射照度 | 瓦/平方米 | 焦耳/平方米 |
瓦/平方厘米 | 焦耳/平方厘米 |
瓦/平方毫米 | 焦耳/平方毫米 |
瓦/平方英尺 | 焦耳/平方英尺 |
瓦/平方英寸 | 焦耳/平方英寸 |
輻射強(qiáng)度 | 瓦/球面度 | 焦耳/球面度 |
輝度 | 瓦/球面度-平方米 | 焦耳/球面度-平方米 |
體探測器 | 入射通量 | 瓦 | 吸收通量/體積 |
吸收通量 | 瓦 | 焦耳 |
吸收通量/體積 | 瓦/立方米 | 焦耳/立方米 |
瓦/立方厘米 | 焦耳/立方厘米 |
瓦/立方毫米 | 焦耳/立方毫米 |
瓦/立方英尺 | 焦耳/立方英尺 |
瓦/立方英寸 | 焦耳/立方英寸 |
物體作為探測器 | 入射通量 | 瓦/平方米 | 焦耳/平方米 |
瓦/平方厘米 | 焦耳/平方厘米 |
瓦/平方毫米 | 焦耳/平方毫米 |
瓦/平方英尺 | 焦耳/平方英尺 |
吸收通量 | 瓦/平方英寸 | 焦耳/平方英寸 |
下方表格中總結(jié)了可從各種探測器中獲取并用于 FEA 分析的數(shù)據(jù)類型:
探測器類型 | 像素形狀 | 數(shù)據(jù)類型 | 輻射學(xué) 單位 | ZOS-API 語句 |
矩形探測器 | 矩形 | 輻照度 | 瓦/ 平方厘米 | bool | GetDetectorData (int ObjectNumber, int pixel, int Data(=2), out double Value) |
體探測器 | 矩形體積 | 吸收通量/體積 | 瓦/ 立方厘米 | bool | GetDetectorData (int ObjectNumber, int pixel, int Data(=2), out double Value) |
物體作為探測器 | 三角形 | 吸收通量 | 瓦/ 平方厘米 | double | AbsorbedIrradiance [get] |
|
本例中使用的 FEA 軟件是 Ansys Mechanical,它可以將吸收通量數(shù)據(jù)作為外部熱源導(dǎo)入,以用于熱模擬。導(dǎo)入數(shù)據(jù)所需的格式如下:
X Y Z AbsorbedData
X、 Y、Z 是每個像素中心的全局坐標(biāo),而 AbsorbedData 是上面列出的數(shù)據(jù)類型的值。
請注意,當(dāng)從 “探測器查看器” 窗口檢查吸收通量數(shù)據(jù)時,針對 “物體作為探測器” 選項數(shù)據(jù)盡快在 “文本” 選項卡中進(jìn)行查看?!拔谋尽?選項卡將顯示每個三角形像素的 “通量” 和 “輻照度” 值的文本列表。X、Y 和 Z 值是每個像素中心的局部坐標(biāo)。在 STOP 分析過程中,適合使用一個統(tǒng)一的全局坐標(biāo)系。如果要在全局坐標(biāo)中導(dǎo)出數(shù)據(jù),則需要進(jìn)行適當(dāng)?shù)淖鴺?biāo)轉(zhuǎn)換。
使用 ZOS-API 導(dǎo)出吸收數(shù)據(jù)
我們創(chuàng)建了自動運(yùn)行這個流程,用于取回、格式排版和導(dǎo)出數(shù)據(jù)的Python腳本,如文章附件 ‘ExportAbsorbedFlux.py’。以下章節(jié)內(nèi)容將解釋該部分代碼的具體意義。
計算旋轉(zhuǎn)矩陣
首先,我們需要確定系統(tǒng)中每個物體的旋轉(zhuǎn)矩陣。如果未勾選 “物體屬性…類型…使用全局 XYZ 旋轉(zhuǎn)順序” 選項,則使用以下公式計算物體的旋轉(zhuǎn)矩陣,其中 A、B 和 C 是 NSCE 中列出的傾斜 X、Y、Z 角度。
相反,如果勾選了 “使用全局 XYZ 旋轉(zhuǎn)順序” 選項,則物體的旋轉(zhuǎn)矩陣取決于:
以上計算將在 rotation_matrix 函數(shù)中得到定義:
將局部坐標(biāo)轉(zhuǎn)換為全局坐標(biāo)
將物體局部坐標(biāo)轉(zhuǎn)換為全局坐標(biāo)的公式形式可以表達(dá)為如下形式:
其中,g 下標(biāo)表示全局坐標(biāo),o 表示偏移,l 表示局部物體坐標(biāo)。R11、R12…R33 是物體旋轉(zhuǎn)矩陣 R 的分量。
以上計算將在 convert_to_global 函數(shù)中得到定義:
計算局部坐標(biāo)并取回吸收通量數(shù)值
對于 “物體作為探測器” 選項而言:
局部坐標(biāo)將通過以下代碼的各鱗甲像素循環(huán)形式進(jìn)行計算:
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])/3
y_position = (position_1[2] + position_2[2] + position_3[2])/3
z_position = (position_1[3] + position_2[3] + position_3[3])/3value = detector.AbsorbedIrradiance
position_1、position_2、position_3 代表各三角形像素的三個頂點(diǎn)。
bool GetVertex (int vertexNumber, out double X, out double Y, out double Z)
GetVertex 方法將用于取回指定頂點(diǎn)的 X、Y、Z 坐標(biāo)值。之后,該三角形中心的坐標(biāo)值將得到計算。
對于矩形探測器和體探測器而言,局部坐標(biāo)將通過以下代碼中的矩形像素/矩形體積像素循環(huán)中得到計算。
# 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]
對吸收的數(shù)據(jù)進(jìn)行逐像素數(shù)據(jù)取回,其中 i 表示物體序號的循環(huán),j 表示像素序號的循環(huán)。參考的本地坐標(biāo)系位于該物體的中心,在決定如何循環(huán)并依據(jù)從像素到像素順序獲取數(shù)據(jù)時,應(yīng)注意探測器的像素編號。對于每種探測器類型,可以在 OpticStudio 幫助文件條目中查看探測器的像素編號注釋。
將局部坐標(biāo)轉(zhuǎn)換為全局坐標(biāo)并獲取結(jié)果
將提前創(chuàng)建空的數(shù)據(jù)陣列,例如 ‘detectorData’ 將用于存放局部坐標(biāo)以及探測器數(shù)據(jù),‘global_detectorData’ 將用于存放全局坐標(biāo)以及探測器數(shù)據(jù):
detectorData = []
global_detectorData = []
局部數(shù)據(jù)將作為各探測器像素循環(huán)計算的附加項:
detectorData.append([local_x, local_y, local_z, float(value)])
***終,各探測器具有局部坐標(biāo)的陣列將轉(zhuǎn)換為具有全局坐標(biāo)的數(shù)據(jù)陣列:
detectorData.append([local_x, local_y, local_z, float(value)])
如何使用 Python 代碼
該代碼將結(jié)合 OpticStudio 的交互擴(kuò)展形式 (Interactive Extension) 運(yùn)行。
首先打開非序列模式鏡頭文件,運(yùn)行光線追跡,勾選使用偏振(‘Use Polarization’)。
點(diǎn)擊編程……交互式擴(kuò)展(Click Programming…Interactive Extension),然后在Python IDE 中運(yùn)行 ExportAbsorbedFlux.py 代碼。
數(shù)據(jù)將保存為代碼中指定的文件夾下的 txt 文件。在運(yùn)行代碼的過程中將顯示附加數(shù)據(jù)的狀態(tài):
我們已經(jīng)成功仿真了激光光束穿過光學(xué)系統(tǒng)時的吸收情況,并生成了吸收通量數(shù)據(jù)的文件。該數(shù)據(jù)與完整光機(jī)系統(tǒng)的模型相結(jié)合,可以為 FEA 工具中的結(jié)構(gòu)分析和熱分析提供輸入。在下一篇文章中,我們將演示如何使用 STAR 模塊獲得結(jié)構(gòu)分析和熱分析的輸出,并導(dǎo)入到 OpticStudio 中。