单个.json文件可以包含多组光栅仿真数据。基本原理是定义一个网格点阵,并为每个点分配一个索引。当光线在特定空间位置与光栅相交时,Zemax和Speos等光线追迹软件会根据光线在表面上的位置匹配对应的衍射级次。
该功能主要用于仿真平滑渐变的光栅。如果光线入射到多个网格点之间的位置,软件会根据邻近网格点的响应(如衍射级次的方向或效率)做线性插值(可关闭)。因此,对于线性变化(或完全无变化)的区域,只需定义该区域端点处的响应,而对于变化非常块的区域,则需要提供大量数据点以提高采样精度。
每种光栅变体,都可以完全自定义其参数(周期、材料、高度、占空比等)。
自2026 R1.1 版本起,软件新增脚本命令lmapexport(详见文末链接[1]),用于导出.lswm 与.lmap 文件。
如何使用RCWA求解器生成.lswm和.lmap文件
该工作流程中最复杂的环节是生成包含完整空间信息的.json文件,具体步骤如下:
1.定义采样点网格
2.定义索引映射
3.定义倒格矢
4.用RCWA求解器计算响应并生成.json文件
定义采样点网格
生成数据的第一步是定义空间变化的点阵映射。构建空间渐变映射有三种方式:
定义索引映射
每个网格点都标注一个0至M的索引,M是小于等于空间映射中定义的网格点数的整数。如果多个点具有相同的索引,则表示这些位置使用相同的光栅。
如果索引设置为0(或任何小于1的值),则表示该位置没有光栅,光线交互将遵循菲涅耳定律。

注意,采样必须是规则的矩形点阵。若要定义非矩形区域,可将光栅区域外点的索引设为 0。
定义倒格矢
.json 文件不包含光栅的具体结构信息(如高度、占空比、倾斜角),它只包含由 RCWA 计算得到的一组响应。但需要指定光栅周期,以便进行数据读取的光线追迹软件(Ansys Zemax OpticStudio 或 Ansys Speos)得到给定衍射级次效率的同时,还能确定其传播方向。因此,除了索引之外,还需要为每个网格点提供定义光栅周期和方向的倒格矢。文件支持二维光栅,在每个点处可以提供两个倒格矢,并分别标记为1和2。对于一维光栅,第二个矢量可以简单地设为 0。

使用RCWA求解器计算响应并生成.json文件
对于无空间变化的简单情况,可以直接右键点击 RCWA 结果将其导出为.json文件。在定义了空间变化的情况下,RCWA求解器需多次运行,针对前述不同索引定义的每种光栅变体都进行一次求解。附件中提供了一些示例脚本,可用作模板。
以下是脚本中需要设置的参数列表:
空间映射
spatial_variation_or_parameter_scan.pos_x # 大小为 1 x N1 的向量
spatial_variation_or_parameter_scan.pos_y # 大小为 1 x N2 的向量
spatial_variation_or_parameter_scan.pos_rad # 大小为 1 x N1 的向量
spatial_variation_or_parameter_scan.pos_pol # 大小为 1 x N2 的向量
spatial_variation_or_parameter_scan.par_1 # 大小为 1 x N1 的向量
spatial_variation_or_parameter_scan.par_1_name # 字符串
spatial_variation_or_parameter_scan.par_2 # 大小为 1 x N2 的向量
spatial_variation_or_parameter_scan.par_2_name # 字符串
索引映射
倒格矢
M是spatial_variation_or_parameter_scan.index_map中的最大索引编号。
注意,即使光栅没有周期变化(仅其他参数渐变或无渐变),也必须将倒格矢复制到矩阵中,使其保持M行。
还需要注意,不同光栅变体在RCWA中的输出级次可能不同(例如,某种情况下存在+2级次,但另一种情况下不存在),但每种光栅的运行数据集应具有相同大小。下文示例的仿真脚本中,指定了读取级次列表,以确保所有数据集维度一致。
在Ansys Zemax OpticStudio中的使用
在OpticStudio中的使用方法与无空间渐变的情况类似,从下拉列表中选择.json文件即可。更多信息请参阅Lumerical亚波长模型在Zemax OpticStudio中的使用(详见文末链接[2])。具有空间变化的.json文件需要2024.R2.2及更高版本的DLL。相比旧版本,新的DLL增加了一些额外参数:

