COMSOL光学模型:双芯光纤/SPR折射率传感实验仿真模拟
深夜两点半的实验室,键盘声突然停了。我盯着屏幕上跳动的电场分布图,突然意识到这个双芯光纤SPR模型的玄机藏在几何参数里——两个纤芯的间距只要差0.1微米,传感灵敏度就能差出个数量级。这玩意儿可比单芯光纤刺激多了,简直就是光学版的量子纠缠。
先说说模型搭建的邪门技巧。在COMSOL里画双芯光纤,千万别傻乎乎地用两个圆柱体拼在一起。记得在几何节点里加个布尔操作,把两个纤芯包层合并成联合体,不然边界条件能把你逼疯。这是去年在德国访学时,实验室的咖啡机维修工教我的冷知识——有时候高手真的藏在奇怪的地方。
model.component("comp1").geom("geom1").feature().create("union1", "Union"); model.component("comp1").geom("geom1").feature("union1").selection("input").set({"cyl1", "cyl2"}); model.component("comp1").geom("geom1").feature("union1").set("intbnd", "off");这段代码看着简单,但那个intbnd参数要是设成on,计算域边界能多出十几个莫名其妙的奇异点。我吃过这亏,算到第18个小时网格剖分直接崩了,白瞎了三天电费。
COMSOL光学模型:双芯光纤/SPR折射率传感实验仿真模拟
SPR层的设置更有意思。金膜厚度控制在50nm时,TM波的倏逝波刚好能穿透到被测液体层。但注意别直接在材料库选Au,得手动改复折射率:
material = model.material().create("mat3"); material.propertyGroup("def").set("relpermeability", ["1","0","0","0","1","0","0","0","1"]); material.propertyGroup("def").set("relpermittivity", ["-12.5+1.2i","0","0","0","-12.5+1.2i","0","0","0","-12.5+1.2i"]);看到那个虚数项没?那1.2i就是金膜的损耗项。上次有个师弟把这值设成纯实数,仿真结果美如画,实际做出来屁都没有,被老板在组会上怼了半小时。
重点来了——参数化扫描。要捕捉SPR共振点,折射率变化步长得设成0.0001RIU。别嫌麻烦,直接上批处理模式:
for n=1:10 model.param.set("n_analyte", 1.33+0.001*n); model.material("mat4").propertyGroup("def").set("relpermittivity", ["(n_analyte)^2","0","0","0","(n_analyte)^2","0","0","0","(n_analyte)^2"]); model.study("std1").run; export_data(n) = abs(log10(model.result().numerical("gev1").getReal())); end这个循环里的玄机是动态修改被测液体折射率,每次迭代自动导出传输损耗。注意那个对数运算,能把微弱的共振峰放大成明显脉冲——跟PS修图一个道理。
最后说个血泪教训:网格划分必须用边界层网格包裹SPR区域,不然电场梯度根本捕捉不到。有次偷懒用了自由四面体网格,结果共振波长偏移了15nm,差点毕不了业。记住这个参数:
model.component("comp1").mesh("mesh1").feature().create("boundLay1", "BoundaryLayer"); model.component("comp1").mesh("mesh1").feature("boundLay1").set("thickness", "0.1um");凌晨四点的咖啡凉了,但屏幕上的灵敏度曲线开始呈现完美的线性。当最后一个数据点跳出时,突然明白双芯结构就像两把互相校准的游标卡尺——纤芯间距的微小变化,反而让整个系统对折射率异常敏感。这大概就是光学的魅力,总在意想不到处藏着惊喜。