EN

光阴极与注入器的程序,等等

200 pC 的束团在注入器出口能否做到 0.1 mm·mrad 的发射度,从阴极表面到注入器整体的探索,以及为此写的四个程序。

博士论文的每一章都卡在同一个地方:手里有一个物理问题,要回答它,先要写出能提这个问题的程序。而所有问题的背后只有一个问题。200 pC 电荷量下 0.2 mm·mrad 的切片发射度(发射度描述了束团在位置和角度上散开的程度)是当时注入器出口处测到的最好结果,它是不是极限,一把光阴极微波电子枪有没有可能做到 0.1?在清华跟着唐传祥老师的六年就围绕这个问题展开,写出了四个程序,2016 年 12 月答辩。两年后我在 SLAC 做求职报告,题目就叫「How Many Codes Does It Take to Get an Accelerator Physics PhD」(拿一个加速器物理博士要写几个程序)。

真实铜阴极的粗糙度热发射度

Dowell 用光电效应的三步模型给出了光滑金属阴极的量子效率 QE 与热发射度公式。QE 公式与铜阴极的实验结果符合得相当好,发射度公式却与各实验室的测量值有相当大的偏差,测量值比公式预测大 2 倍左右。一般猜测这是光滑表面的假设失效造成的,也即热发射度中还包含了表面粗糙度的贡献。要在真实的粗糙表面上模拟光电发射,有两个困难。铜的 QE 只有 10−4 量级,若往表面打光子再看有没有电子出来,几乎所有的样本都会被丢掉;而随机表面上方的电场,一般要在贴合每处起伏的网格上用求解器求解。

于是我从成像里借来点扩散函数(Point Spread Function,PSF)的概念,围绕它写了 PyPES。激光入射一块 YAG 屏时,屏上的图像是激光功率密度分布与屏的点扩散函数的卷积;光阴极对激光的响应与此类似,只是响应从屏上的亮度分布换成了出射电子的相空间分布。算下来光阴极点扩散函数的 rms 半径在亚纳米量级,幅度在 rms 半径以外迅速衰减到零,因此可以认为激光功率密度在表面任意一点的有效区域内是常数。点 𝐏 处的光电子相空间分布于是可以拆开,D|𝐏≈I(x0,y0)fp,即激光在入射点 (x0,y0) 的功率密度乘上一个动量分布,需要抽样的只剩动量这一半。

fp(px,py,pz)=Cppzpz2+pm2⋅px2+py2+pz2+pm2

fp 是把位置积分掉之后的点扩散函数,也即动量点扩散函数。Cp 是归一化系数,由反射率,光子和电子的平均自由程以及光子能量决定。pz 是离开表面方向的动量,pm 是电子逃出金属表面所需的最小动量(保证电子向前运动并限制总动量的两个阶跃函数在式中省略了)。

抽样时先按激光的横向分布生成一个位置,再按这一点的动量点扩散函数生成一个随机动量,动量按该处表面法向的倾角转到全局坐标系,大约六次尝试能留下一次。表面上方的电场用电势的一阶傅里叶展开近似,一层一层地往上算;然后用龙格库塔法以纵向位置为变量对运动方程积分,把每个电子推到横向场衰减殆尽的高度。

在 x = 57.47 µm 处切开阴极,约 130 µm 长、60 nm 高:表面上方的电势用颜色画,实测的表面轮廓是黑线,电势的零等值线是贴着它走的白线。
表面的一个截面,近似电势的零势能面(白线)落在实测的表面轮廓(黑线)上。

同一个点扩散函数还能把统计意义下的发射度恰好分成两项:第一项就是 Dowell 的发射度公式,第二项就是它的误差。这个误差算出来是一个长度,0.40 nm,而激光光斑的 rms 尺寸典型值在 100 µm 量级,所以绝大多数情形下 Dowell 公式足够精确。

接下来才是粗糙度本身。表面不平时会发生两件事:表面上每一小块都朝着自己法向的方向发射(表面离散效应),起伏上方的电场又多出一个横向分量,在电子离开表面的整个过程中一直作用在它上面(横向电场效应)。我把两种效应写进同一个式子,对象是随机缓变粗糙表面,先做二维,再做三维。两项落在同一个平方里,因为它们同时作用在同一个电子上,若拆成两项相加就丢掉了交叉项;对二维正弦表面的计算表明,忽略这个耦合造成的相对误差可达 10%。