' fill='%23FFFFFF'%3E%3Crect x='249' y='126' width='1' height='1'%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E)
随机模式(Stochastic Mode):以随机模式追迹光线,而非将光线分裂为多条光线。
测试模式(Test Mode):此变量用于故障排除。可以设置为不同的值,以在日志文件中输出不同级别的信息。日志文件生成在 Zemax DLL 衍射文件夹中,.json文件也位于该文件夹。
光栅旋转(Rotate Grating):启用后可将光栅旋转指定角度(单位为度)。
检查环境折射率(Check Environment index):这是一个标志位,用于避免在与RCWA 表征环境不同的配置中使用光栅。如果设为 1,Zemax OpticStudio中定义的材料折射率将与.json文件中写入的材料折射率进行比较。如果两者不同,光线追迹将报错。
参数扫描1和2(Parameter Scan 1 and 2):选择自定义方法定义时使用的参数。允许直接从.json文件中调用所需的索引。
禁用插值(No Interpolation):此变量用于关闭插值功能。此时,将使用最近的定义点来确定任意给定位置的光栅参数。根据该参数的输入值,可以停用不同级别的插值:
0:插值开启
+1:禁用波长插值
+2:禁用角度插值
+4:禁用空间 (xy) 插值
例如,如果设为6,则禁用角度和空间插值。设置为7表示完全禁用插值。注意,插值标志可以直接在文件中设置,但可能会被此参数覆盖。
在Ansys Speos中,没有像Zemax OpticStudio中那样用于设置插值标志的额外参数。如果要在Speos中开启或关闭插值,应直接在文件中设置插值标志。
以下是开启和关闭插值的标志列表。默认情况下,所有插值均开启。
polarization_interpolate_over_theta_ux_kx
polarization_interpolate_over_phi_uy_ky
polarization_interpolate_over_wavelength
polarization_interpolate_over_spatial_paramete
在文件中将polarization_interpolate_over_spatial_parameter设为False/0,可以关闭插值。更多信息请参阅Lumerical亚波长模型在Speos中的使用(详见文末链接[3])。
注意,使用空间变化时,是在表面的指定空间区域内定义光栅,无法使用UV映射对其进行缩放或旋转,但可以通过手动旋转附着于表面的坐标系来改变光栅方向。
如何使用RCWA求解器生成.lswm和.lmap文件
按照以下步骤从RCWA求解器中,以.lswm格式导出扫描结果:
常规设置RCWA仿真:
在RCWA设置的General选项卡中,设置传播方向为双向(both)。
在RCWA设置的Results选项卡中,启用报告光栅特征(report grating characterization)选项、。
在扫描结果中添加report grating characterization和substrate。

右键点击扫描,选择“Export to LSWM”。此时会弹出对话框。
在对话框中,有若干选项需用户自行设置:
- Lattice angle (degrees):RCWA 几何选项卡中所用的晶格角。
- Backward definition:与RCWA General页定义一致。
- Lossless:默认值为否。包层或者衬底无损耗时,启用该选项。
- Interpolate over incident angle:默认值为否。启动该选项可启动入射角度的线性插值响应。
- Interpolate over incident wavelength:默认值为否。启动该选项可启动波长点的线性插值响应。
- Truncate order:默认值为否。启用此选项可启用光栅级次截断。设置为否时,所有衍射级次都会保留,如果启用则需要提供衍射级次的最大和最小值。
- Polarization interpolation basis:在导入LSWM文件时,设置用于极化插值的基础信息,可选SP、XY和Auto。
- Resampling parameter:选择要重采样的参数以及重采样的点数,重采样的点数必须是大于2的整数值。在所有的重采样选项中,只能选择一个参数进行。
选择LSWM文件的生成路径和名称,可以编辑文本框或使用另存为按钮打开文件对话框来完成。
点击OK以保存文件。
此外,也可以使用lswmexport脚本命令(详见文末链接[4])。下面是使用脚本导入.lswm文件的示例:
lswmFile="export_sweep.lswm";
span = [getnamed("RCWA","x span"), getnamed("RCWA","y span"),getnamed("RCWA","z span")];
latticeVectorAngle = getnamed("RCWA","lattice vector angle");
grating_characterization = getsweepresult("sweep","grating_characterization");
substrate = getsweepresult("sweep","substrate");
lswmexport({"grating_characterization":grating_characterization, "substrate":substrate,"lattice_angle":latticeVectorAngle, "mirror_k_vector":1,"span":span},lswmFile,{"polarization_interpolation_basis":"AUTO","truncate_order":true,"truncate_order_min":-1, "truncate_order_max":1, "lossless":1});
生成.lmap文件
生成包含所有所需空间信息的.lmap文件的步骤如下:
1. 定义采样点网格
2. 定义索引指标
3. 生成包含索引映射的LMAP文件
定义采样点网格
第一步是为空间变化定义一个点分布图,构建空间变化分布图有两种选择:
定义索引映射
每个网格点都标有从-1到M-1的索引,其中M为扫描点的数量。如果多个点拥有相同的索引,则说明这些点用了相同的光栅。如果某个索引设置为-1(或者任何小于0的值),则表示此位置没有光栅,光线的相互作用将应用菲尼尔定律。

