この記事では、通常は評価関数のオペランドで取得する値を、ZPL マクロで OPEV() 関数と OPEW() 関数を使用して取得する方法について簡単に説明します。
著者 Sanjay Gangadhara
序論
イントロダクション
ZPL マクロは、光学系の解析を実行するための強力なツールを提供します。多くの場合、マクロで通常は評価関数のオペランドを使用して求める入力情報を必要とすることがあります。そのオペランドが、評価関数で使用していないものであることも考えられます。ここでは、このようなオペランドで得られるデータをマクロ内部で取得する方法を検討します。その手段として、OPEV() 関数と OPEW() 関数があります。
最適化オペランドのコードを OPEV() 関数または OPEW() 関数に渡すと、オペランドによって得られるデータが評価関数にオペランドを追加することなく、返されます。必要なオペランドのコードは、OCOD() 関数で得られます。
この記事では、これらの関数のそれぞれについて使用例を紹介します。
OPEV() の例
ZPL マクロ内部でスポットのセントロイド位置を求める必要があるとします。このデータを取得するために評価関数で使用するオペランドは CENX と CENY です。各オペランドへの入力は、面番号、波長番号、視野番号、[偏光を使用] (Use Polarization?) フラグ、サンプリングのグリッド サイズです。これらについてはヘルプ ファイルの次のセクションを参照してください。
「[最適化] (Optimize) タブ (シーケンシャル UI モード)」→「[自動最適化] (Automatic Optimization) グループ」→「メリット ファンクション エディタ ([自動最適化]」
OPEV() 関数を使用すること自体には直接必要ではありませんが、オペランドに指定するデータの順番を知りたい場合、次のようにメリット ファンクション エディタで各オペランドを設定し、項目を確認することによって知ることができます。
オペランドをメリット ファンクション エディタに記述せずに、そのオペランドによるデータをマクロで取得するには以下の構文を使用します。
C1 = OCOD("CENX") # Obtain the code associated with the
# CENX operand
C2 = OCOD("CENY") # Obtain the code associated with the
# CENY operand
Surf_num = 7 # Surface number at which we require
# the data
Wave_num = 2 # Wavelength number at which we require
# the data
Field_num = 1 # Field number at which we require
# the data
Pol_flag = 0 # if 0, polarization is ignored;
# if 1, polarization is accounted for
Samp_val = 5 # Sampling grid used by calculation
! Obtain centroid values using OPEV
V1 = OPEV(C1, Surf_num, Wave_num, Field_num, Pol_flag, Samp_val, 0)
V2 = OPEV(C2, Surf_num, Wave_num, Field_num, Pol_flag, Samp_val, 0)
このマクロの最初の 2 行では、オペランド CENX と CENY に関連するコードを取得しています。これに続く一連の行は、これらのオペランドに渡す必要があるパラメータの入力値を定義しています (厳密にいうと、この手順は不要で、OPEV() 関数の呼び出し時に数値を直接指定するだけで十分です。ここでは、動作を詳しく説明するために、このようなコードを作成しています)。次に、OPEV() 関数を 2 回呼び出して必要な値を取得しています。1 回は CENX (コードは C1 で指定)、もう 1 回は CENY (コードは C2 で指定) の値を取得する呼び出しです。
OPEV() では、コード値の後に必ず 6 つの数値入力を必要とします。ほとんどの最適化オペランドは 6 つの入力を必要としませんが (たとえば、CENX と CENY は 5 つのみです)、この関数の引数は 6 つ指定する必要があります。オペランドへの入力が 6 つ未満の場合は、使用しない入力の値としてゼロを指定します。(たとえば、上記のマクロでは、OPEV の 6 番目の入力にゼロを設定しています。)
OPEV() で入力を指定する順序は、メリット ファンクション エディタで各入力列が占める順序と一致していることに注意してください。たとえば、次のように評価関数オペランド DXDY の最初の列は空欄です。
したがって、上図のようなメリット ファンクション エディタへの入力を OPEV() の呼び出しで再現する場合、最初の入力値は、使用しない入力であることからゼロに設定します。
C = OCOD("DXDY")
V = OPEV(C, 0, 2, 0, 1, 0, 1)
OPEW() の例
6 つの入力ではデータが不足する評価関数オペランドも少数ながら存在します。その一例が、8 つの入力を必要とする DENC オペランドです。
この場合も、そのようなオペランドがメリット ファンクション エディタで占める順序を確認することで、入力を指定する順序を判断できます。
この例では OPEV() を使用できないので、次のように代わりに OPEW() 関数を使用します。
C = OCOD("DENC") # Obtain the code associated with the
# DENC operand
Samp_val = 3 # Pupil sampling (1 = 32x32, 2 = 64x64,
# etc.)
Wave_num = 2 # Wavelength number at which we require
# the data
Field_num = 1 # Field number at which we require
# the data
Frac_val = 0.99 # Fraction of encircled energy that we
# want distance to
Type = 1 # 1 = encircled, 2 = x, 3 = y,
# 4 = ensquared
Refp = 1 # Reference point/algorithm (see help files)
I_Samp = 0 # Huygens image sampling (for Huygens
# algorithm)
I_Delta = 0 # Huygens image delta (for Huygens
# algorithm)
! Obtain distance to desired encircled energy point
! using OPEW
V = OPEW(C, Samp_val, Wave_num, Field_num, Frac_val, Type, Refp, I_Samp, I_Delta)
ここでも、使用しない入力がオペランドに存在する場合、その入力にゼロを指定して OPEW() に渡す必要があります。
KA-01482
コメント
サインインしてコメントを残してください。