高出力レーザーは、レーザー溶断、溶接、ドリルなど、さまざまな用途に広く使われています。光学系によるレーザー光吸収の効果は無視できません。このような光学系の性能は、高出力レーザーからの熱によって劣化します。その原因は、レンズ材料によるバルク吸収か、コーティングによる表面吸収のいずれかです。安定した焦点距離とレーザー ビームのサイズと品質を保証するには、こうした熱の効果をモデル化する必要があります。5 つの記事からなる本シリーズでは、レーザーによる加熱の効果をシミュレートします。レンズ材料の温度上昇による屈折率の変化や、機械的応力や熱弾性効果によって生じる構造的な変位の効果を検討します。
Authored by: Julia Zhang, Hui Chen, Steven La Cava & Chris Normanshire
Downloads
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 で各レンズにディテクタ (体積) オブジェクトを追加します。
機械部品へのコーティング適用
次に、すべての機械部品に反射、吸収、散乱の特性を適用します。NSCE で、CAD オブジェクト 14 ~ 26 をハイライトし、[オブジェクト プロパティ] (Object Properties) → [コーティング/散乱] (Coat/Scatter) を開きます。フェイス 0 に、コーティング AL_LASER と [散乱割合] (Scatter Fraction) を 1 としたランバーシアン散乱モデルを適用します。これらの変更は、NSCE で現在ハイライトしているすべてのオブジェクトに適用されます。
オブジェクト プロパティの設定
インポートしたすべての CAD 部品を選択した状態のまま、[オブジェクト プロパティ] (Object Properties) → [タイプ] (Type) の [オブジェクトをディテクタとする] (Object Is A Detector) オプションにチェックを入れます。これによって、これらのオブジェクトはディテクタとして設定されるので (CAD オブジェクト描画に使用される三角形のメッシュ (ファセット) がピクセルとして扱われます)、オブジェクトのフェイスで吸収される光束を記録できるようになります。
ディテクタとして使用する CAD 部品でピクセルとなるファセット数は、デフォルト値のままではおそらく分解能不足でデータを正確に記録できないでしょう。ファセット/ピクセルを細かくする (したがって、ピクセル数を増やす) には、[オブジェクト プロパティ] (Object Properties) → [CAD] → [最大エッジ長] (Maximum edge length) のパラメータをデフォルト値の 0 から変更します。
各 CAD 部品の最大エッジ長の値を 0.8 mm に設定します。
システム エクスプローラ : ノンシーケンシャルの設定
デフォルトの [最小相対光線強度] (Minimum Relative Ray Intensity) 設定の場合、CAD 部品のコーティングされた面から反射する光線は、反射前のパワーの 0.1% (1E-03) 未満に減少すると中断されます。今回の解析、つまりこの高出力レーザーの場合、初期パワーに対して比較的小さな割合の反射光線であっても、光学系を加熱するため、考慮する必要があります。考慮すべきエネルギーが閾値設定のせいで失われないように、[最小相対光線強度] (Minimum Relative Ray Intensity) を 1.0000E-007 に設定します。
この時点の光学系のファイル system_NSC_2022_Final.zar は、記事の添付ファイル セクションからダウンロードできます。
光線追跡と吸収データの取得
下図の設定で光線追跡を実行します。光束のデータがディテクタに記録され、ZOS-API によって使用、取得できるようになります。
ディテクタとして設定されたすべてのオブジェクトのフェイス上の放射照度はシェーデッド モデルで視覚化できます。
また、ディテクタ (体積) 内部で吸収される光束はディテクタ ビューアに表示できます。
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 |
|
||||
ディテクタ (体積) |
矩形体積 |
単位体積あたりの吸収光束 |
watt/centimeter^3 |
|
||||
オブジェクトをディテクタにする |
三角形 |
単位面積あたりの吸収光束 |
watt/centimeter^2 |
|
この例で使用する 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) のチェックを外している場合、そのオブジェクトの回転行列は、次の式で計算されます。ここで、A、B、C は、NSCE に表示される [X ティルト] (Tilt X)、[Y ティルト] (Tilt Y)、[Z ティルト] (Tilt Z) です。
これに対して、[グローバル XYZ 回転順番を使用] (Use Global XYZ Rotation Order) オプションをチェックした場合、オブジェクトの回転行列は次式で決まります。
上記の計算は、関数 rotation_matrix 内に定義されています。
ローカル座標からグローバル座標への変換
オブジェクトのローカル座標からグローバル座標への変換は、次式で記述されます。
ここで、添え字 g はグローバル座標、o はオフセット、l はローカル オブジェクト座標を示します。R11、R12、... R33 は、そのオブジェクトの回転行列 R の成分です。
上記の計算は、関数 convert_to_global 内に定義されています。
ローカル座標の計算と吸収光束の値の取得
オブジェクトをディテクタとするタイプの場合 :
ローカル座標は、各ファセット ピクセルに対する 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_1、position_2、position_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 でインタラクティブ拡張機能として実行されるように設計されています。
- まず、ノンシーケンシャル レンズ ファイルを開いて、[偏光を使用] (Use Polarization) オプションをチェックした状態で光線追跡を実行します。
- [プログラミング] (Programming) → [インタラクティブ拡張機能] (Interactive Extension) をクリックしてから、Python の IDE で ExportAbsorbedFlux.py のコードを実行します。
- データは、コード内で指定されたフォルダに txt ファイルとして保存されます。コードの実行中、データ追加のステータスが出力されます。
まとめ
光学系を伝搬する間に吸収されるレーザー ビームのシミュレーションが正常に実行され、吸収光束のデータを含むファイルが生成されました。このデータと、完全な光学機械系モデルから、FEA ツールでの構造解析と熱解析に使用する入力が得られます。次の記事では、構造解析と熱解析からの出力を、STAR モジュールを使用して OpticStudio にインポートする方法を解説します。
コメント
記事コメントは受け付けていません。