注意采样需要规则的矩形网格点,如要定义非矩形区域,需要将光栅外点的索引设置为-1。也可以使用嵌套扫描来改变多个参数,比如除了光栅的倾斜角之外还希望改变占空比,扫描应如下设置:

如果占空比在0.2到0.8之间变化,倾斜角度在10°到60°之间变化,则嵌套参数列表如下图所示:
定义了索引图后,可以使用lmapexport命令(详见文末链接[1])来导出LMAP文件。
下面为一个以极坐标形式导出LMAP的示例:
map_type = "polar";
lswmFile = "1D_slant_polar.lswm";
cellTypeMap = [ 0,0,0,0,0,0,0,0,0;1,1,1,1,1,1,1,1,1;2,2,2,2,2,2,2,2,2;3,3,3,3,3,3,3,3,3]; #dim1: R from to size_R // dim2: phi from -180 to 180
size_R = 2; #maximum radius size
interpolate_over_spatial_coordinate = true;
spatialInfo = {"size_R":size_R};
mapInfo = {"map_type":map_type, "spatial_info":spatialInfo, "cell_type_map":cellTypeMap};
lmapexport(lswmFile,mapInfo,interpolate_over_spatial_coordinate);
示例1:XY直角坐标系的简单映射
使用Ansys Zemax OpticStudio
该示例的json文件使用脚本文件生成。之后打开对应的Zemax工程文件仿真其在光线追踪环境下的表现。
用4个点(正方形的4个角)定义一个2mm*2mm的光栅区域,在正方形的2个点上定义周期为5um的光栅,另外2个点上定义周期为9um的光栅。用于生成json文件的Lumerical脚本如下:

脚本同样包括针对这两种情况运行RCWA并将结果写入json文件的部分。在Zemax OpticStudio中可以查看的结果如下所示:

使用Ansys Speos
json文件同样可以被Speos读取。打开对应的Speos工程文件,在仿真选项卡中,确保在Surface_json属性中选中了.sop和.json文件,之后运行Direct_Normal_Source仿真。

示例2:极坐标系的简单映射
该示例的json文件使用脚本文件生成。之后打开对应的Zemax工程文件仿真其在光线追踪环境下的表现。
该示例中,定义了沿径向2mm的渐变。由于只考虑一个角度,该变化将以类似的方式在所有极角上产生,即该渐变旋转对称。

示例3:高级映射
该示例的json文件使用脚本文件生成。之后打开对应的Zemax工程文件仿真其在光线追踪环境下的表现。
该示例中,展示了如何使用XY直角坐标系网格定义非矩形的光栅区域,基本思路将所需光栅区域外的所有点的索引定义为0。

示例4:使用RCWA中的LSWM和LMAP文件进行简单的地图导出
该示例中使用了倾斜光栅,对光栅的倾斜角度在10°至60°范围内以1°的步长进行扫描。波导内的中心传播角度约为51°。
预计倾斜角约为10°时,+1级次的Tss达到最大值。

使用倾斜光栅作为耦入光栅,设置并运行后右键单击RCWA结果中的‘grating_characterization’并导出LSWM文件。在对话框中将插值设置为‘true’并截断数据只保留±1和0阶衍射结果。此时,光栅未考虑空间变化。

对于耦出光栅,需要扫描其倾斜角度,因此文件要从扫描结果中导出。运行扫描后单击扫描对象,并将结果导出为LSWM文件。弹出对话框中的设置与前述相同。

如要生成LMAP文件,则需与脚本配合。可以使用lmapexport脚本命令生成空间变化的映射。如下图,该映射在一个方向上定义了倾斜角度的变化,在另一个方向上则没有变化。

在Zemax中的设置
首先,将所有的.lswm和.lmap文件以及提供的 lumerical-sub-wavelength-2026R1.dll 复制到 Zemax>>DLL>>diffractive 文件夹中。
耦出光栅独立验证
首先独立验证耦出光栅的表现,光栅设置如下:


注意,只需要选择.lswm文件。动态链接库(DLL)会自动查找同名的.lmap文件,如果未找到与.lswm文件同名的映射文件,则不存在空间变化。
完整的系统验证
在最后的系统中,我们有耦入光栅和耦出光栅。
首先,如果我们对耦入和耦出光栅都不设置空间变化,此时的仿真结果如图:
