4. 从FDTD/FEM仿真到紧凑模型的数据流水线
在硅光器件紧凑模型构建中,仿真工具(FDTD、FEM、EME)负责求解麦克斯韦方程组,而紧凑模型需要的是可嵌入电路仿真器的解析或查表表达式。两者之间隔着一条数据流水线:仿真参数扫描、结果提取、数据清洗、格式转换和版本管理。这条流水线如果靠手工操作,一个包含 5 个几何参数、每个参数 4 个取值的扫描就要跑 1024 次仿真,手工整理 S 参数几乎不可能保证一致性。本节以马赫-曾德尔调制器(MZM)中的关键单元——单臂相移波导为例,搭建一条可复现的自动化流水线。
一、流水线的整体结构
整条流水线可以拆成五个阶段,每个阶段有明确的输入、输出和失败判据。下图给出各阶段之间的数据流与关键产物,其中仿真层产生原始 S 参数,提取层把 S 参数转成有效折射率与损耗,清洗层剔除不收敛或非物理的数据点,转换层生成紧凑模型所需的查找表或多项式系数,版本层用 Git 管理脚本、参数文件和模型文件。
二、参数扫描:把几何与材料变量组织成可枚举的集合
扫描的第一步不是打开仿真软件,而是定义参数空间。以 220 nm 绝缘体上硅(SOI)条形波导为例,关键几何参数为波导宽度 W(400–600 nm,步长 50 nm)、刻蚀深度 H(全刻蚀/浅刻蚀两档)、传播长度 L(100–1000 μm,步长 100 μm),材料参数为工作波长 λ(1530–1570 nm,步长 5 nm)。用 Python 生成参数组合并写入 JSON:
import itertools, json
W = [400, 450, 500, 550, 600]
H = ["full", "shallow"]
L = [100, 200, 500, 1000]
lam = [1530, 1540, 1550, 1560, 1570]
combos = list(itertools.product(W, H, L, lam))
with open("sweep_params.json", "w") as f:
json.dump([{"W": w, "H": h, "L": l, "lambda": la}
for w, h, l, la in combos], f, indent=2)
print(len(combos)) # 200
200 个组合对应 200 次 FDTD 仿真。每次仿真用脚本调用 Lumerical 的 fdtd 引擎,通过 -batch 模式提交,仿真结果写入 raw_S21.csv,字段包括 W, H, L, lambda, S21_mag, S21_phase。这里要注意:相位必须用 unwrap 解缠,否则 2π 跳变会让后续群折射率计算完全错误。
三、结果提取:从 S 参数到 neff 与损耗
对单模波导,传播常数 β 与相位关系为 φ = βL,因此有效折射率 neff = φλ/(2πL)。损耗 α 由透射率 T = |S21|² 得到:α = -10·log10(T)/L,单位 dB/μm。提取脚本对每个组合计算 neff 和 α,并额外计算群折射率 ng = neff - λ·dneff/dλ,用于后续色散建模。提取结果写入 neff_vs_W.csv 和 loss_vs_W.csv。
判断提取是否可信,看三个量:neff 是否落在 2.0–2.8 的合理区间;α 是否为正且随 W 增大而单调下降(宽波导限制更强);ng 是否在 3.5–4.5 之间。若某点 neff 突然跳到 1.5 以下,通常是仿真未收敛或模式识别错误。
四、数据清洗:剔除不收敛与非物理点
清洗规则要写成可执行的判据,而不是靠肉眼。以下四条规则按顺序执行:
- 收敛检查:读取仿真日志中的
autoshutoff值,若大于 1e-5,标记为不收敛并剔除。 - 物理范围检查:neff 不在 [2.0, 2.8] 或 α 不在 [0.01, 10] dB/μm 的点剔除。
- 单调性检查:固定 H、L、λ 时,neff 应随 W 增大而单调增大;若出现反向,标记为可疑点。
- 平滑检查:对 neff(W) 做三点滑动平均,若某点与均值的偏差超过 2%,标记为离群点。
清洗后的数据写入 clean_neff.csv,被剔除的点记录到 outlier_log.txt,包含组合编号、违反的规则和原始值。这一步的产物是后续格式转换的唯一输入,保证模型只基于可信数据。
五、格式转换:生成紧凑模型可用的查找表与多项式
紧凑模型通常需要两种形式:查找表(LUT)用于快速插值,多项式用于解析求导。以 neff(W, λ) 为例,先对每个 λ 把 neff 拟合成 W 的二次多项式:neff = a0 + a1·W + a2·W²。拟合系数写入 mzm_model.json,同时把原始清洗数据导出为 neff_lut.csv,供不支持多项式的仿真器直接查表。转换脚本还要检查拟合残差:若 R² 低于 0.995,说明二次多项式不够,需要升到三次或改用分段拟合。
六、版本管理:让每次模型变更可追溯
流水线的脚本、参数文件、清洗后的数据和最终模型文件全部纳入 Git。大体积的原始仿真数据(raw_S21.csv 可能上百 MB)用 DVC 管理,Git 中只保留 .dvc 指针文件。每次模型发布打一个 tag,例如 v1.0-mzm-neff,tag 信息中记录:仿真工具版本、扫描参数哈希、清洗规则版本、拟合 R²。这样当电路仿真结果异常时,可以回溯到具体是哪一版数据、哪条清洗规则导致了偏差。
S21_phase 直接当相位使用而不解缠。当 L=1000 μm、neff≈2.4、λ=1550 nm 时,φ≈2π·2.4·1000/1.55≈9728 rad,远超 2π,不解缠会导致 neff 计算值完全错误。另一个错误是清洗时只剔除 NaN,不检查单调性,导致非物理的局部凹陷被拟合成多项式,最终模型在插值区间外发散。
整条流水线跑通后,从 200 次仿真到最终 mzm_model.json 的生成时间约 15 分钟(不含仿真本身),其中清洗和转换不到 10 秒。真正的价值在于:当工艺角从 400–600 nm 扩展到 380–650 nm 时,只需修改 sweep_params.json 并重跑,模型自动更新,版本自动记录,不需要任何手工整理。