Comsol超表面偏振转换设计:单元仿真与Floquet周期边界是关键

发布时间:2026/10/18 23:16:12
Comsol超表面偏振转换设计:单元仿真与Floquet周期边界是关键
简介面向基于 COMSOL 开展超表面偏振转换设计的科研人员与仿真工程师这份代码包提供介质半波片和 1/4 波片从理论到建模的完整示例解决偏振调制结构搭建与参数优化中的常见问题。包内共 3 个文件包含可运行的 .inscode 建模脚本、index.html 步骤说明页面以及 .gitignore 工程管理配置压缩包仅 10KB内容精炼、便于直接导入 COMSOL 工作区。当前已有 55 人学习浏览尤其适合正在学习超表面光学、想通过仿真验证偏振转换效果的读者。通过代码可逐项掌握材料属性设定、几何结构创建、边界条件配置与模拟扫描等关键操作理解半波片/1/4 波片相位延迟与偏振态变化的对应关系进而将超表面调控机制迁移到小型化光通信器件和集成光学系统的设计中。1. Comsol超表面偏振转换设计别急着建大阵列先把单元算明白接触超表面偏振转换的人十有八九第一反应是在Comsol里把几十上百个单元排成阵列再扔进全波仿真里等结果。但真正做过的人会告诉你单单元加Floquet周期边界算准偏振转换效率的性价比远高于全阵列仿真。这篇笔记就围绕Comsol超表面偏振转换设计展开内容分为原理建模、代码化实现、参数扫描与后处理核心目标是让你在半天内搭出一个可复现、可改参数、可直接提取交叉偏振透射系数的仿真流程。适合正在做透射式或反射式偏振转换器、各向异性超表面单元设计的人参考也适合刚接触超表面仿真、想绕开常见坑的新手。2. 偏振转换的物理图像为什么一个矩形块就能改变偏振态2.1 从半波片条件到单元各向异性超表面偏振转换的核心机制并不复杂当入射电磁波通过一个面内各向异性的单元结构时沿两个正交主轴方向的相位响应不同。若结构在两个主轴方向上的透射/反射系数幅度接近、相位差接近180°这个单元等效于一个半波片入射的线偏振波转换为正交偏振波。设计时关心的几何对象通常是矩形贴片、椭圆贴片或十字形结构。以矩形金属贴片为例长边Lx和短边Ly决定了两个主轴方向的等效极化率和谐振频率当工作频率落在两者谐振区之间、使相位差Δφ≈π时交叉偏振转换效率最高。这要求在Comsol里做单元仿真时几何必须保留明确的x、y各向异性不能简化为对称结构否则两个主轴简并偏振转换直接消失。2.2 反射型还是透射型建模方式的第一次分叉超表面偏振转换器按工作模式分两大类。反射型通常在金属衬底上生长介质间隔层和顶部金属图案利用金属-介质-金属的间隙等离激元共振偏振转换效率可以做到很高但只能在反射空间工作。透射型则是介质衬底上单层金属图案利用的是局域表面等离激元共振带宽相对窄但结构简单、容易多层叠加。在Comsol里这两者的建模差异很大。反射型需要把底层金属设为完美电导体或用实际金属材料并保证Z方向整体厚度包含间隔层透射型则要设置两个端口分别提取入射和透射信号。我一般会先根据目标频率和材料损耗估算一下两种方案的效率上限再决定用哪种避免做到一半发现损耗超标白费功夫。2.3 单元分析为什么够用Floquet边界的前提条件超表面单元周期性排列电磁场在周期结构中满足Bloch条件。只要单元尺寸远小于工作波长相邻单元间的互耦可以归入周期边界条件处理单元仿真得到的就是无限周期阵列中每个单元的响应。Comsol里的Floquet周期边界可以支持正入射和斜入射相位关系由波矢与周期矢量的点乘决定。需要警惕的是周期边界假设单元严格周期性、无限延展。实际加工的样品尺寸有限边缘单元的响应会偏离仿真结果但中心区域大面积单元行为与仿真一致。做设计优化时用单元仿真验证边缘效应再考虑全结构仿真这个顺序不要反过来。3. 用代码把几何和材料建出来从画一个矩形到叠层结构3.1 为什么用代码而不是GUI建模Comsol的GUI建模对于单次仿真足够但超表面设计几乎必然要做参数扫描可能是扫描几何尺寸、周期也可能是扫描材料厚度。GUI里每次改参数重新剖网格、求解操作重复度很高也容易漏掉某个边界条件。用Java API写脚本的好处是几何、材料、物理场、扫描、结果导出都在一段代码里参数可追溯换参数重跑就是改一个数值的事。另一个实际好处是团队协作。GUI模型文件传到别人手里经常遇到版本不兼容或字体乱码。代码文件可以用文本对比工具逐行审阅也方便放进版本管理。某公司项目里我们一直用这种方式维护超表面单元库换人接手基本没有学习成本。3.2 最小几何代码金属贴片加介质衬底下面的代码片段用于创建一个典型的透射式超表面单元介质衬底上方一个矩形金属贴片。几何尺寸全部用参数驱动后续扫描只需要改参数值。Model model ModelUtil.createModel(); model.label(MS_Polarization_Converter); model.param().set(period, 0.45[um]); model.param().set(lx, 0.32[um]); model.param().set(ly, 0.18[um]); model.param().set(tmetal, 0.04[um]); model.param().set(tsub, 0.5[um]); model.component().create(comp1, true); model.component(comp1).geom().create(geom1, 3); model.component(comp1).geom(geom1).create(blkSub, Block); model.component(comp1).geom(geom1).feature(blkSub).set(size, new String[]{period, period, tsub}); model.component(comp1).geom(geom1).feature(blkSub).set(pos, new String[]{-period/2, -period/2, 0}); model.component(comp1).geom(geom1).create(blkMetal, Block); model.component(comp1).geom(geom1).feature(blkMetal).set(size, new String[]{lx, ly, tmetal}); model.component(comp1).geom(geom1).feature(blkMetal).set(pos, new String[]{-lx/2, -ly/2, tsub}); model.component(comp1).geom(geom1).run();衬底尺寸设为周期大小且居中放置是为了配合后续的周期边界条件。金属块放在衬底顶面Ztsub处位置按中心对齐这样两个主轴方向都保留了对称性方便后期加对称面加速计算。需要说明的是这里金属贴片直接建成了理想矩形。实际加工出来的结构角上有圆角对偏振转换效率的影响通常很小除非工作在极窄带谐振区。前期设计阶段用直角模型问题不大后期要跟实验对比了再考虑圆角。3.3 材料分配色散数据别拍脑袋金属在可见光和近红外波段的介电常数是强色散的用固定值会导致共振位置严重偏移。Comsol材料库自带一些金属光学常数也可以手动输入实验数据。下面是在代码中为金属层和衬底分配材料的常规写法。model.component(comp1).material().create(matMetal, Common); model.component(comp1).material(matMetal).propertyGroup().create(RefractiveIndex, RefractiveIndex); model.component(comp1).material(matMetal).propertyGroup(RefractiveIndex) .set(n, 0.18 0.02*i); // 示例金在近红外的粗略折射率 model.component(comp1).material(matMetal).selection().set(blkMetal); model.component(comp1).material().create(matSub, Common); model.component(comp1).material(matSub).propertyGroup().create(RefractiveIndex, RefractiveIndex); model.component(comp1).material(matSub).propertyGroup(RefractiveIndex).set(n, 1.45); model.component(comp1).material(matSub).selection().set(blkSub);这里用一个粗略的复折射率做演示实际设计时应该使用可靠的金属光学常数数据表。注意衬底折射率如果是1.45工作波长范围大概对应近红外到通信波段如果做可见光超表面衬底通常换成高折射率玻璃或介质膜折射率范围在1.5到2.0之间。金属材料数据有一个容易被忽略的问题不同文献测得的介电常数在短波段差异很大尤其在金属间跃迁吸收区域。同一个结构用不同数据源的材料参数共振波长可能偏移几十纳米。建议从确定设计目标时就把材料数据来源固定下来并且在模型描述里标注版本便于后续排查。3.4 几何构建中的尺寸参数微米还是纳米单位怎么设Comsol的参数单位写在方括号内比如0.45[um]几何特征里的尺寸会自动换算成标准米制。这里有一个容易翻车的地方如果在param里写的是0.45而没有单位Comsol会默认使用当前模型的长度单位。模型长度单位默认是米那么0.45就是0.45米做出来的模型大得离谱。我习惯把所有几何参数都写成[um]或[nm]频率写成[THz]或[GHz]绝对不让单位裸奔。这个习惯帮我在参数扫描时躲过了不知道多少次尺寸差一千倍的翻车现场。另一点是几何创建后的run()方法必须执行否则后续物理场和网格看不到几何体很多人第一次写脚本时就是漏了这一步导致报错。4. 物理场与求解配置端口怎么设S参数怎么取4.1 电磁波频域接口与端口模式透射式超表面单元的Comsol仿真使用电磁波频域接口。Z方向设定为波传播方向在单元底部设置端口1作为入射端口顶部设置端口2作为透射端口。每个端口需要设定模态数正入射时x线偏振和y线偏振就是两个正交模态分别对应S参数矩阵中的两个通道。端口设置里最关键的参数是偏振方向。Comsol的周期性端口通过指定波矢方向和极化方向来定义模态默认情况下极化方向可能与几何主轴不重合这会直接导致提取的交叉偏振分量偏小或出现串扰。建议在代码里显式设置每个端口的极化基准。4.2 周期边界条件正入射与斜入射的相位设置Floquet周期边界在Comsol里以“周期性条件”的形式加到X和Y方向相对的边界对上。正入射时周期相移为零斜入射时相移由入射角和周期计算得到。下面的代码把周期边界加到X方向边界上。model.component(comp1).physics().create(ewfd, ElectromagneticWaves, geom1); model.component(comp1).physics(ewfd).create(per1, PeriodicCondition, 2); model.component(comp1).physics(ewfd).feature(per1).selection().set(new String[]{bnd1, bnd2}); model.component(comp1).physics(ewfd).feature(per1).set(PeriodicType, Floquet); model.component(comp1).physics(ewfd).feature(per1).set(kFl, 0, 0);这里的bnd1和bnd2需要替换为模型实际边界编号。更稳妥的做法是在几何创建后先运行一次在日志里查看边界编号映射或者用边界名称选择器。Floquet边界的kFl参数是周期相移的分量。正入射时两个分量都为零斜入射时需要先按公式算出分量值再填入。很多人在斜入射扫描时直接把入射角写入kFl这是不对的kFl不是角度而是波矢与周期矢量点乘的结果。4.3 端口激励与S参数提取端口1设置为入射端口同时激活x偏振或y偏振模态。端口2作为透射端口不需要激励源但必须设置相同的模态数量和模态方向。求解完成后S参数通过变量ewfd.S11、ewfd.S21等读取多模态情况下还需要指定模态索引例如ewfd.S21_1_2表示从端口1模态2入射到端口2模态1的透射系数。下面是在代码中设置端口并执行频率扫描的片段model.component(comp1).physics(ewfd).create(port1, Port, 3); model.component(comp1).physics(ewfd).feature(port1).set(PortType, Periodic); model.component(comp1).physics(ewfd).feature(port1).set(Z0, 377[ohm]); model.component(comp1).physics(ewfd).feature(port1).set(WaveDirection, Positive); model.component(comp1).physics(ewfd).feature(port1).set(PortPolarization, new String[]{1, 0, 0}); model.study().create(std1); model.study(std1).create(freq, Frequency); model.study(std1).feature(freq).set(plist, 200[THz], 5[THz], 260[THz]); model.sol().create(sol1); model.sol(sol1).study(std1); model.sol(sol1).feature(fe1).set(activate, new boolean[]{true, true, true, true}); model.sol(sol1).runAll();端口特征里Z0设为自由空间阻抗377欧姆适用于平面波入射。PortPolarization数组里设为x方向偏振。如果要做完整的偏振转换矩阵需要运行两次一次激励x偏振一次激励y偏振分别记录四个S参数。实际工程中更推荐直接在一个端口里定义两个正交模态求解一次拿到2x2的S参数矩阵效率更高。模态数在端口设置里配为2Comsol会自动求解两个偏振态的响应。注意读取S参数时区分模态索引的顺序不同版本Comsol的索引约定略有差异建议先跑一个已知解析解的案例做验证。4.4 求解器与网格收敛性不能只看S参数曲线光滑频域求解器在超表面仿真里一般不会遇到不收敛的问题但结果可信度取决于网格能否分辨金属层内的场变化。金属贴片厚度通常只有几十纳米远小于工作波长如果网格剖分时厚度方向只有一层共振特性会被严重扭曲。建议金属层至少在厚度方向剖分两层网格表面采用三角形网格最大尺寸不超过最小特征尺寸的三分之一。对于矩形贴片长宽在300纳米左右时全局最大网格尺寸设为波长的十分之一到八分之一比较合适。求解完成后可以加密网格再对比共振频率漂移量漂移小于目标带宽的10%才认为收敛。5. 做超表面偏振转换最常见的5个坑5.1 金属层用默认网格导致共振峰整体偏移现象仿真得到的偏振转换效率曲线和文献对不上共振波长整体偏移40到60纳米效率峰值也偏低。原因金属层厚度方向网格不足趋肤深度没有被解析。尤其在红外波段金属趋肤深度30纳米左右而贴片厚度往往也是几十纳米网格一粗就把等离激元共振完全抹平了。解决在金属块上单独添加扫掠网格或边界层网格厚度方向至少3层或者把金属层改用过渡边界条件但要确认该条件的适用频率范围。按我习惯先用细网格跑通再逐步放粗看变化不要一开始就用粗网格。5.2 周期边界设成了PEC单元变成理想反射腔现象共振频率异常锐利Q值高得不正常交叉偏振转换效率在窄带内接近1稍微偏离就归零。原因有人把X和Y方向边界设成完美电导体或完美磁导体这样单元被理想导体壁封闭实际模拟的是波导谐振腔而不是周期阵列。解决检查边界条件类型确认相对边界对用的是Floquet周期条件而不是PEC/PMC。只有结构本身存在对称面并且激励也对称时才可以用对称面替代周期边界但要在计算前想清楚对称面与偏振方向的关系。5.3 端口偏振方向没对准几何主轴现象S参数矩阵不对称例如S21_xy和S21_yx差别很大但结构本身是中心对称的理论上两者应该相等。原因端口模态的极化方向由全局坐标系决定如果几何单元的X/Y轴与端口极化方向有夹角或者扫描几何参数后极化设置没有跟着旋转交叉偏振分量的提取就会出错。解决显式指定端口极化方向为(1,0,0)和(0,1,0)不要依赖默认值。跑完第一步先检查S21_xy和S21_yx是否满足互易性不满足就回头查端口。5.4 参数扫描时几何变量更新了但网格没有重建现象扫描几何参数时某些尺寸点结果正常临近尺寸点突然跳变或报错重启软件后同样的参数又正常了。原因几何尺寸改变后网格没有强制重建求解器在旧的网格上插值计算新几何导致结果出现非物理突变。这在参数化扫描中非常阴险因为报错时不会直接提示网格问题。解决在扫描循环里每次修改参数后显式调用网格重建功能并且把网格剖分放到研究求解之前。用Java API的话确保网格run()在求解runAll()之前执行。5.5 单位裸奔导致频率和尺寸差出几个数量级现象几何看起来完全正常单元尺寸比波长小一个数量级但共振频率算出来比预期高了几十倍。原因参数没有带单位Comsol按默认单位解释。例如预期微米尺寸却按米解释结构变得极大对应的共振频率自然跑到离谱的高频段。解决所有param()里的值都加方括号单位频率扫描范围同样加单位。设计开始前先用平面波垂直入射一个无图案介质板做标定确认S参数和理论透射率一致再开始跑超表面单元。6. 把单元结果换算成偏振转换率后处理与验证技巧偏振转换率的定义是交叉偏振透射功率与总透射功率之比。用Comsol的全局计算功能可以直接把S参数转成设计指标不用手动导出到外部工具。假设已经跑完两个偏振态的激励透射系数t_xx和t_xy对应同一入射偏振下的共偏振与交叉偏振分量则透射式偏振转换率PCR的表达式为PCR abs(t_xy)^2 / (abs(t_xx)^2 abs(t_xy)^2)在Comsol的派生值里新建全局表达式把变量名替换成实际的S参数变量比如ewfd.S21_2_1和ewfd.S21_1_1然后绘制随频率变化的曲线。建议同时计算消光比也就是10倍以10为底的对数PCR/(1-PCR)这个指标在器件对比时更直观。验证环节我有两个习惯。第一是做网格收敛性检查把全局最大网格尺寸从波长的十分之一加密到二十分之一对比共振波长漂移量漂移不超过目标带宽10%则认为结果可靠。第二是做互易性验证交换端口激励方向确认S21_xy和S21_yx在数值上一致。这能一次性排查掉端口设置、边界条件和网格三个环节的大部分问题。我在某个模拟项目X里踩过一次材料数据的坑结构参数完全复制了某篇文献但共振波长差了70纳米排查到最后发现是金属材料光学常数版本不同。从那以后我把材料数据源固定成一个文件并在模型描述里注明来源和日期再也没出过这种问题。超表面仿真里很多结果差异不是模型错了而是材料数据、边界条件或网格习惯不一致导致的固定流程比反复调参数更重要。希望这篇笔记能帮你把Comsol超表面偏振转换设计这条链路走得顺一点少花几天在那些回头看得见、当下看不破的坑里。本文还有配套的精品资源点击获取