高出力レーザー光学系のSTOP分析 - 第 4 部

高出力レーザーは、レーザー溶断、溶接、ドリルなど、さまざまな用途に広く使われています。光学系によるレーザー光吸収の効果は無視できません。このような光学系の性能は、高出力レーザーからの熱によって劣化します。その原因は、レンズ材料によるバルク吸収か、コーティングによる表面吸収のいずれかです。安定した焦点距離とレーザー ビームのサイズと品質を保証するには、こうした熱の効果をモデル化する必要があります。5 つの記事からなる本シリーズでは、レーザーによる加熱の効果をシミュレートします。レンズ材料の温度上昇による屈折率の変化や、機械的応力や熱弾性効果によって生じる構造的な変位の効果を検討します。 

Authored by: Julia Zhang, Hui Chen, Steven La Cava & Chris Normanshire

Downloads

Article attachments

FEA 解析の準備 

ここでは、完全な光学機械系を OpticStudio で開き、ビームがレンズやミラーを通して光学系を伝搬する間に吸収されるレーザー パワーの量を記録するための準備をします。その後、このデータを FEA ソフトウェアにインポート可能なフォーマットでエクスポートします。添付ファイル system_NSC_2022.zar を開いてください。

ディテクタ (体積) オブジェクト 

2 次元のディテクタ オブジェクト (ディテクタ (矩形)、ディテクタ ()、ディテクタ () など) と異なり、ディテクタ (体積) はボクセル (ボリューム ピクセル) に分割される 3 次元のオブジェクトであり、吸収光束、入射光束、体積当たりの吸収光束を記録します。今回の例のレンズによる吸収光束のデータを得るために、光学系内にディテクタ (体積) のレンズ部品を追加します。 

ディテクタ (体積) を使用する場合、ノンシーケンシャル モードのネスティング ルールのメリットを生かして、レンズなどのオブジェクト内部の吸収光束を計算できます。2 つのノンシーケンシャル オブジェクトが空間内で重なり合っている場合、その領域内での光線の挙動はネスティング ルールに従って決まります。ネスティング ルールによれば、光線が空間内のまったく同じ点で複数のオブジェクトに到達した場合、NSC エディタに最後にリストされたオブジェクトが、その点における面または体積のプロパティを決定します。 

ディテクタ (体積) オブジェクトの追加 

レンズの吸収光束を得るために、各部品にディテクタ (体積) オブジェクトを追加します。ネスティング ルールに従い、ディテクタ (体積) オブジェクトは、NSCE で対象となるレンズの前に挿入します。ディテクタ (体積) の中心は、その中に含まれる対象部品の中心と一致させます。ディテクタ (体積) オブジェクトの X 半幅、Y 半幅、Z 半幅パラメータには、対応するレンズ部品よりも若干大きくなるような値を設定します。X ピクセル数、Y ピクセル数、Z ピクセル数のパラメータによって、各ディテクタ (体積) オブジェクトの総ボクセル数を指定します。この段階で、FEA エンジニアと打ち合わせて、FEA 解析を適切に行うために十分な解像度を確保でき、かつ光線追跡の実行が現実的でなくなるような光線数を必要としない総ボクセル数を確認しておくことは有効です。この例では、中程度のサンプリング ボクセル数 100 x 100 x 100 を使用することにしました。 

下図に示すように、NSCE で各レンズにディテクタ (体積) オブジェクトを追加します。 

mceclip0.png

機械部品へのコーティング適用 

image098.png

次に、すべての機械部品に反射、吸収、散乱の特性を適用します。NSCE で、CAD オブジェクト 14 26 をハイライトし、[オブジェクト プロパティ] (Object Properties) [コーティング/散乱] (Coat/Scatter) を開きます。フェイス 0 に、コーティング AL_LASER [散乱割合] (Scatter Fraction) 1 としたランバーシアン散乱モデルを適用します。これらの変更は、NSCE で現在ハイライトしているすべてのオブジェクトに適用されます。 

オブジェクト プロパティの設定 

インポートしたすべての CAD 部品を選択した状態のまま、[オブジェクト プロパティ] (Object Properties) [タイプ] (Type) [オブジェクトをディテクタとする] (Object Is A Detector) オプションにチェックを入れます。これによって、これらのオブジェクトはディテクタとして設定されるので (CAD オブジェクト描画に使用される三角形のメッシュ (ファセット) がピクセルとして扱われます)、オブジェクトのフェイスで吸収される光束を記録できるようになります。 

image100.png

