OpticStudio では、プログラムの機能を拡張およびカスタマイズするための、ユーザーがコンパイルしたダイナミック リンク ライブラリ (DLL) を多数使用できます。DLL を使用することで、カスタム仕様のシーケンシャル面とノンシーケンシャル オブジェクトの定義、面およびバルク散乱のモデル化、屈折率分布プロファイルの定義、回折のモデル化、ノンシーケンシャル光源と物理光学ビームの定義が可能になります。この記事では、さまざまな DLL タイプの概要、各 DLL タイプの OpticStudio による呼び出しの方法とタイミング、OpticStudio と特定のユーザー定義 DLL との間でやり取りされるデータの構造を紹介します。
著者 Zachary Derocher
序論
OpticStudio は、一般的な面構造、散乱プロファイル、ビーム定義などに使用するさまざまな設計ツールを備えていますが、カスタム定義が必要になるシミュレーションもあります。カスタムの光学特性を定義する手段の最も柔軟な選択肢がユーザー定義 DLL です。シーケンシャル モードでは、面や物理光学伝搬 (POP) ビーム プロファイルのカスタム定義、ノンシーケンシャル モードでは、オブジェクト、バルク散乱、回折、屈折率分布、光源、面散乱のカスタム定義が可能です。DLL を使用すれば、設計のカスタム部品を数学的に定義できます。
ここでは、OpticStudio で DLL を使用する方法と、OpticStudio と DLL 間で共有するデータの構造を紹介します。具体的で詳細なコメントが付けられたサンプル コードは、Zemax ディレクトリ ...\Documents\Zemax\DLL\ の下の該当するサブフォルダを参照してください。
DLL と API の違い
DLL は、ユーザーがコンパイルして OpticStudio に提供するプログラムであり、OpticStudio は必要になるとそれらを呼び出します (通常は、解析ごとに多数回。つまり光線 1 本につき 1 回など)。ユーザーは、OpticStudio によって実際に DLL が実行されるタイミングを、ほとんどあるいはまったく制御できません。DLL の場合、OpticStudio はクライアントとして機能し、DLL (サーバー) を呼び出してデータを返すように要求します。DLL に渡すデータ (および、その後 DLL から OpticStudio に戻されるデータ) の構造は固定であり、DLL のタイプごとに一意に定義されます。つまり、DLL は極めて固有な処理を実行するために OpticStudio に呼び出され、その計算に必要になる固定されたデータ セットを渡されるということです。
API も、OpticStudio の機能を拡張するカスタム プログラムの実装を可能にする機能です。しかし、API の場合、前述のクライアントとサーバーの役割が逆転します。API プログラムが実行され (UI のボタンをクリックしてユーザーがプログラムを起動)、API プログラム (クライアント) が OpticStudio (サーバー) を呼び出し、何らかの処理を実行してデータを返すように要求します。DLL プログラムは使用できるデータが固定され制限がある一方、API アプリケーションは光学系の詳細な設定や OpticStudio のツールなどを、ほぼ全面的に使用できます。そのため、API は OpticStudio との、より高度なやり取りに適しています。たとえば、OpticStudio に PSF 解析を実行して結果を返すように要求し、その結果に対して何らかの後処理を加えることができます。API は光学面などのカスタム定義には使用できないものの、新しいツール、解析、最適化オペランドなどを作成できます。
シーケンシャル DLL とノンシーケンシャル DLL
シーケンシャル モードでは、光線と光学面の相互作用のほぼあらゆる特性が、面タイプで決まります。
面構造、位相または回折のプロファイル、屈折率の変化や局所的な勾配による屈折の効果、分布屈折率、さらには、コーティング (オプション) または減衰の要因でさえ、面の定義によって直接制御できます。これらのオプションを独自に組み合わせたネイティブのシーケンシャル面が幅広く用意されています。シーケンシャルのユーザー定義面 (UDS) でも、これらの特性のすべてを制御でき、その面を通って追跡される各光線に影響を与えることができます。これは、シーケンシャル モードのユーザー定義面が、光線追跡をほぼ全面的に制御できる、極めて柔軟で強力な DLL であることを意味します。
一方、ノンシーケンシャル モードでは、光線追跡における、こうした側面の多くが切り離され、それぞれが独立したルーチンで処理されます。そのため、ノンシーケンシャル DLL の機能は、シーケンシャル DLL に比べて、はるかに専門性が高くなります。特定のオブジェクトのフェイスにおける回折効果を処理する DLL を規定できますが、オブジェクト自体はネイティブの部品を使用します (たとえば、ネイティブの回折グレーティング オブジェクトに回折 DLL を適用します)。逆もまたしかりで、ユーザー定義オブジェクト DLL (おそらく、何らかのカスタム形状) に回折性を持たせる場合、回折プロファイルにはネイティブ定義を使用します。このため、ノンシーケンシャル DLL のタイプはより多岐にわたる一方、それぞれの用途や光学モデルに与える影響の領域は、より狭められたものになります。
...\Documents\Zemax\DLL\... にあるサンプル コードを見てもわかるとおり、ほとんどのプログラム構造で、2 つの関数が必要になります。一つはユーザー オブジェクトを定義するもの(UserSourceDefinition、UserScatterDefinition など)、もう一つは OpticStudio の GUI に表示されるパラメータ名を定義するものです (UserParamNames)。
シーケンシャル DLL |
ノンシーケンシャル DLL |
ユーザー定義面 | ユーザー定義オブジェクト |
ビーム | バルク散乱 |
回折 | |
分布屈折率 | |
光源 | |
面散乱 |
つづいて、各 DLL タイプの詳細を検討し、それぞれの機能の適用範囲を明らかにします。
面 DLL (シーケンシャル ユーザー定義面)
ユーザー定義面 (UDS) は、シーケンシャル面を表すシーケンシャル DLL です。シーケンシャル モードでは、回折、屈折率分布などの面のプロパティが、いずれも面の定義自体に含まれているため、UDS DLL でも必要に応じて、これらの機能をすべて使用できます。OpticStudio は、光学系を通して光線を追跡するごとに UDS DLL を呼び出す必要があります。面との交差、面を通した屈折の仕方などを計算しなければならないからです。したがって、レンズ データ エディタ (LDE) に追加された UDS DLL は、解析ウィンドウのいずれかが更新されるたびに、または光線追跡が実行されるたびに (評価関数、ソルブ、マクロなどにより) 何度も呼び出されます。レイアウトが更新されたときにも呼び出されます (光線追跡のレイアウトだけでなく、面プロファイル自体の描画も含みます)。光線追跡やレンダリング以外でも、DLL が呼び出される場合があります。たとえば、レンズ データ エディタ (LDE) にユーザー定義面としてはじめて DLL が読み込まれると、OpticStudio は、LDE の列見出しに表示するために、パラメータの列名を要求する必要があります。OpticStudio が面 DLL を呼び出す可能性があるモードは合計 10 種類あり、要求されるデータの種類は、DLL に渡される固定データ構造のタイプの値で決まります。
タイプの値 |
ZOS が DLL に要求するデータ |
0 | 面に関する一般的な情報 (回転対称性の有無など) |
1 | パラメータ列のヘッダー名 |
2 | 追加データ列のヘッダー名 (OpticStudio では使用しません) |
3 | 面のサグ (レイアウト描画用) |
4 | 近軸光線追跡の結果 (入射光線のデータはタンジェンシャル面上で与えられ、DLL は出力近軸光線データを計算する必要があります) |
5 | 実光線追跡の結果 (入射光線のデータはタンジェンシャル面上で与えられ、DLL は実光線の交差点、経路長の増分、出力光線のデータを計算する必要があります) |
6 | GRIN DLL のみで使用する、屈折率と屈折率分布データ |
7 | セーフ パラメータ データ (LDE が読み込み時に使用するデフォルトのパラメータ値) |
8 | メモリ/データの初期化 (最初の DLL 呼び出し) |
9 | メモリの解放 (最後の DLL 呼び出し) |
面 DLL は、データ構造を定義するために専用のヘッダー ファイル (...\Documents\Zemax\DLL\Surfaces\usersurf.h) を使用する点で他の DLL とは異なります。
ユーザー定義面をコンパイルするには、このヘッダー ファイルをプロジェクトに読み込む必要があります。これまで OpticStudio と UDS 間でやり取りするデータ構造には、いくつかの実装方法が取られてきましたが、2 つの要素 Fixed_Data と User_Data は常に含まれてきました。Fixed_Data (現在は第 5 世代の実装 Fixed_Data5) 構造には、DLL が変更できないデータ (一部例外あり) が含まれ、LDE から抽出されるパラメータ値などがあります。User_Data 構造は、DLL によって計算されて OpticStudio に戻されるデータです。出力光線 (屈折や回折などを経た光線) の方向余弦、面公差点の厳密な座標などがあります (USER_DATA には、入射光線の座標と余弦が含まれ、これらの値は DLL によって出力光線のデータが上書きされることに注意してください)。OpticStudio と DLL 間でやり取りされる、すべてのデータに関する詳細な情報は、ヘッダー ファイルを参照してください。
ほとんどの OpticStudio DLL と同様に、ユーザー面 DLL はエラーなしで実行されると値 0 を、エラーが発生した場合は値 -1 を返します。他の DLL とは異なり、OpticStudio は 0/-1 以外の戻り値も評価できます。特に、実光線追跡において DLL が正の整数を返した場合、OpticStudio は、その整数が示す面番号に光線が到達しなかったエラーと解釈します。負の整数は、その面番号で屈折のエラー (TIR による) が発生したことを示します。
初歩的なサンプルとして、...\Documents\Zemax\DLL\Surfaces\us_stand.c または ...\us_itera.c をご覧ください (これらのサンプル DLL は、どちらも標準面タイプを若干異なる方法で表しています)。サンプル コードには、各 DLL の呼び出しタイプ、それぞれの場合の戻り値として期待されるデータについての詳細な説明が含まれています。上記のディレクトリには、これら以外にも数十のサンプルが保存されており、目的とするアプリケーションに応じて役に立つ叩き台または指針として使用できます。
物理光学 DLL (シーケンシャル ビーム定義)
物理光学 DLL を使用すると、シーケンシャル物理光学伝搬 (POP) 解析に使用する、カスタムの初期ビーム定義を作成できます。コードは、POP 解析の初期化時に呼び出され、初期ビームの複素振幅プロファイル (Ex と Ey の実数部と虚数部を位置 (x, y) の関数として表したもの) および初期パイロット ビームのパラメータを生成する役割を果たします。POP では、ビームを複素振幅のデータ ポイントを並べたグリッド (サンプル グリッド) として表します。DLL は、このグリッドの各点における初期値を計算します。
そのため、ビーム DLL で POP を初期化する場合、DLL は何度も呼び出されます。初期 POP データ グリッドの (x, y) 一個所あたり 1 回呼び出され、開始ビーム プロファイル全体を生成するからです。
ビーム DLL で使用するデータ構造には約 30 個のデータ項目が含まれ、DLL にデータを渡すために使用される部分と、OpticStudio に計算結果を返すために使用される部分があります。DLL は、データ 10 ~ 13 に初期データ グリッド上の各 (x, y) 位置における Ex/Ey のデータを設定する必要があります。x = y = 0 の特殊な条件では、データ 14 ~ 19 に初期パイロット ビームのデータを入力する必要があります。DLL の初期化時に、OpticStudio はまず DLL の UserParamNames 関数を呼び出し、POP 設定ウィンドウに表示するパラメータ名を判断します。ビームを発射する段階になると、OpticStudio は必要な関連データを DLL に渡します。グリッド サイズ/ポイント間隔 (DLL が各グリッド ポイントの XY 位置を認識できるように)、波長、POP 設定でユーザーが設定したパラメータ値などのデータです。ZOS と DLL 間で共有される全データ構造の詳細と、ビーム DLL の作成方法のデモは、...\Documents\Zemax\DLL\PhysicalOptics\beamsamp1.c または同ディレクトリ内の他のサンプル ファイルをご覧ください。
オブジェクト DLL (ノンシーケンシャル ユーザー定義オブジェクト)
ノンシーケンシャル モードでは、ユーザー定義オブジェクト (UDO) タイプを使用して、カスタム オブジェクトを定義できます。UDO は、3 次元の体積形状を完全に定義する必要があることから、最も複雑で手間のかかるノンシーケンシャル DLL と見なされがちです。しかし、アプリケーションとの間でやり取りされるデータ構造という意味合いでは、比較的シンプルとも言えます。オブジェクトのレンダリング (レイアウト) には、三角形のファセット近似を使用しますが、そのとき呼び出される DLL はファセット表現に使用する三角形の数、各三角形の頂点座標とプロパティを決定する役割を果たします。UDO DLL は、光線追跡においても、オブジェクトの面のいずれかと個々の光線が交差するたびに呼び出されます。この場合もファセットが使用されますが、DLL に光線の座標/方向余弦の初期推測値のみを提供し、これを元に正確な交差点が得られるまで反復計算させるというオプションもあります。
ユーザー定義オブジェクト DLL 自体は、屈折/反射/回折、あるいは射出光線の角度やエネルギーを計算する機能を提供しません。DLL の役割は、あくまで面上の光線の交差点の正確な座標と面法線を計算することです。このような DLL の目的を果たすために必要な光線データは、XYZ 座標と LMN 方向余弦だけです。特定の光線に対して、正確な交差点の座標と面法線が OpticStudio に返され、OpticStudio 側で屈折 (またはフェイスとコーティングのプロパティに基づいた反射、回折、散乱など) を計算します。
回折性の面の場合、DLL は特定の面が回折性であることを OpticStudio に伝える必要があります。それには、DLL 内部に単純なブール型のフラグを設けます。このような「モジュール式」のオブジェクト定義により、入手可能なあらゆる回折モデルを使用して複雑な回折特性を定義できます (表によって分割したり、外部回折 DLL を使用したりすることさえ可能です)。屈折率分布、面散乱、バルク散乱のモデルも同様です。ネイティブのノンシーケンシャル オブジェクトに対する場合と同じように、これらのモデルを定義できます。実際の光線追跡は OpticStudio が処理するため、ユーザーはユーザー定義オブジェクト DLL とカスタムのバルク散乱、面散乱などの DLL を組み合わせて使用できるのです。
ユーザー定義面と同様に、OpticStudio は DLL に対して幾種類かの要求をします。はじめに、DLL 内では 2 つの独立した関数を定義します。一つはオブジェクトの定義 (UserObjectDefinition)、もう一つは、単にパラメータの列名を定義するものです (UserParamNames)。後者は、ノンシーケンシャル コンポーネント エディタに表示されるパラメータ列ヘッダーを生成するだけのために呼び出される関数です。オブジェクトのデータについては、いくつかのサブルーチンを定義します。DLL に必要なデータのタイプは、data[1] として渡されるフラグの値で決まります。UDO の場合、DLL に渡されるその他のデータは、このコード値によって異なります。以下に、さまざまなケースの一覧を示します。より詳細なガイドは、サンプル コード ...\Documents\Zemax\DLL\Objects\HalfCylinder.c または、同ディレクトリに保存された他のサンプル ファイルをご覧ください。
data[1]の値 ("code") | ZOS が DLL に要求するデータ |
0 | 基本データ (ソリッド/シェル、回折性か、ファセット数) |
1 | オブジェクトの粗い記述のために三角形のファセットを生成します。 |
2 | 特定のファセットから正確な光線の公差座標が得られるまで反復計算します。 |
3 | コーティング データ |
4 | セーフ データ (NSCE の初期パラメータ値) |
下図は、半円筒のサンプル UDO のファセット表示です (併せて内部表現の初期近似も表示しています)。
この画像からわかるように、入射光線はファセット上の「交差点」では屈折せず、円筒の (湾曲した) フェイス上の正確な到達座標が得られるまで DLL が反復計算しています。しかし、近似表現はレンダリングと光線追跡を大幅に高速化します。OpticStudio が、光線がオブジェクト上のいずれかの場所に到達するかどうかをまずすばやく判断してから、より徹底した反復計算の実行に移れるからです。
バルク散乱 DLL (ノンシーケンシャル)
バルク散乱 DLL は、OpticStudio から公称 (散乱しない場合) の光路に関する情報を渡されます。DLL は、計算によって得られた平均自由光路または適当と思われる他の何らかの方法に基づいて、光線がバルク散乱を発生するかどうかを判断する必要があります。その光線が散乱すると判断した場合、光路に沿った散乱の発生位置、出力光線の方向余弦、オプションとして出力光線の電界データを計算します。
バルク散乱 DLL が使用されるのは、[光線の散乱] (Scatter Rays) オプションを有効にした光線追跡の実行中 (解析またはレイアウト) のみです。その場合、DLL は、OpticStudio が特定の体積を通過する光線セグメントを追跡するごとに 1 回呼び出されます。光線がバルク散乱する場合、出力される子セグメントは、新しいセグメントとして扱われるため、再びバルク散乱する可能性があることに注意してください ([オブジェクトのプロパティ] (Object Properties) が複数の散乱事象を許可するように設定されている (デフォルト) 場合)。DLL から出力された散乱光線は、再度 DLL に渡され、2 回目の散乱が発生するかどうかを判定され…という処理が繰り返されます。
この DLL タイプは、3 つの関数 UserBulkDefinition、UserParamNames、UserModelInformation を持つことが期待されます。バルク定義関数 (UserBulkDefinition) では、非散乱の光路その他のデータに基づいて、光線がバルク散乱するかどうか、散乱する場合は出力光線をどのように定義するかを実際に判断します。他の多くのノンシーケンシャル DLL と同様に、UserParamNames 関数は、UI のユーザー入力に表示するパラメータ名を定義します。最後の UserModelInformation は、単にデフォルトのバルク散乱モデル (平均光路と角度入力) を使用するかどうかを判定する関数です。
光線が散乱する場合、DLL は data[10] に 1、データ 35 ~ 37 の値に出力光線の余弦、データ 12 ~ 13 に相対出力エネルギーと位相の増分、データ 9 に非散乱の経路長を設定する必要があります。出力電界を返す場合は、data[10] に 2、データ 40 ~ 45 に出力電界データを設定します。光線が散乱しないと判定された場合、DLL は単に 0 を返します (data[10] の元の値である 0 を維持します)。戻り値の -1 はエラーを意味します。OpticStudio と DLL の間でやり取りされるデータ配列の詳細な説明と、使用方法のデモは、サンプル ファイル ...\Documents\Zemax\DLL\BulkScatter\bulk_samp_1.c または、同ディレクトリに保存された他のサンプルを参照してください。
回折 DLL (ノンシーケンシャル)
回折 DLL は、特定の入射光線と回折次数に対して、最低でも光線に付加された位相と光線の交差点におけるローカルな位相勾配を返す機能を果たします。出力光線のエネルギーも計算して返します。つまり、DLL は特定の回折次数の効率を計算するということです。電界に関する完全なデータを返すオプションもあります。
回折 DLL も、バルク散乱その他のノンシーケンシャル DLL と同様に、光線追跡が実行されるたびに何度も呼び出される可能性があります。光学系内の特定の面に適用され、光線セグメントがその面に到達するたびに、OpticStudio によって呼び出されます。さらに、回折 DLL は 1 回の呼び出しで 1 つの回折次数しか追跡しません。これは、1 つの入射光線に対して複数の回折次数の追跡が要求された場合、入射光線セグメントごとに複数回、回折 DLL が呼び出されることを意味します。光線が回折面で分割される場合も同様であり、回折された光線は反射と透過の両方について追跡されます。回折面から射出する光線のエネルギーは大きく減衰する可能性があります (高次の回折の場合など)。しかし、そのような場合でも DLL は光線データを返す必要があります。エネルギー閾値に基づいて光線を中断するかどうかを内部で判断するのは常に OpticStudio 側の役割だからです。
回折面に到達する光線ごとに、OpticStudio は DLL を 2 * (終了次数 - 開始次数 + 1) 回、呼び出します。
これは、各次数の透過と反射について DLL を呼び出すことを意味します。DLL は data[11] = 0 を透過、data[11] = 1 を反射に使用します。何らかの理由で DLL が OpticStudio の要求とは逆の方向の光線を返す場合、DLL は、以降の data[11] を変更する必要があります。たとえば、OpticStudio が data[11] = 0 で DLL を呼び出した場合、つまり透過のデータを要求した場合に DLL が反射のデータを返すときには、OpticStudio に渡す前に data[11] を 1 に変更する必要があります。
DLL は 0 または -1 を返す必要があります。
- 戻り値が 0 の場合は、計算にエラーがなかったことを意味します。
- 戻り値が -1 の場合は、何らかの問題が発生しています。物理的に意味を持たないユーザー入力パラメータや、異常な入射光線データなどが原因である可能性があります。OpticStudio は -1 が返されると、形状エラーを生成し、ユーザーによる [エラーを無視] (Ignore Errors) の設定に応じて、光線追跡を停止する場合があります。-1 を返すのは、重大なエラーが発生した場合に限ることを推奨します。
OpticStudio が要求した光線が、物理的にあり得なかったり、計算エラーをもたらしたりするために単に発射されないだけであるならば、DLL で data[30] (相対エネルギー) と data[31] (位相と導関数を返すことを示すフラグ) の両方をゼロに設定して、DLL 自体は -1 ではなく 0 を返すという方法もあります。これは、一つのヒントに過ぎないことに注意してください。
このような 2 つの選択肢が存在しますが、DLL の動作方法としてどちらを選ぶかはプログラマ次第です。
DLL の起動時、OpticStudio は入射光線データ (交差の位置と角度、波長、電界データ)、交差点における面法線、回折性の面の屈折率と面プロパティに関する情報を渡します。現在追跡中の次数および開始次数と終了次数も DLL に渡されます。データ 30 の値 (出力の相対エネルギー) とデータ 31 の値 (返す光線データのタイプ) を設定するのは、DLL の役割です。data[31] が 1 の場合、DLL はデータ 32 ~ 34 に、光線に付加された位相と X および Y 方向の位相勾配を設定する必要があります。data[31] が 2 の場合、完全な出力光線データであるデータ 35 ~45 も計算する必要があります。正常終了した場合は 0、エラーが発生した場合は -1 を返します。ZOS と回折 DLL 間でやり取りされる全データ項目に関する詳細な説明は、サンプル ファイル {Zemax}\DLL\Diffraction\diff_samp_1.c を参照してください。
分布屈折率 DLL (ノンシーケンシャル)
OpticStudio は、ノンシーケンシャル分布屈折率材料内での光線追跡を、連続した屈折事象として処理し、各屈折事象間の刻みの大きさはユーザーが決定することになっています。分布屈折率 DLL の役割は、媒質内の特定の XYZ 位置におけるローカルな屈折率と、ローカルな屈折率勾配を決定することです。光線が媒質内を一定距離 (UI を介して OpticStudio のユーザーが設定) だけ伝搬すると、OpticStudio は新しい光線座標で分布屈折率 DLL を再度呼び出します。媒質内の光線の屈折とそれに続く再伝搬は OpticStudio が処理します。再伝搬の光線が分布屈折率媒質内をさらにもう 1 刻み分の距離だけ進むと、OpticStudio は再度自動的に DLL を呼び出して新しい屈折率を取得します。こうしたプロセスを、光線がこの媒質を抜け出すまで繰り返します。このように、分布屈折率 (Grin) DLL は要求された座標における屈折率関数の値を返すだけの、極めて単純な機能を果たします。
Grin DLL には OpticStudio が呼び出せる 3 つの関数 UserParamNames、UserParamScale、UserGrinFunction があります。UserParamNames 関数は、既に説明したとおり、OpticStudio の UI に適切なパラメータ名を渡すだけの機能を果たします。これらのパラメータ名は、[オブジェクトのプロパティ] (Object Properties) → [屈折率] (Index) → [GRIN] (GRIN) で表示されます。次の UserParamScale 関数は、ユーザーが OpticStudio のネイティブ ツールである [レンズのスケーリング] (Scale Lens) を使用した場合に呼び出され、レンズ データがスケーリングされたときに長さの単位を持つパラメータ値が同ツールによって適切にスケーリングされることを保証できるようにします。最後の UserGrinFunction が、実際に 3 次元の分布屈折率を定義する関数です。この関数は、データ 6 ~ 9 の値として屈折率と屈折率勾配のデータを設定する必要があります。これらの関数は、いずれも正常終了の場合は 0、エラーが発生した場合は -1 を返します。
データ項目に関する詳細な説明と、使用方法のデモは、サンプル ファイル ...\Documents\Zemax\DLL\GRIN\grin1.c または、同ディレクトリに保存された他のサンプルを参照してください。
光源 DLL (ノンシーケンシャル光源オブジェクト)
光源 DLL は、その光源オブジェクトに対応する光線数パラメータがゼロ以外に設定されている場合に、光線追跡が初期化されるたびに (NSTR オペランドなどを含む描画光線または解析光線の両方の初期化時に) 呼び出されます。他のノンシーケンシャル DLL のほとんどと同様に、ノンシーケンシャル光源オブジェクトを記述する光源 DLL は一度に 1 本の光線に対してのみ呼び出されます。各光線 ([描画光線数] (# Layout Rays) または [解析光線数] (# Analysis Rays) パラメータで指定) に対して、DLL は開始位置 (XYZ) と方向 (LMN) に加え相対強度の値を返す必要があります。DLL は、UserSourceDefinition 関数呼び出しで使用されるデータ構造のデータ 1 ~ 7 にこれらの値を設定して、OpticStudio に返します。
すべての光線の相対強度を 1 に保ち、XYZ と LMN の値を確率論的に選択することで、近視野、遠視野の両方で特定の確率分布を持つ、光源の出力強度プロファイルが得られます。あるいは、各光線の相対強度の方を確率関数によってスケーリングし、初期の光線座標と方向余弦はより体系的に選択することも可能です (つまり、各初期光線の位置/方向を均一に分布させる一方、初期相対強度の値を目的とする光源強度分布に基づいてスケーリングします)。慣例により OpticStudio のネイティブ光源オブジェクトでは、非均一な強度分布をシミュレートするときに後者ではなく前者の方法を使用していますが、カスタム DLL ではいずれの方法でも構いません。
光源 DLL には UserParamNames と UserSourceDefinition の 2 つの関数があります。最初の関数は、ノンシーケンシャル コンポーネント エディタに DLL が読み込まれたときに呼び出され、パラメータ列に表示する列ヘッダー名を定義するために使用します。UserSourceDefinition 関数は、光線追跡中に呼び出され、光源の定義に基づいて光線を生成します。両関数とも、正常終了したときは 0、エラーが発生したときは -1 を返す必要があります。
OpticStudio と光源 DLL の間でやり取りされるデータ値の全リストは、サンプル ファイル ...\Documents\Zemax\DLL\Sources\Cone.cpp または、同ディレクトリに保存された他のサンプルを参照してください。
面散乱 DLL (ノンシーケンシャル)
面散乱 DLL を使用すると、カスタム散乱モデルを作成し、光学系内の任意の面 (フェイス) に適用できます。回折 DLL と同様に、面散乱 DLL は散乱モデルが定義されている面と光線セグメントが相互作用するたびに呼び出されます。
特定の入射光線の交差点、方向、電界、波長、および交差点における面法線に対して、DLL は出力のエネルギーと方向を計算する役割を果たします。OpticStudio は DLL に入射光線のデータではなく、正反射出力光線のデータを渡すことに注意してください。入射光線が透過性および反射性の両方の散乱を発生する場合 (つまり光線が分割された場合)、DLL は両出力散乱光線のそれぞれに対して個別に呼び出されます。しかし、OpticStudio は光線がどちらの経路を伝搬しているのか (出力光線が透過または反射のどちらの経路に散乱されているのか) についての情報も渡すため、それぞれの場合について固有の散乱定義を使用できます。入射側と基板側の媒質の屈折率も DLL に渡されます。完全な偏光データを返したり、ネイティブの重要度サンプリング アルゴリズムで動作させたりするオプションもあります。
DLL は正常に実行されると、データ項目 4 ~ 6、10、12、18 (オプション。重要度サンプリング)、40 ~ 45 (オプション。出力電界データ) に値が設定されます。
DLL は、正常終了した場合は 0、エラーが発生した場合は -1 を返す必要があります。
この記事では、DLL の概要を紹介するととともに、DLL と API やシーケンシャルとノンシーケンシャルの違いについて検討しました。さらに、DLL の各タイプについて詳述し、特に OpticStudio から DLL を呼び出す方法、OpticStudio と DLL 間でやり取りされるデータ構造について解説しました。さらに具体的な詳細や使用例については、詳細なコメント付きのサンプルが ...\Zemax\DLL\... サブディレクトリに多数用意されています。
KA-01846
コメント
記事コメントは受け付けていません。