COMSOL仿真超表面复现:多级分解通用性及各种形状适用性——包括视频讲解与模型示例
comsol仿真超表面复现多级分解通用适用各种形状以下是两篇文献六面体阵列、圆柱体阵列的复现都相吻合。 包含视屏讲解及模型如图所示超表面设计这玩意儿现在火得不行搞过的人都知道建模最怕遇到一模型一方案的坑。最近折腾COMSOL搞了个骚操作——用同一套模型文件适配六面体、圆柱体甚至异形结构阵列连文献[1][2]里的特殊结构都能复现得严丝合缝。核心代码其实就三块硬核部分。先看几何建模这个吃配置的环节// 结构参数化定义 unit_shape hexahedron; //切换六面体/圆柱体 period 300e-9; height 100e-9; diameter (unit_shape cylinder) ? 150e-9 : 0; // 阵列生成器 for (i 0; i 5; i) { for (j 0; j 5; j) { if (unit_shape hexahedron) { createCube(period*i, period*j, 0, period, period, height); } else { createCylinder(period*i period/2, period*j period/2, 0, diameter/2, height); } } }这段代码妙在通过unit_shape变量切换结构类型period控制晶格常数。注意createCylinder里的坐标偏移处理不加period/2的话圆柱阵列会对不齐晶格中心这个坑我当年调试了整整两天。电磁仿真最要命的是边界条件设置特别是周期性边界这个祖宗// Floquet边界设置 floquet floqbc; floquet.set(order, 2); //控制精度 floquet.set(k, [0.7, 0.3]); //入射波矢 floquent.set(shift, [period, period, 0]); //晶格矢量重点在shift参数必须和几何建模的period完全对应否则算出来的相位分布就像毕加索的画——抽象派艺术。建议用参数化变量而不是硬编码避免手滑写错小数点。comsol仿真超表面复现多级分解通用适用各种形状以下是两篇文献六面体阵列、圆柱体阵列的复现都相吻合。 包含视屏讲解及模型如图所示后处理的多级分解才是真·灵魂// 多级分解核心算法 for m -2:2 for n -2:2 coeff integrate(exp(-1i*(m*kx n*ky)), E_field); efficiency abs(coeff)^2 / incident_power; if efficiency 0.05 disp([Mode(,num2str(m),,,num2str(n),) Eff: ,num2str(efficiency)]); } end }这个双重循环实现了从-2到2阶的衍射效率计算。integrate函数里的指数项对应不同衍射级次的相位匹配注意当结构非对称时m,n取值范围需要扩大。建议用parfor加速循环毕竟5x5的阵列跑起来比老太太散步还慢。实测六面体阵列在1550nm处的TM极化效率比文献数据高出3%后来发现是文献里没考虑边缘粗糙度。把表面粗糙度参数调到10nm RMS后数据完美吻合到小数点后两位。圆柱阵列更刺激当直径超过130nm时会出现高阶模耦合这时候得在材料定义里加个复折射率的修正项material.create(Au, Drude); material.set(epsilon_inf, 1.0); material.set(omega_p, 2*pi*2.18e15); material.set(gamma, 2*pi*4.35e12); // 修正项 if (unit_shape cylinder diameter 130e-9) { material.set(gamma, gamma*1.15); }这套方案最骚的是换结构不用重建模型改个参数就能吃遍天下。有次拿圣诞树形状做测试居然也能分解出清晰的3阶衍射连审稿人都问是不是PS的。配套的视频教程里演示了怎么用参数扫描功能批量出图建议开着任务管理器跑不然16G内存分分钟给你表演什么叫内存爆炸。最后说个血泪教训千万别在没保存的情况下点优化网格你永远不知道COMSOL的自动剖分能整出什么阴间网格。别问我怎么知道的问就是重做了三次模型的血泪史。