ディテクタとして使用する CAD 部品でピクセルとなるファセット数は、デフォルト値のままではおそらく分解能不足でデータを正確に記録できないでしょう。ファセット/ピクセルを細かくする (したがって、ピクセル数を増やす) には、[オブジェクト プロパティ] (Object Properties) [CAD] [最大エッジ長] (Maximum edge length) のパラメータをデフォルト値の 0 から変更します。 

image102.png

image104.jpg

CAD 部品の最大エッジ長の値を 0.8 mm に設定します。 

image106.png

システム エクスプローラ : ノンシーケンシャルの設定 

デフォルトの [最小相対光線強度] (Minimum Relative Ray Intensity) 設定の場合、CAD 部品のコーティングされた面から反射する光線は、反射前のパワーの 0.1% (1E-03) 未満に減少すると中断されます。今回の解析、つまりこの高出力レーザーの場合、初期パワーに対して比較的小さな割合の反射光線であっても、光学系を加熱するため、考慮する必要があります。考慮すべきエネルギーが閾値設定のせいで失われないように、[最小相対光線強度] (Minimum Relative Ray Intensity) 1.0000E-007 に設定します。 

image108.png

この時点の光学系のファイル system_NSC_2022_Final.zar は、記事の添付ファイル セクションからダウンロードできます。 

光線追跡と吸収データの取得 

下図の設定で光線追跡を実行します。光束のデータがディテクタに記録され、ZOS-API によって使用、取得できるようになります。 

image110.png

ディテクタとして設定されたすべてのオブジェクトのフェイス上の放射照度はシェーデッド モデルで視覚化できます。 

image112.png

また、ディテクタ (体積) 内部で吸収される光束はディテクタ ビューアに表示できます。 

image114.png

ZOS-API はデータのエクスポート処理を自動化できる強力なツールです。次のセクションでは、ZOS-API スクリプトを使用して、ディテクタに保存された光束データを取得し、FEA パッケージの入力要件を満たすように出力を設定する方法について解説します。ZOS-API をはじめて使用する読者は、総合的なガイダンスと機能を活用するためのヒントを示した『ZOS-API 入門 – Zemax-JP』を参照してください。 

ディテクタのデータ タイプ 

OpticStudio の各種ディテクタ タイプは、さまざまな種類のデータを保存する機能を備えています。 

ディテクタ タイプ 

データ タイプ 

放射測定の単位 

エネルギーの単位 

ディテクタ (矩形) 

放射照度 

watt/meter^2

watt/centimeter^2

watt/millimeter^2

watt/foot^2

watt/inch^2

joule/meter^2

joule/centimeter^2

joule/millimeter^2

joule/foot^2

joule/inch^2

強度 

watt/steradian

joule/steradian

放射輝度 

watt/steradian-meter^2

joule/steradian-meter^2

ディテクタ (体積) 

入射光束 

watt

Absorbed Flux/Volume

吸収光束 

watt

joule

単位体積あたりの吸収光束 

watt/meter^3

watt/centimeter^3

watt/millimeter^3

watt/foot^3

watt/inch^3

joule/meter^3

joule/centimeter^3

joule/millimeter^3

joule/foot^3

joule/inch^3

オブジェクトをディテクタとする 

単位面積あたりの入射光束 

watt/meter^2

watt/centimeter^2

watt/millimeter^2

watt/foot^2

watt/inch^2

joule/meter^2

joule/centimeter^2

joule/millimeter^2

joule/foot^2

joule/inch^2

単位面積あたりの吸収光束 

 

今回の例で必要となるデータ フォーマット 

次の表に、各ディテクタ タイプから抽出して FEA 解析に使用するデータ タイプを示します。 

ディテクタ タイプ 

ピクセルの形状 

データ タイプ 

放射測定の単位 

ZOS-API 構文 

ディテクタ (矩形) 

矩形 

放射照度 

watt/centimeter^2

bool

GetDetectorData (int ObjectNumber, int pixel, int Data(=2), out double Value)

ディテクタ (体積) 

矩形体積 

単位体積あたりの吸収光束 

watt/centimeter^3

bool

GetDetectorData (int ObjectNumber, int pixel, int Data(=2), out double Value)

オブジェクトをディテクタにする 

三角形 

単位面積あたりの吸収光束 

watt/centimeter^2

 

double 

AbsorbedIrradiance [get]

この例で使用する FEA ソフトウェアは Ansys Mechanical です。このソフトウェアは、データ ポイントにおいて吸収された光束を、熱シミュレーションで使用する外部熱源としてインポートできます。インポートするデータに必要なフォーマットは次のとおりです。 

X  Y  Z  AbsorbedData

