Comsol超表面偏振转换仿真:周期边界设置与代码化建模
2026/9/1 6:34:44 网站建设 项目流程

简介:面向光学工程与微纳光子学方向的科研人员和工程师,这份资源提供了一套基于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,选择z=0平面作为绘制平面。

进入工作平面后,画一个矩形。矩形的左下角坐标设置为((p-Lx)/2, (p-Ly)/2),这样矩形就能自动居中在单元中心。属性栏里宽度填Lx,高度填Ly。这里的变量名会直接引用全局定义里的参数,后续修改参数表,几何会自动更新。

然后使用拉伸Extrude,距离填h,注意拉伸方向。我习惯在z=0的衬底表面向上拉伸,这样纳米砖直接“坐”在衬底上,不需要额外做布尔运算。这里有一个非常容易踩的坑:工作平面中的草图尺寸单位可能和全局单位不一致。在属性栏中输入表达式时,务必带上单位后缀,例如(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等。单位必须写清楚,比如p=300[nm],如果不写,Comsol会用全局单位,后续改起来容易乱。

第三步:几何。不建议用几个分块拼凑的方式,容易在界面处产生网格不连续。我的习惯是:先建一个长方体,整体尺寸为300×300×(600+50+300+衬底厚度)纳米,然后用“分割面”功能在z=50 nm和z=50+衬底厚度处把区域分成空气层、衬底层,再用工作平面画矩形并拉伸形成纳米砖。这样最终的几何域边界都是共面的,网格划分时不容易出错。

第四步:材料。空气材料、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。前期觉得占空间,后期写论文补充材料的时候,这些图真的能救命。至于很多同学问的“网格画到多细才保险”,我的经验是:先用默认网格单频点算通,再针对关注频段细化,效率最高,不要一上来就全局加密。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询