Comsol超表面偏振转换仿真:周期边界设置与代码化建模

📅 发布时间:2026/9/1 6:34:46
Comsol超表面偏振转换仿真:周期边界设置与代码化建模
简介面向光学工程与微纳光子学方向的科研人员和工程师这份资源提供了一套基于Comsol多物理场仿真软件的超表面偏振转换设计源码包。资源以介质半波片和1/4波片为典型场景系统演示了从材料参数定义、几何建模到边界条件设置的关键流程并给出匹配半波片与1/4波片的结构尺寸选择思路可直接用于偏振调控器件的仿真初探。压缩包共3个文件体积仅10KB其中inscode脚本文件对应Comsol仿真建模代码html文件承载设计说明与结果预览gitignore用于版本控制辅助。目前已有53人学习/下载。借助示例中的代码与说明文档用户能快速理解超表面偏振转换的原理与实现路径掌握波片结构设计要点、模拟参数调整和结果优化方法为后续开展可穿戴设备、光通信或先进成像中的小型化光学器件研究打下基础。无论是验证已有实验现象还是探索新的偏振调控结构这套源码都能提供清晰的起点。 这次的项目是Comsol超表面偏振转换设计标题里带了[代码]两个字说明要的不只是一张效果图而是能跑通、能复现、能改参数的完整仿真方案。超表面偏振转换这几年在光学、太赫兹、天线设计里出现频率极高核心就是把入射光的偏振态通过亚波长结构“拧”成另一个偏振态常用的是将线偏振旋转90度或实现线偏振到圆偏振的转换。对于正在做相关课题的同学来说难点往往不在物理概念而在Comsol里怎么把周期边界、双端口、材料参数和S参数提取一环扣一环搭起来任何一个环节出错结果就完全对不上文献。这篇我把建模、边界设置、代码化扫参和常见坑过一遍适合想复现论文结果、或者正在写超表面方向仿真代码的读者。1. 超表面偏振转换的物理图像与设计原则1.1 偏振转换的本质各向异性与相位差偏振转换说白了就是让电场矢量在传播过程中改变振荡方向。超表面实现这一点靠的不是传统波片那种长距离累积效应而是亚波长单元结构对不同偏振方向的光表现出不同的等效介电响应也就是各向异性。拿最常见的长方形纳米砖举例沿长边的等效折射率比沿短边的等效折射率高。一束45度线偏振光入射到纳米砖上它可以被分解成沿x和沿y的两个正交分量这两个分量穿过纳米砖后因为等效折射率不同获得不同的相位延迟。假设x分量和y分量的相位差是π那么两个分量重新合成后出射光偏振方向就从45度变成了-45度相当于偏振方向旋转了90度。这个机制和晶体光学里的双折射本质上是同一回事只是超表面在亚波长厚度内做到了同样的效果。设计时的关键指标就是两个正交分量之间的相位差Δφ要让Δφπ才能在特定条件下实现90度偏振旋转。很多刚入门的同学一上来就追求高透射率实际上更值得关注的是“交叉偏振转化效率”也就是入射偏振分量中有多少能量转化成了与之正交的偏振分量。1.2 经典单元结构选型与Comsol中的建模思路常见的偏振转换单元结构包括矩形纳米砖、L形、C形开口环、椭圆微柱、椭圆纳米孔等。从学习和复现的角度我强烈建议先用矩形纳米砖。原因有三个几何简单、参数化方便、对网格质量要求相对友好。L形和C形结构在谐振频率附近能获得更高的转换效率但它们的几何依赖性强稍微改动一个臂长就可能产生完全不同的共振模式作为初学案例容易打击信心。Comsol建模的思路是这样的衬底和纳米砖用实体建模上方是空气区域。一个周期单元内只放一个纳米砖四周用Floquet周期边界连接入射端口放在单元顶部出射端口放在底部通过S参数读取透射和反射的偏振分量。这个模型本质上是在模拟一个无限大的均匀周期阵列而不是单个孤立结构。如果你的研究目标是非垂直入射比如斜入射或者锥形入射那需要开启多个Floquet谐波模式Comsol里在周期边界条件中可以设置衍射级次数。垂直入射时通常一个周期模式就够了这也是新手入门最容易跑通的情况。1.3 为什么周期边界端口是全波仿真的唯一正解很多人刚开始会用一个大空气盒子四周设置散射边界以为这样更“真实”实际上对于超表面这种无限周期结构散射边界会产生人为的边缘反射导致透射率和反射率严重偏离真实结果。原因很简单超表面的理论分析都是基于无限周期假设的。你仿真一个单元等效的就是整个阵列所以边界条件必须体现“周期性”。Comsol里推荐的组合是一对Floquet周期边界加上端口边界。这样得到的S参数才是严格意义上的阵列透射率和反射率。需要提醒的是如果研究的是有限尺寸超表面比如几微米见方的小口径器件那应该用大区域建模或者近场-远场变换而不是简单加散射边界。这两种场景的模型结构完全不同别混在一起。2. 建模前的关键准备2.1 几何参数与材料参数速查以近红外波段入射波长1550 nm附近的线偏振转换器为例我给出一组实测能跑通的初始参数参数数值说明周期p300 nm单元边长需小于工作波长纳米砖长Lx200 nm沿x方向长度纳米砖宽Ly100 nm沿y方向宽度纳米砖厚度h50 nm金属结构高度衬底材料SiO2折射率1.45忽略色散纳米砖材料Au金使用Comsol内置光学色散模型顶部空气高度600 nm入射端口面到纳米砖顶部底部空气高度300 nm衬底底部到出射端口面这里有个经验规律要获得π相位差矩形纳米砖的长宽尺寸差大约在工作波长的六分之一到四分之一之间。如果使用高折射率全介质材料比如Si或TiO2结构尺寸会更小如果使用金属天线则要考虑损耗对透射率的影响。2.2 用工作平面画纳米砖位置与尺寸的参数化技巧Comsol工作平面是超表面建模里使用频率最高的几何工具。很多新手在3D视图里直接画一个矩形块位置全靠鼠标拖这样后续改尺寸会非常痛苦。正确做法是先在全局参数中定义好p、Lx、Ly、h然后在几何节点中创建Work Plane选择z0平面作为绘制平面。进入工作平面后画一个矩形。矩形的左下角坐标设置为((p-Lx)/2, (p-Ly)/2)这样矩形就能自动居中在单元中心。属性栏里宽度填Lx高度填Ly。这里的变量名会直接引用全局定义里的参数后续修改参数表几何会自动更新。然后使用拉伸Extrude距离填h注意拉伸方向。我习惯在z0的衬底表面向上拉伸这样纳米砖直接“坐”在衬底上不需要额外做布尔运算。这里有一个非常容易踩的坑工作平面中的草图尺寸单位可能和全局单位不一致。在属性栏中输入表达式时务必带上单位后缀例如(300e-9)/2或者直接引用参数p/2 - Lx/2避免数字背后单位混乱。2.3 边界条件与端口设置避免“串扰”的细节RF模块中“电磁波频域”接口下的超表面单元模型需要设置四个部分入射端口面、出射端口面、两对周期边界。端口类型选择“周期性”模式设置为“线性偏振”然后在“模式设置”里明确入射偏振方向。要做完整的偏振分析必须设置两个正交的入射端口。我的做法是端口1设置为x偏振入射端口2设置为y偏振入射。这样一次仿真就能得到4个透射系数对应一个完整的2×2琼斯矩阵。有一个容易忽略的点端口模式场的默认方向是从端口边界向外看的。如果方向定义反了出射端口的S参数相位会不对。每次设置完端口我都建议在端口设置里检查“模式方向”和“激励”选项确保只有入射端口开启激励出射端口只做接收。3. 核心实现从GUI到脚本驱动3.1 模型树搭建完整流程分步下面是我实际操作的顺序在Comsol 6.x上验证过5.x版本同样适用。第一步新建模型选择“三维”添加物理场“电磁波频域ewfd”。第二步全局定义—参数输入p、Lx、Ly、h、lambda0等。单位必须写清楚比如p300[nm]如果不写Comsol会用全局单位后续改起来容易乱。第三步几何。不建议用几个分块拼凑的方式容易在界面处产生网格不连续。我的习惯是先建一个长方体整体尺寸为300×300×60050300衬底厚度纳米然后用“分割面”功能在z50 nm和z50衬底厚度处把区域分成空气层、衬底层再用工作平面画矩形并拉伸形成纳米砖。这样最终的几何域边界都是共面的网格划分时不容易出错。第四步材料。空气材料、SiO2材料、Au材料分别赋给对应域。Au材料可以直接使用Comsol材料库自带的Optical model内置了Drude-Lorentz色散模型比手动输入常数折射率靠谱得多。第五步物理场设置。先设置周期边界给两对相对面添加“周期性”条件类型选Floquet周期垂直入射时波矢方向设为0。然后设置端口1和端口2分别选择入射端面和出射端面。第六步网格。先用物理场控制网格快速算一遍确认结果没有明显异常后再细化。细化时优先在纳米砖表面加边界层网格最大单元尺寸设置为lambda/10左右金层厚度方向至少分两层。第七步研究。添加“频域”研究扫描波长从800 nm到1600 nm步长20 nm。求解器设置为直接求解器推荐PARDISO或MUMPS。第八步后处理。在“派生值—全局计算”中提取S参数计算偏振转换率这一步放到后面详细说。这套流程跑通之后你就拥有了一个超表面单元的标准仿真模板。后面换材料、换结构只需要改参数和几何不用从头搭模型。3.2 让模型具备可复现性把模型“代码化”标题里带[代码]这里必须说清楚怎么让模型具备代码化能力。Comsol提供了一种把GUI模型导出为Java文件的方式文件→另存为→选择“Java文件.java”。导出的Java文件包含了完整的建模命令序列可以在命令行运行也可以嵌入到自己的流程里。很多初学者拿到生成代码后不知道从哪里下手我的建议是不要试图理解所有代码只改参数区和求解器设置区。导出的代码中通常会有类似这样的片段model.param().set(p, 300[nm]); model.param().set(Lx, 200[nm]); model.param().set(Ly, 100[nm]); model.param().set(h, 50[nm]); model.param().set(lambda0, 1550[nm]);这就是全局参数区。你可以把“200[nm]”批量替换成一组实验设计的数值或者用循环遍历。不过对于大多数科研场景我反而建议不要直接改Java代码而是充分利用GUI里的“参数化扫描”功能在研究中添加参数化扫描扫描变量选Lx参数列表写“200[nm] 220[nm] 240[nm]”然后再嵌套扫描波长。这样模型文件不变计算时自动循环比改代码更直观。如果你确实需要用脚本来做批量运算可以使用COMSOL with MATLAB接口。在MATLAB里创建模型的典型命令model ModelUtil.create(Model); model.component.create(comp1, true); model.component(comp1).geom.create(geom1, 3); model.component(comp1).geom(geom1).create(blk1, Block); model.component(comp1).geom(geom1).feature(blk1).set(size, [300e-9 300e-9 900e-9]);注意MATLAB接口命令名和Java接口非常相似但不是完全一致很多人在这里卡住。我的经验是先在GUI中把小模型调通导出Java代码再用“开发工具—模型方法”把代码封装成可调用的方法通过方法传参实现扫参。这样既能保留GUI的可视化调试能力又具备脚本化的批量处理能力。3.3 网格划分和求解器的选择理由超表面仿真的网格其实非常敏感。金属和介质界面上如果网格太粗S参数曲线会像锯齿一样抖动如果太细计算时间成倍增加扫频时尤其明显。个人经验是先用“物理场控制网格”的默认精度跑一个单频点比如1550 nm看看结果是否合理。然后再细化网格重点细化纳米砖表面、衬底顶部边界和端口附近。不要盲目地全局加密很多区域对结果影响很小。网格尺寸的经验值最大单元尺寸设为工作波长的十分之一左右即155 nm纳米砖附近的表面网格控制在20~40 nm金层厚度方向至少两层网格。如果纳米砖有锐利边缘有必要在边缘位置加“角部细化”。求解器方面频域扫描建议用直接求解器。PARDISO对内存需求相对低MUMPS更稳定。模型规模比较小几十万自由度以内时两者区别不大当年我扫几百个频点的时候内存占用会逐渐增加建议每隔一段频率重新初始化一次求解器避免内存持续堆积。4. 后处理如何量化偏振转换效果4.1 提取S参数与计算偏振转换率在“派生值—全局计算”里输入表达式可以提取出端口间的透射和反射系数。但要注意Comsol默认计算的是S参数矩阵中某一项表达式格式通常是ewfd.S21之类的端口间传输系数。要得到偏振转换率不能只看一个S21而是要同时提取交叉偏振分量。假设入射是x偏振透射中如果仍然以x偏振为主说明没有发生偏振转换如果y偏振分量占比变大说明偏振转换发生了。定义偏振转换率PCR |S21_yx|^2 / (|S21_yx|^2 |S21_xx|^2)这个值在共振波长附近会达到峰值范围从0到1。入射为y偏振时用|S21_xy|^2来计算。这里需要特别注意如果入射端口和出射端口的模式方向定义不一致S参数的下标可能有差异。最稳妥的验证方法是用一个正方形柱子各向同性结构跑一遍模型此时PCR应当接近0。如果算出来不为0说明端口模式方向定义有问题。4.2 监视E场分布和出射相位只看S参数有时候会忽略一个重要信息相位。超表面除了偏振转换还很关注相位调控比如用于聚焦或偏转。这种情况下需要观察纳米砖顶部平面上的Ex分量和Ey分量的相位分布。操作方法在结果节点中创建“二维截面”选择z等于纳米砖顶面的平面然后绘制Ex和Ey的相位。如果两个正交分量的相位差在目标波长处接近π就说明这个结构能实现90度偏振旋转。这里有一个后处理的小坑Comsol的相位计算默认用atan2函数输出范围是[-π, π]。绘制相位谱时如果看到相位跳变先检查是不是跨越了±π边界。如果是需要使用解包裹处理后再分析否则相位曲线会看起来混乱不堪。4.3 参数扫描结果的可视化参数化扫描结束后“结果”节点下会出现多个数据集。可以在一张一维绘图组里选择不同参数的数据集来对比或者直接在曲线图上用颜色区分不同Lx值。我习惯把横轴设为波长nm纵轴设为PCR每条线对应一个Lx值这样可以清晰看出结构尺寸对偏振转换效率的影响。Comsol内置绘图功能在快速预览时够用但如果是写论文要出图我还是建议导出数据后用Python的matplotlib来画。导出方式右键一维绘图组选择“导出绘图数据”得到一个txt文件。用pandas读取:import pandas as pd import matplotlib.pyplot as plt data pd.read_csv(pcr_data.txt, sep\t) plt.plot(data[lambda], data[PCR]) plt.xlabel(Wavelength (nm)) plt.ylabel(PCR) plt.show()这样可控性更高颜色、线型、坐标字体都能自定义。5. 常见问题与排查实录5.1 “三个端口”警告周期端口设置陷阱我第一次搭超表面模型时设置完周期边界和两个端口后求解提示“模型有3个端口其中端口3未定义”。排查了很久才发现是因为我选择周期边界时把一对相对面中的一个面误选成了端口类型。更常见的陷阱是端口边界没有覆盖完整的单元边界。如果一个端口只选了部分面Comsol会自动把剩余边界当做一个额外的端口就会出现端口3、端口4。排查方法很简单在物理场节点下逐个检查端口确认每个端口对应的边界组是否完整。同时确保每个端口边界上只有一个是“激励”状态。注意复制端口1再修改方向时模式编号可能没有自动更新如果出现模式冲突手动将端口2的模式编号改为2。5.2 毛刺和收敛异常网格与求解器的坑S参数曲线出现毛刺最常见的元凶是网格。金属纳米砖在共振频率附近场强会集中在结构尖角或边缘这些位置网格不够密会导致计算结果不稳定。解决方法把纳米砖边缘和角部的网格强制细化同时检查边界层网格是否覆盖了金属表面。其次是频域扫描的步长。如果结构Q值较高共振线宽很窄扫描步长过大时会漏掉共振峰或者得到不连续的跳变。遇到这种情况先在疑似共振位置附近加密扫描点验证一下结果是否合理。还有一个容易被忽略的因素空气层厚度。顶部和底部空气区太薄时高次Floquet谐波可能被截断虽然垂直入射场景影响不大但如果计算模式剧烈变化可以尝试把空气高度翻倍再比较结果。5.3 与实验对不上别急着怀疑物理场很多人的模拟PCR做到0.9以上但实验测出来只有0.5甚至更低于是开始怀疑是不是CST、FDTD或者材料库的问题。实际上问题通常出在材料参数和实际工艺的差异上。Comsol材料库的Au光学参数来自Johnson and Christy的经典数据但实际镀膜工艺制备的金膜在可见光到近红外波段的损耗明显偏大。如果要做和定量实验对比建议使用自己样品实测的椭偏数据拟合的折射率。另一个差异来源是结构形貌实验中的矩形纳米砖难免有圆角、侧壁倾斜或底部粗糙这在Comsol里可以用圆角化几何或梯形截面近似。没有标准答案只能基于你具体样品的SEM表征结果来微调模拟几何。这些细节虽然不会改变趋势但会影响峰值的绝对数值。最后分享一个我自己的操作习惯每次跑完仿真我都会顺便导出一份纳米砖上表面电场分布图存成png。前期觉得占空间后期写论文补充材料的时候这些图真的能救命。至于很多同学问的“网格画到多细才保险”我的经验是先用默认网格单频点算通再针对关注频段细化效率最高不要一上来就全局加密。本文还有配套的精品资源点击获取