X、Y、Z は各ピクセルの中心のグローバル座標、AbsorbedData は上記に示したデータ タイプの値です。 

[ディテクタ ビューア] (Detector Viewer) ウィンドウの吸収光束データを確認する場合、データを入手できるのは [オブジェクトをディテクタとする] (Object Is A Detector) [テキスト] (Text) タブからだけであることに注意してください。[テキスト] (Text) タブには、三角形の各ピクセルに対する光束と放射照度の値がテキストで一覧表示されます。X、Y、Z の値は、各ピクセルの中心のローカル座標です。STOP 解析の全段階で一貫して 1 つのグローバル座標系を使用することが、優れた設計作法です。データをグローバル座標でエクスポートする場合、適切な座標変換が必要になります。 

ZOS-APIを使用した吸収データのエクスポート

データの取得、フォーマット設定、エクスポートに使用する Python スクリプトを作成しました。このスクリプト ExportAbsorbedFlux.py は、記事の添付ファイルのセクションから入手できます。次のセクションでは、このコードのな個所について解説します。 

回転行列の計算 

はじめに、光学系に含まれる各オブジェクトの回転行列を決定する必要があります。[オブジェクト プロパティ] (Object Properties) [タイプ] (Type) [グローバル XYZ 回転順番を使用] (Use Global XYZ Rotation Order) のチェックを外している場合、そのオブジェクトの回転行列は、次の式で計算されます。ここで、ABC は、NSCE に表示される [X ティルト] (Tilt X)[Y ティルト] (Tilt Y)[Z ティルト] (Tilt Z) です。 

image116.png

image118.png

これに対して、[グローバル XYZ 回転順番を使用] (Use Global XYZ Rotation Order) オプションをチェックした場合、オブジェクトの回転行列は次式で決まります。 

image120.png

 

上記の計算は、関数 rotation_matrix 内に定義されています。 

image122.png

ローカル座標からグローバル座標への変換 

オブジェクトのローカル座標からグローバル座標への変換は、次式で記述されます。 

image124.png

ここで、添え字 g はグローバル座標、o はオフセット、l はローカル オブジェクト座標を示します。R11、R12、... R33 は、そのオブジェクトの回転行列 R の成分です。 

上記の計算は、関数 convert_to_global 内に定義されています。 

image126.png

ローカル座標の計算と吸収光束の値の取得 

オブジェクトをディテクタとするタイプの場合 : 

ローカル座標は、各ファセット ピクセルに対する for ループ内で、次のコードによって計算されます。 

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])/3 value = detector.AbsorbedIrradiance

position_1position_2position_3 は、三角形の各ピクセルの 3 つの頂点を表します。 

bool GetVertex (int vertexNumber, out double X, out double Y, out double Z)

GetVertex メソッドを使用して、指定した頂点の X、Y、Z 位置を取得します。次に、三角形の中心のローカル座標を計算します。 

ディテクタ (矩形) とディテクタ (体積) のローカル座標は、矩形のピクセル/矩形のボクセルのそれぞれに対する for ループ内で、次のコードによって計算されます。 

# 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)])

最後に、各ディテクタについてローカル座標を含む配列を、グローバル座標を含む配列に変換します。 

global_detectorData = convert_to_global(i+1, detectorData)

 

Python コードの使用方法 

このコードは、OpticStudio でインタラクティブ拡張機能として実行されるように設計されています。 

  1. まず、ノンシーケンシャル レンズ ファイルを開いて、[偏光を使用] (Use Polarization) オプションをチェックした状態で光線追跡を実行します。 
  2. [プログラミング] (Programming) [インタラクティブ拡張機能] (Interactive Extension) をクリックしてから、Python IDE ExportAbsorbedFlux.py のコードを実行します。 

image128.png

image130.png

  1. データは、コード内で指定されたフォルダに txt ファイルとして保存されます。コードの実行中、データ追加のステータスが出力されます。 

image132.png

image134.png

まとめ 

光学系を伝搬する間に吸収されるレーザー ビームのシミュレーションが正常に実行され、吸収光束のデータを含むファイルが生成されました。このデータと、完全な光学機械系モデルから、FEA ツールでの構造解析と熱解析に使用する入力が得られます。次の記事では、構造解析と熱解析からの出力を、STAR モジュールを使用して OpticStudio にインポートする方法を解説します。 

この記事は、高出力レーザー光学系のSTOP解析シリーズの第 4 部です。

次の記事 :高出力レーザー光学系のSTOP分析 - 第 5 部
この記事は役に立ちましたか?
0人中0人がこの記事が役に立ったと言っています

コメント

0件のコメント

記事コメントは受け付けていません。