宏语言高级优化方案适用于ZEMAX单个操作数无法实现某个边界设置需要的时候,或许可以利用多个操作数组合使用可以实现,但是同一需求在同一镜头中需要多次控制,使用组合操作数时候比较繁琐,其次当不同镜头光学设计都可能使用的时候,可以采用宏语言优化方案来实现。
这时候需要利用一个操作数ZPLM将宏语言引入到评价函数中,从而可以利用评价函数来评判优化的进程,上文说的Z系数其实就是一个比较好的需求,同一个镜头设计过程中,不同镜片可能都需要设置,但是此时利用组合优化操作数方案,就非常繁琐,一个镜片就要14个优化操作数,要是有个7片镜子,就得编写操作数接近百。不同镜头设计过程也都需要进行Z系数的控制,此时用宏语言优化方案则可以相互通用。
ZPLM使用的基本思路方案:
1)在优化函数中加入ZPLM 操作数;
2)ZEMAX遇到ZPLM后,调用相应的ZPLM宏程序计算;
3)宏程序计算后将需要的数值返回到优化函数中;
4)和正常操作数一样参与优化。
ZPLM宏优化的基本语法,主要分为两部分:
第一,ZPLM的输入。在优化函数中输入优化操作数ZPLM,此时其有一个参数MAC#,其数字在0-99之间,该数字则是指导该操作数需要哪个宏程序。比如,此处输入的为1,则调用的是宏程序ZPL01.ZPL。当此处输入的是12时,则调用的宏程序为ZPL12.ZPL。注意,输入的MAC#参数是小于10时候的宏程序命名方法。
第二,ZPLM 的输出。ZPLM 利用对应的宏程序ZPLM.ZPL计算得到的结果如何输出到优化函数中,进行后续的计算。ZEMAX针对此,利用了一个缓存区间,这个区间分为了51份,分布用0-50进行命名。宏程序先将计算得到的结果放入到缓存区间中,然后优化函数在计算到ZPLM的时候,在ZPLM指定的位置取数。
这一步中主要涉及到两个我们需要注意的参数,首先是宏程序怎么将计算结果放入缓存区间内,宏程序利用关键字0PTRETURN将计算得到的结果放入相应的缓存区间内,0-50就是缓存区间内的小标签;其次就是ZPLM如何从缓存区间内取数,ZPLM第二个参数DATA,在这里我们输入宏程序中利用OPTRETURN将数据打入到缓存区间的小标签,也就是0-50中的一个数字。
语法规则:OPTRETURN 0,X
优化函数运行到 ZPLM 时,读取它的参数MAC#,知道是哪一个宏程序,从而进入运行宏程序。宏程序运行完之后,0PTRETURN将需要的计算的结果,分别放入不同小标签的缓存空间。回到优化操作数ZPLM,优化函数读取其第二个参数 DATA,通过该值,指导优化函数到指定的缓存空间提取数据,与ZPLM设置的目标 TARGET值对比,进行优化。
从上面的操作数可以看出两个问题,第一个ZPLM操作数除了MAC#,DATA之外,还有另外两个操作数,也是我们常用的HX,HY,PX,PY。第二个ZPLM操作数却没有了这四个操作数。
类型
宏#
数据
Hx
Hy
Px
Py
目标
权重
评估
%献
1
ZPLM
11
0
0
0
0
0
0
0
0
0
2
ZPLM
11
1
0
0
0
0
具体来讲解下这两个问题:
第一个,由于在利用宏语言计算的过程中,我们可能需要设置一些额外的参数,所以ZPLM也继承了传统操作数带的HX,HY,PX,PY,四个参数,但是并不是原有的四个参数的涵义,是自定义的。这些数据在宏语言中分别用 PVHX,PVHY,PVPX,PVPY函数进行提取,使得我们计算更为丰富。
语法规则:n=PVHX
第二个,这是一个约定的协议,当DATA是0的时候,除了提取0的这个小标签对应的缓存空间的数据之后,还表示需要调用宏计算。当DATA为非0时候,只是提取 DATA中数字对应的小标签的缓存空间的数据,并不调用宏程序。所以一般DATA不为0时,多放在DATA为0的后面,来提取前面宏程序计算过程中,存放了多个数据在不同小标签的缓存空间中的数据。
ZPLM使用注意事项:在了解注意事项之前,我们先简单介绍下ZEMAX计算优化函数的流程。ZEMAX在计算一个镜头的优化函数的过程为:首先,ZEMAX将镜头数据复制到一个缓存空间;其次,ZEMAX对这个缓存空间的镜头进行优化函数计算;最后,计算完成后,将缓存空间释放。可以从这个流程看出,计算优化函数的过程中,并不改变光学系统的数据。
所以要求我们在使用ZPLM调用宏程序的过程中,不要修改镜头系统的数据参数,如果实在需要进行修改,那么紧接着ZPLM后,需要再利用宏程序将修改的数据参数复原。
另外,ZPLM 操作数不能放在默认的评价函数中间,只可以放在默认评价函数的前面或者后面。
宏语言高级优化方案案例,上文采用操作数组合优化方案来控制透镜Z系数,虽然表面上可以实现,但是实际设计过程中,优化过程中透镜是双凸还是双凹,或者弯月,没办法去判断,所以Z系数公式中的十/-就无法确定,计算的Z系数就可能有问题,此时利用宏语言控制则可以进行判断。