この記事では、Zemax プログラミング言語 (ZPL) を使用して、ユーザー定義の性能指標を計算およびプロットするマクロを作成する方法を解説します。例として、光学系の帯状横色収差 (ZTCA) を取り上げます。適用する基本的なアルゴリズムを説明した後、汎用性が高いマクロにして、ユーザー入力機能やエラー トラップなどをより柔軟に使用できるようにする方法を紹介します。
著者 Alessandra Croce
Downloads
Introduction
光学系の帯状横色収差 (ZTCA) の計算が必要になったとします。ZTCA は、像面上で 2 つの波長の光線が到達した位置の高さの差を、瞳ゾーンの関数として表した収差です。
ZTCA = YF - YC
基本的なアルゴリズムは次のとおりです。
- 一定のステップで瞳ゾーンを変更する。
- 波長ごとに帯状マージナル光線を追跡する。
- 座標値を減算する。
- 結果を出力する。
マクロを見やすくするために、以下のようにプログラムを記述します。すべての ZPL マクロで、この記述方法を実践することをお勧めします。
- 変数はすべて小文字で記述する。
- ZPL の関数とキーワードはすべて大文字で記述する。
- IF ループと FOR ループ内部のテキストは字下げして記述する。
- 変数には、その意味がわかるような名前を割り当てる (たとえば、a ではなく、ray_angle にします)。
- 動作を説明したコメントを付与する (! または # を使用します)。
より見やすいマクロにするために、OpticStudio には、構文がハイライト表示されるテキスト エディタが用意されています。
最初のマクロ
この例では、サンプル ファイル <Documents>\Zemax\Samples\Sequential\Objectives\Doublet.zmx を使用します。このファイルを OpticStudio に読み込み、[プログラミング] (Programming) → [新規マクロ] (New Macro) をクリックします。
前述のアルゴリズムに従って ZTCA を計算するコードを以下のように入力します。
リボンにある 2 番目のボタンをクリックして、このマクロを "ZTCA1.zpl" として <Documents>\Zemax\Macros フォルダに保存します。
つづいて、[プログラミング] (Programming) タブの [マクロ リスト] (Macro List) ドロップダウン メニューまたは [編集/実行] (Edit/Run) から、上記で保存したマクロを選択して [実行] (Run) をクリックします。
このマクロを実行すると、その出力を記述したテキスト ウィンドウが新たに表示されます。この例では、瞳ゾーンの関数とした ZTCA が出力されています。
このファイルについては、このマクロが想定どおりに動作しましたが、次のように多くの前提が設定されていることに注目する必要があります。
- 両端波長を 1 と 3 とする。
- 瞳上を移動するステップを 10 とする。
- 軸上視野位置の ZTCA のみを計算する。
- エラー チェックを実行しない。
- 波長が 1 つのみである場合の挙動が不明。
他のファイルでも使用できるように、このマクロを改良することにします。
汎用化したマクロ
ステップ数のユーザー定義
キーワード INPUT を使用すれば、瞳上のステップ数を、固定値の 10 とするのではなく、プロンプトからユーザー入力できるようになります。マクロ冒頭にある代入文 "numsteps = 10" を削除し、次のように INPUT を使用します。
これにより、マクロを実行すると [ZPL マクロ入力] (ZPL Macro Input) ウィンドウが表示されます。
つづく IF 文では、numsteps が正の整数であるかどうかを、小数点以下を切り捨てる INTE() 関数で検証します。
GOTO コマンドは、LABEL コマンドで指定された行 (前後いずれでもかまいません) にジャンプすることを OpticStudio に指示します。この例では、プログラムの末尾にジャンプします。
END が厳密に必要となるのはサブルーチンを使用する場合のみですが、マクロの実行が終了する場所がわかるように、どの場合でも使用することをお勧めします。
さまざまな波長への適応
次に、両端波長 (最小値と最大値) を判断し、それらを使用して光線を追跡できるようにマクロを改良します。ファイルに定義された波長が 1 つのみの場合はエラー メッセージを返すようにします。
光線追跡に使用する波長を minwav および maxwav として、FOR ループにある次の行を書き換えます。
RAYTRACE 0, 0, 0, py, 1
RAYTRACE 0, 0, 0, py, 3
変更した行は次のようになります。
RAYTRACE 0, 0, 0, py, minwav
RAYTRACE 0, 0, 0, py, maxwav
エラー チェック
最後に RAYE() を使用して、光線追跡中にエラーが発生したかどうかを確認します。コードは次のとおりです。
マクロを ZTCA2.ZPL として保存し、動作を確認します。以下のエラー発生条件のそれぞれで、マクロが適切に機能することを検証します。
- ステップ数に 1 より小さい値、または整数以外の値を指定した場合
- 定義した波長が 1 のみの場合
- 光線追跡でエラーが発生する場合
下図は、瞳ゾーンの数を 20 とした場合のマクロの出力です。
データのプロット
データをテキストで出力する代わりに、キーワード PLOT を使用してグラフ表示できます。PLOT では 独立変数を 1 つ、従属変数を 1 つ使用でき、PLOT2D では独立変数を 2 つ、従属変数を 1 つ使用できます。どちらのキーワードでも、以下のプロット書式をすべて設定できます。
- タイトル、軸の凡例
- X、Y 軸のスケール
- コメント
- データ ポイントとフィッティング曲線の色、スタイル、サイズ
- ウィンドウのアスペクト比
データをプロットするには、まず 2 つの配列変数を宣言する必要があります。一方には瞳座標、もう一方には ZTCA を格納します。ユーザー入力とエラー チェックのコードに続いて、以下の配列の宣言を追加します。
DECLARE pupil, double, 1, (numsteps + 1)
DECLARE ztca, double, 1, (numsteps + 1)
次に、メイン ループの中で、値を画面に出力する代わりに、いま宣言した配列にそれらの値を格納します。そのためには、次の行を書き換えます。
PRINT "Pupil zone = ", py, " ZTCA = ", yf-yc
書き換えた行は次のようになります。
pupil(i+1) = py
ztca(i+1) = yf-yc
最後に、メイン ループの直後に、プロットを生成する次のコードを追加します。
PLOT NEW
PLOT BANNER, "ZTCA vs Py"
PLOT TITLE, "Zonal Transverse Chromatic Aberration"
PLOT TITLEX, "Normalized Pupil Coordinate (Py)"
PLOT TITLEY, "ZTCA (mm)"
PLOT RANGEX, 0, 1
PLOT RANGEY, -0.005, 0.005
PLOT DATA, pupil, ztca, (numsteps + 1), 1, 2, 0
PLOT GO
PLOT DATA を使用して、プロットするデータ ポイント群を定義します
- x_array, y_array, #points, color, style, options
上の例では、color = 1 = 青、style = 2 = 破線、options = 0 = データ ポイントのマーカーなしを指定しています。
PLOT の構文に関する詳細な説明は、ヘルプ ファイルで「[プログラミング] (Programming) タブ」→「ZPL について」→「キーワード (ZPL について)」→「PLOT」を参照してください。
つづいて、マクロを ZTCA3.zpl として保存し、実行してみます。下図のプロットが生成されます。
KA-01953
コメント
記事コメントは受け付けていません。