εx2=εD,x2[1−⟨(∂xR)2⟩+⟨(pz′∂xR+jmπA2∫dkxdkykxkR(kx,ky)ej(kxx+kyy))2⟩⟨px′2⟩]

εx 是带粗糙度的发射度,εD,x 是光滑阴极上的值。⟨(∂xR)2⟩ 是表面 R 沿 x 方向坡度的均方。带撇的动量是表面上一小块在自己的坐标系里发出的动量。j 是虚数单位,A=eE/m 中的 E 是外加场强。带积分的一项是电子脱离表面场时已经获得的横向动量,由同一表面的傅里叶系数 R(kx,ky) 算出,k 是 (kx,ky) 的模。

我用一块真实的铜阴极做了模拟,表面形貌是 W. Li 帮我用白光干涉仪测的。模拟给出的发射度增长因子是 1.044,比文献中报道的 1.5 到 2 小得多(IPAC'15)。解析公式在同一个束团上给出 1.043,两者相当接近,但大小关系正相反。理论上模拟值应当略小于解析值,再随纵向位置的增大逐渐趋于解析值,图中却是模拟值略大,4.826 对 4.822 µm·keV/c。这可能是模拟步长选得过大造成的:龙格库塔法每一步用的都是电子上一个位置处的场,而横向场随高度衰减,因此每一步的横向动量改变都被高估了。这部分工作我和唐老师写进了 PRAB(2015 年,当时刊名还是 Phys. Rev. ST Accel. Beams)。

一块机加工铜阴极的高度图,约 170 × 130 µm,竖条纹深几十纳米,模拟用的激光光斑画成一团圆点叠在上面。
实测的铜阴极表面,模拟用的激光光斑叠在上面。
上:阴极表面处和表面上方 5000 nm 处的横向相空间,后者被表面场扭出了波纹。下:发射度随离表面高度的变化,50 MV/m 下从约 4.62 升到 4.83 µm·keV/c,两端标着解析值。
表面处与上方 5 µm 处的相空间,以及发射度沿高度的演变,三角为解析值。

解析公式算得很快,所以我用它扫了阴极表面场强:对这块表面,即使场强高达 120 MV/m,发射度增长因子也小于 1.1。对于一块经过机器精细打磨的阴极(表面 rms 起伏不超过 30 nm,表面 rms 坡度不大于 3 mrad),在 S 波段电子枪常用的 50 MV/m 下,粗糙度造成的发射度增长可以忽略不计。因此测量值多出来的那一倍还得另找原因。阴极加工时要尽量避免手工打磨,手工打磨留下的粗糙度一般在百 nm 量级。

发射度增长因子随阴极表面场强从 0 到 200 MV/m 的变化。实测的三维铜表面从 1.0 缓慢升到约 1.12;粗糙度参数与它匹配的二维正弦面刚好在它上方;打磨阴极典型微观粗糙度(周期 200 nm、振幅 4 nm)的正弦面再高一点;典型宏观粗糙度(周期 16 µm、振幅 100 nm)的一条升到约 1.78。
发射度增长因子随阴极表面场强的变化,实测的三维表面,粗糙度参数与它匹配的二维正弦面,以及按打磨阴极典型微观和宏观粗糙度取的两条正弦面。

UCLA 的银纳米表面阴极

粗糙度是要设法避免的,那么反过来,在阴极表面有意加工出结构会怎样?2014 年我在 UCLA 的 Pegasus 组(Pietro Musumeci)做了九个月的合作研究,研究的就是这个问题。在金属阴极表面加工出纳米尺度的周期结构,使入射激光激励起表面等离激元,阴极对激光的吸收就比平整金属高得多。具体做法是在银晶片上加工一片纳米小孔阵列,尺寸调到与 800 nm 激光谐振。

一万倍的 SEM 图像:银上一片规则的方形小孔阵列,表面有细划痕;比例尺 5 µm。
SEM(扫描电子显微镜)下的小孔阵列,放大一万倍。

检验加工出的结构是否与 800 nm 谐振,要做离线反射率谱测量:让某一波长的光打在样品上,拍一张图像,转动光栅换下一个波长再拍一张。图像里纳米结构那一小块比周围光滑的银面暗,纳米结构的亮度除以背景亮度就是这个波长下的相对反射率。事后逐张处理图像很慢,我想在扫描的过程中就看到曲线,于是用 PyQt 写了 NPC Analyzer(NPC 即纳米表面阴极,Nano-Patterned Cathode)。它用 scikit-image 的边缘检测找到纳米结构的位置,在结构内部和周围放取样框,每个框放大或缩小到框内亮度足够均匀为止,反射率随波长的表格就在扫描中一行一行地记录下来。

NPC Analyzer 的窗口:一帧相机图像,暗色的纳米结构区域被描出轮廓,里面一个绿色取样框,周围几个蓝色取样框;右侧是文件选择,边缘和线条滑块,波长与反射率表格,以及导出和预览按钮。
NPC Analyzer 处理一帧真实图像,纳米结构的边缘已描出,取样框在结构内(绿)和周围(蓝)。
相对反射率随波长(730 到 850 nm)的变化:短波端 0.6 上下,约 801 nm 处降到 0.45,长波端升过 0.8,数据点周围是分析误差的阴影带。
银晶片的反射率谱,阴影为分析误差。

谐振峰落在 801 nm 附近,与设计的 800 nm 一致,但谐振峰对应的最小反射率只有 45%,与模拟优化给出的 0.63% 相差很大。组里按 SEM 实测的几何尺寸重新做了 Lumerical 模拟,谐振峰峰位基本一致,最小反射率也较为接近。剩下的差异主要来自聚焦离子蚀刻法(Focused Ion Beam,FIB)加工时每个小孔尺寸和间距的不一致,以及反射率谱仪的宽谱特性。

高功率测试之后,晶片放回反射率谱仪复测,800 nm 处的谐振峰消失了,近乎全波段的反射率都有所下降,说明纳米结构在高功率测试中已经损坏,表面粗糙到反射更接近漫反射。损坏最可能发生在测量多光子光电发射曲线的那一轮实验中,那是晶片经受过的最高激光功率密度,而银纳米结构的损伤阈值当时没有测过。

银阴极在 730 到 850 nm 的两条反射率曲线。高功率测试前,曲线在 800 nm 附近降到约 0.45,长波端升过 0.8;测试后谐振峰消失,整个波段都在约 0.62 以下。
同一片晶片在高功率测试前后的反射率谱。

孔阵的尺寸是我在模拟里按 800 nm 谐振定的。晶片是组里加工的,反射率谱仪和高功率测试用的 cathode-plug 也是组里做的,这些都写进了我是第一作者的 NIM A 文章。电子产额扫描图上,纳米结构所在的中心区域只比周围的银高 10 倍左右,但实验所用的激光横向尺寸在 1.3 mm 附近,纳米结构只有 0.2 mm,扫描图上平均掉的大部分是光滑的银面。把这个卷积反过来扣掉,纳米结构本身的产额增益还要再乘 40,也即约 400。扫描图上还有一个环状的高增益区域,位置与银晶片的边界吻合,这是 cathode-plug 设计造成的。晶片表面比铜阴极盘低 1.5 mm,晶片边缘的场强因此显著提高,晶片面上的场强则降到正常情况的三分之二左右。于是发射相位发生偏移,对空间电荷力的抑制也不如齐平的阴极。

银纳米阴极在红外激光下的电子产额高得多,热发射度却接近光滑铜阴极的两倍,因此它更适合需要大电荷量的应用,在 FEL 这类对发射度要求严格的场合会受到限制。文章里紧接着这个结论,我们加了一句提醒:表面形貌对发射度的影响很强,结构损坏可能就是发射度偏大的原因之一;晶片凹进阴极盘是另一个应当避免的因素,下次测量不应再这样装。

扁平束与笔形束的极限热发射度

接下来是一个可以靠解析回答的问题。注入器中常用的束团发射模式有两种,短而粗的扁平束发射(pancake regime)和长而细的笔形束发射(cigar regime)。给定阴极表面场强,两种发射模式的热发射度各有一个下限,取到下限的条件都是空间电荷限发射,也即已经发射的电荷把表面场屏蔽到下一个电子无法离开为止。两个下限我都推了出来。提高场强能压低下限,前提是光子能量高于逸出功:266 nm 激光打铜阴极,两者之差为 0.35 eV,满足这个条件。

推导之前有一处修正。肖特基效应造成的逸出功降低是按单电子发射模型推导的,而束团中某个切片发射时,阴极表面已经有一定的发射电荷。发射时刻越靠后的切片,感受到的表面场减小越多,因此每个切片有自己的有效逸出功,也有自己的发射度。若忽略切片之间的这个差别,算出的束团发射度始终偏小,在空间电荷限发射时相对偏差约 20%;对 50 MV/m 下的铜阴极,空间电荷限对应的电荷量约为 222 pC。

50 MV/m 下铜阴极的归一化热发射度随发射电荷量的变化。精确解和近似解从 0.636 缓慢下降,在约 222 pC 的空间电荷限处与代入九分之四场强的未修正公式相遇;不考虑切片差异的一条在两者下方,还在继续下降。
50 MV/m 下束团热发射度随发射电荷量的变化,精确解与近似解在空间电荷限处收敛到代入九分之四场强的未修正公式,不考虑切片差异的一条始终偏低。

扁平束的下限直接由空间电荷限的条件得到,电荷量和场强一经指定,式中就不含可变参数。50 MV/m 和 200 pC 下算出来是 0.11 mm·mrad,对应的激光半径为 379 µm。

εmin⁡=123mc2ε0π⋅Q⋅ℏω−ϕwE0+13eeπε0⋅1E0

Q 是束团电荷量,E0 是阴极表面场强,ϕw 是金属的逸出功;肖特基效应造成的降低单独写成了根号下的第二项,取的是 E0 的九分之四,也即对切片平均后在空间电荷限处剩下的场强;ε0 是真空介电常数,不是发射度。

笔形束的情形更有意思。束团一长,只有距离阴极约一个激光半径以内的切片才对阴极表面的空间电荷场有贡献,下限就不再由总电荷量决定,改由阴极饱和电流决定,因此相同电荷量下束长越长,下限越低。饱和电流和一个激光半径的有效作用长度是 Filippetto 等人的结果,逐个切片分析的图像是我在此基础上加的。200 pC 和 10 ps 下算出来是 0.09 mm·mrad,对应的激光半径为 390 µm。

εmin⁡=(916πε0me)2/3⋅ℏω−ϕw3mc2⋅(Qτ)2/31E0

τ 是阴极上的激光束长,所以下限由发射电流 Q/τ 决定;这里的逸出功 ϕw 不带肖特基降低,因为在空间电荷限处已经发射的电荷把表面场抵消干净了。

然而阴极上的束长不能无限制地拉长,过长的束团会占有相当的微波相位,高阶 RF 效应会使发射度在后续传输中不可逆地增长。这一节全是解析计算,没有一处测量。

空间分离双频电子枪

笔形束本身的峰值流强太低,不能直接使用。FEL 的注入器一般要求出口处流强 20 到 50 A,因此必须用聚束腔(buncher)把束团压缩,而用普通的正弦场压缩长束团,纵向分布会变得高度不对称。文献里的办法是把基模和三次谐波叠加在同一个腔里,在某段相位区间叠加出一段线性的场,让束团处在这段场上(这是 PSI 的 Raguin 和 Dowell 各自提出的空间叠加型电子枪)。原理已由束流动力学模拟验证过,真正做出来却很难:一把空间叠加型电子枪需要两个耦合器和一个过滤器,还要在同一个腔中同时调谐和调平两个模式。

我们走了另一条路,把两个模式在空间上分开,一个模式一个腔,再把两个腔紧凑地组合起来,靠近到场渗透率允许的程度为止。具体是一把 BNL 型 1.6 cell S 波段电子枪紧跟一个 X 波段腔(四次谐波,不是三次),目标是 200 pC 电荷量下注入器出口 30 A 的峰值流强(IPAC'16)。合作者有唐老师,LBL 的 Houjun Qian,还有一位 Zhen Zhang,名字与我只差一个字母,不是我。布局试了两种:合并型把 X 波段腔紧贴电子枪,螺线管线圈放在两者之后;分离型把螺线管线圈放在中间,后面再接一个 C 波段聚束腔。这些全部只在 Superfish 和 Astra 里做过,没有造过任何一个腔。

动力学模拟之前要先把两个腔调好。可动的输入变量有三个,S 波段半腔半径,S 波段整腔半径和 X 波段腔半径;目标变量也是三个,两个模式的频率和 S 波段模式的场平。两边都取三个,是为了让雅可比矩阵是方阵,才有可逆的可能。Superfish 给出系统的响应,雅可比矩阵由有限差分给出。

𝐱∗=𝐱+η𝐌−1𝚫,η=12

𝐌 是雅可比矩阵,𝚫 是当前响应与目标的差距;系数取 1/2 是试出来的,每一步做四次 Superfish 计算,从较好的初始值出发三次左右的迭代就收敛,一个腔型只要十来次计算。

调腔必须能自动地反复运行,因为 X 波段模式渗透进 S 波段腔的场强取决于 X 波段腔的位置,而后续的动力学模拟可能对这个位置有反馈,腔型优化就要对不同的位置重做。迭代的终止条件是加工精度而非目标精度:腔体尺寸在 10 µm 以下的变化没有意义,因此当新一轮算出的尺寸四舍五入后与上一轮相同时迭代就停止,此时目标变量未必达到设定的精度。优化得到的枪频率达到了设计值,S 波段两个 cell 的场平到 0.04% 以内,X 波段模式渗透进枪里的场强只有 3.02×10−4,目标是低于千分之一。

之后的每个问题都是一轮 Astra 扫描。PyGAS 里驱动 Astra 的那个类,文档字符串至今写着「A tool that eases the painful scans in ASTRA simulations」(一个让 Astra 扫描不那么痛苦的工具)。NSGA-II 和 SPEA2 两种遗传算法(Genetic Algorithm,GA)的算子来自 DEAP 库。我写的是把每个个体变成一次 Astra 运行,再把运行结果变回两个目标变量的那部分。SCOOP 库把个体分发到多个核上并行计算(Christos Papadopoulos 在遗传算法和并行计算上帮了我)。框架设计时把模拟器和优化器都留成可以替换的,真正接进去的只有 Astra 和这两个 GA。

PyGAS 进化一代的流程:遗传算法(算子是 DEAP 的 NSGA-II 或 SPEA2)把每个个体交给输入文件改写器,改写器把它的输入变量写进自己的 Astra 输入文件;个体用 SCOOP 并行评估,文章里的计算跑在 LBL 与清华的集群上;出口处的 100% 发射度和 rms 束长作为两个目标变量送回下一代。下方是被模拟的 S/C 分离型注入器:电子枪,螺线管线圈,C 波段聚束腔和两节 S 波段加速管。 遗传算法 输入文件改写器 生成器 + Astra 出口统计 NSGA-II 或 SPEA2 (算子来自 DEAP) 每一代都存盘 一个个体一个文件夹 它的输入变量写进 Astra 输入文件 多个个体并行(SCOOP) 文章里的计算跑在 LBL 与清华的集群上 100% 发射度 rms 束长 (两个目标变量) 按适应度对种群排序,产生下一代 电子枪 螺线管线圈 C 波段聚束腔 S 波段加速管 S 波段加速管 Astra 模拟的 S/C 分离型注入器
PyGAS 进化一代的流程,以及它模拟的注入器。

分离型的结果最好。合并型走了同一套优化,它的 Pareto 前沿落在无聚束腔和 C 波段聚束腔两条之间:rms 束长小于 0.65 mm 时趋近于无聚束腔的情形,大于 0.65 mm 时趋向于 C 波段的结果。两种布局为什么不同,我没有分析。

有一点没有搞清楚。优化中激光束长的上限设为 15 ps,优化器却没有用满,最长只到 13 ps 左右,峰值流强 30 A 的最优解只用到 10 ps。整个方案的出发点就是拉长束团再靠高频腔聚束,优化器却没有把束团拉到上限,IPAC'16 的文章里我也这么写了。一个可能的原因是初始束团过长导致较大的 RF 能散,在螺线管线圈中造成色散效应,论文里没有验证这一点。

优化器还做了另一件我没有解释的事。加入聚束腔后,30 A 对应的激光长度从 5 ps 拉长到了 10 ps,而激光半径只从 0.4 mm 降到了 0.32 mm。若此时是笔形束的饱和发射,激光长度拉长一倍时半径应当缩小 37%,优化器却只选了 20%。这说明引入聚束腔之后,阴极上束流亮度最高的发射状态并不是注入器出口处亮度最高的状态;而对无聚束腔的注入器,两者是一致的。

注入器出口 100% 投影 rms 发射度对 rms 束长的散点,三条 Pareto 前沿:无聚束腔,X 波段聚束腔,C 波段聚束腔;C 波段的一条最低,点线标着 0.65 mm。
遗传算法在出口发射度与 rms 束长之间找到的 Pareto 前沿,无聚束腔,X 波段和 C 波段各一条。
沿束团的切片发射度,三种情形:无聚束腔约 0.2 mm·mrad,C 波段聚束腔约 0.15,C 波段聚束腔加 0.5 µm/mm 的热发射度约 0.10;核心部分平坦,两头上翘。
沿束团的切片发射度,无聚束腔,C 波段,以及 C 波段配上热发射度 0.5 µm/mm 的阴极。

在清华大学探索 100 高性能计算平台上,注入器的单次模拟大约在 30 到 60 分钟之间,一次完整的优化要几天。论文这一章的结尾写的是没有做成的部分。优化器没有充分利用聚束腔的压缩能力,初始束团没有取到预期的长度,最优解里也没有一个处在空间电荷限发射的状态,因此束流始终没有靠近上一节推出的极限热发射度。能回答的是 30 A 峰值流强下 0.15 mm·mrad 的核心切片发射度。0.1 只在给优化器换上一块热发射度更低的阴极之后才出现,归一化热发射度从 0.9 µm/mm 降到 0.5 µm/mm。这不算取巧,论文的结论也是这样写的。200 pC 下在注入器出口获得 0.1 mm·mrad 是完全可能的,只要采用归一化热发射度小于 0.5 µm/mm 的光阴极(例如工作在低 QE 模式下的某些半导体阴极),采用笔形束发射,并在束线中引入一个高频聚束腔。

PyeGun

2017 年 2 月,答辩之后,我把调腔的循环从注入器的工作里单独拿出来,单独建了一个仓库 PyeGun。给它两个数,工作频率和 cell 数,剩下的交给 Superfish 和牛顿法,一步一步调整半径,直到频率和场平都达到要求。它停在了原型阶段。

暑期实践项目里的光斑网格

标题末尾的「等等」指的是这一节。哈特曼-夏克波前传感器(Hartmann-Shack wavefront sensor)在相机前放一片微透镜阵列,光在相机上成为一格一格的光斑,每个光斑相对于参考位置的偏移就给出波前在这一点的局部倾斜。HS WFS Toolbox 给每个光斑找出它在网格中的行和列,即使图像拉丝,断成几块或缺了一角也能工作。办法是把图像分别向 x 和 y 方向投影,在投影上找峰(找峰用的是别人从 MATLAB 脚本 peakdet 移植的 Python 版本);把图像切成若干条带,每条各自找峰,网格就能跟着图像的形变弯曲。然后对每个光斑做高斯拟合,得到它的中心和亮度。

四帧光斑阵列并排:稀疏拉丝的光斑(缺光斑的地方用空心圆标出预期位置),断成三块竖条的阵列,顶边缺了一大块的圆阵列,圆角的方阵列。
四帧用简单的网格算法会认错的图像。
原始光斑图像:密集的红色光斑填满一块不规则、有缺失的区域。
光斑填满一块不规则区域的原始图像。
同一帧,黄色网格穿过检测到的光斑,顺着参差的上边缘走。
工具箱在这帧图像上描出的网格。

数字出自博士论文(清华,2016 年)及其代码附录,2015 年的两篇粗糙度文章,NIM A 文章和 IPAC'16。