Appearance
SProcess Ch14:数值计算
> 来源:sprocess_ug.pdf(Sentaurus Process User Guide, W-2024.09) > 章节范围:Chapter 14,文档目录页标注约 p.974–990(PDF 物理页约 974–990)
章节导读
本章讨论 Sentaurus Process 中的数值相关问题、时间积分方法和线性求解器。
14.1 概述
在 Sentaurus Process 中,仿真扩散步骤时需要求解不同的非线性偏微分方程组:
- 氧化剂扩散和反应
- 掺杂剂扩散和反应
- 应力方程
对于硅化,溶解硅或溶解金属的传输和反应处理方式与氧化剂扩散和反应类似。
氧化剂、掺杂剂和点缺陷方程使用梯形规则/后向差分公式(TRBDF)时间离散化、有限体积(box)方法进行空间积分,以及牛顿方法求解非线性方程进行求解。
对于非线性应力方程的离散化,使用分段线性有限元。如果跟踪应力历史,应力方程不仅在扩散步骤仿真期间求解,而且在蚀刻和沉积步骤结束时求解。
Sentaurus Process 集成了多种直接求解器和迭代求解器,以在每个牛顿迭代中求解大型线性方程组。默认情况下,对于 1D 仿真中的所有方程,使用并行直接求解器 PARDISO。对于二维扩散方程和三维仿真的所有方程,使用迭代求解器 ILS。可以使用 math 命令选择求解器:
tcl
math ils此命令为 1D、2D 和 3D 中的所有类型方程选择求解器 ILS。可以为各种空间维度和力学方程的求解进行单独选择。
14.2 设置迭代求解器 ILS 参数
迭代求解器 ILS 默认用于求解 2D 仿真中 diffuse 的线性系统,以及 3D 仿真中 Flow 和 diffuse 的线性系统。ILS 的默认参数已添加到参数数据库中。要为 ILS 指定修改后的参数(如迭代方案类型、迭代次数、输出详细程度或内存资源),请使用 pdbSet 命令。
> 注意: > 在 pdbSet 命令中,必须为每种类型的问题(Flow 或 diffuse)和每个维度(1D、2D 或 3D)单独指定参数。 > 不推荐在 1D 仿真中使用 ILS,因为 1D 情况下矩阵结构简单。默认直接求解器 PARDISO 是 1D 仿真的正确选择。
可以为 diffuse 和 Flow 在 2D 或 3D 中指定不同的 ILS 参数。通常,ILS 参数的 pdbSet 命令形式为:
tcl
pdbSet Math [diffuse | Flow] [2D | 3D] ILS.[command] [value]以下 ILS 命令可用:
| ILS 命令 | 类型 |
|---|---|
| ILS.compact | Boolean |
| ILS.fgmres.restart | Double |
| ILS.gmres.restart | Double |
| ILS.fit | Double |
| ILS.ilut.tau | Double |
| ILS.leftPreconditioner | Boolean |
| ILS.maxit | Double |
| ILS.method | String |
| ILS.nonsymmOrdering | String |
| ILS.okayForModNewton | Boolean |
| ILS.preconditioner | String |
| ILS.recompute.ordering | Double |
| ILS.refine.residual | Double |
| ILS.refine.iterate | Double |
| ILS.scaling | String |
| ILS.symmOrdering | String |
| ILS.tolabs | Double |
| ILS.tolrel | Double |
| ILS.tolunprec | Double |
| ILS.useILSRCFile | Boolean |
| ILS.verbose | Double |
例如,要选择 GMRES 方法,例如 gmres(60),请使用:
tcl
pdbSet Math diffuse 3D ILS.method gmres
pdbSet Math diffuse 3D ILS.gmres.restart 60要指定 FlexibleGMRES 方法,例如 fgmres(40),以求解应力方程,请使用:
tcl
pdbSet Math Flow 3D ILS.method fgmres
pdbSet Math Flow 3D ILS.fgmres.restart 40
pdbSet Math Flow 3D ILS.fit 5高性能计算选项
要选择高效的重用模式(在每个 3D diffuse 时间步上,仅对第一个雅可比系统应用昂贵的重排序),请指定:
tcl
pdbSet Math diffuse 3D ILS.recompute.ordering 2要返回每个系统重排序,请使用:
tcl
pdbSet Math diffuse 3D ILS.recompute.ordering 1要提高迭代线性求解器的精度和收敛性,请使用增强选项指定(默认值为 0):
tcl
pdbSet Math [diffuse | Flow] [2D | 3D] ILS.refine.iterate 1力学求解器
要选择力学求解器,2D 使用 STS2 或 STCG2,3D 使用 STS3 或 STCG3,例如 sts3:
tcl
pdbSet Math Flow 3D ILS.method sts3
pdbSet Math Flow 3D ILS.tolrel 1e-10
pdbSet Math Flow 3D ILS.ilut.tau 5e-4
pdbSet Math Flow 3D ILS.scaling diagsym
pdbSet Math Flow 3D ILS.nonsymmOrdering none对于力学求解器 STS2、STS3、STCG2 和 STCG3,必须将 ILS.scaling 指定为 diagsym,并将 ILS.nonsymmOrdering 指定为 none。建议还将参数 ILS.ilut.tau 的值指定在 5×10⁻⁴ – 5×10⁻⁵ 范围内。
14.3 分区与并行矩阵组装
Sentaurus Process 可以在多核机器上并行组装扩散和力学矩阵。要开启并行组装,请使用:
tcl
math numThreads=<i> | numThreadsAssembly=<i>其中 numThreads 是矩阵组装期间使用的线程数。numThreads 是一个通用关键字,由注入和线性求解器使用。如果要为扩散矩阵组装使用不同数量的线程,请使用关键字 numThreadsAssembly。
要修改线程栈大小,请使用:
tcl
math threadStackSize=<i>> 注意: > 默认情况下,仅对惰性退火执行矩阵的并行组装。建议 numThreadsAssembly 不超过计算机的实际核心数。通过指定 math reaction.multithithreading 可以为移动边界问题(如氧化和硅化)开启矩阵并行组装,这也同时开启并行求解器。
分区控制
要控制分区,请使用:
tcl
math maxNumberOfDomains=<i> | NumberOfElementsPerDomain=<i>> 注意: > maxNumberOfDomains 参数是每个分区级别的最大域数。建议 maxNumberOfDomains 等于或大于使用的线程数。NumberOfElementsPerDomain 参数是每个域应包含的元素数。
每个级别的最终域数由以下公式确定:
材料分区权重
要基于材料类型分区网格,请使用以下命令为每种材料赋予权重:
tcl
pdbSetDouble <material> PartitionWeight <n>例如:
tcl
pdbSetDouble Silicon PartitionWeight 10
pdbSetDouble Gas PartitionWeight 0这在分区期间为硅网格元素赋予比气体网格元素更多的权重。
力学组装的分区权重可以使用以下命令单独指定:
tcl
pdbSetDouble <material> Mechanics PartitionWeight <n>14.4 数值精度与结果可重复性
Sentaurus Process 仿真可能因不同硬件或操作系统、其内置库、不同操作顺序和不同舍入而显示不同结果。
Sentaurus Process 区分以下类型的可重现性结果(在串行模式下):
- Run-to-Run:在同一机器配置(相同 CPU、相同操作系统版本等)上多次执行仿真
- OS version:在同一 CPU 型号但不同操作系统版本(如 CentOS 7.3)上执行仿真
- CPU model:在不同机器上执行仿真,使用不同的 CPU(例如新一代 Intel 处理器)
在多线程模式下,仿真结果也可能因不同操作顺序和不同舍入而有所不同。
此外,最新的 Intel 处理器使用融合乘加(FMA)指令,不保证浮点运算结果的可重现性。Sentaurus Process 提供了一种控制 Intel 条件数值可重现性(CNR)的方法。参见 math 命令中的 auto 和 compatible 选项。
14.5 矩阵大小控制
扩散组装期间使用的矩阵大小基于结构中解决方案变量的数量和节点数自动确定。在大多数情况下,分配的矩阵大小是足够的。
如果矩阵大小在组装期间变得不足,矩阵大小将自动增加 10%。可以使用以下命令更改默认的 10% 值:
tcl
pdbSet Math Matrix.Size.Scale <n>其中值 <n> 应大于 1。
还可以使用以下命令增加自动确定的矩阵大小:
tcl
pdbSet Math Assembly.Matrix.Size.Scale <n>其中值 <n> 应大于 1。
> 注意: > 选择矩阵缩放值时要小心,因为较大的缩放值可能会耗尽计算机内存。
14.6 节点和方程排序
由于网格中节点的顺序默认不遵循特定顺序,相邻节点可能在内部节点列表中相距很远。顺序对小型示例(如 2D)的仿真时间可能没有太大影响,但可能会降低 3D 结果。
可以使用以下命令按网格或全局对结构中的节点进行排序:
tcl
pdbSet Math <1D | 2D | 3D> Reorder.Nodes <model>其中 <model> 是 None(默认)、Mesh 或 Global。
默认情况下,结构中方程编号的顺序基于网格。网格中每个节点从解决方案变量接收一个方程编号,并对下一个解决方案重复相同的过程。
可以使用以下命令更改顺序:
tcl
pdbSet Math <1D | 2D | 3D> Reorder.Equations <model>其中 <model> 是 None(默认)或 Solution。
14.7 时间积分
默认情况下,TRBDF 方法 [1] 用于时间相关问题的时间积分。也可以选择后向欧拉方法进行时间积分。
可以使用以下命令在方法之间切换:
tcl
math [tr_bdf | euler]一个 TRBDF 积分步骤由一个梯形步骤和一个后向差分步骤组成。使用第二个梯形解来估计局部截断误差并确定下一个时间步的大小。
局部截断误差可以使用 Milne 装置(默认方法)或分差方法估计。可以使用以下命令在方法之间切换:
tcl
math [milne | difference]时间步长函数模型
可以使用以下命令修改局部截断误差以进行下一个时间步估计:
tcl
pdbSet Math Time.Step.Function {<model>}其中 <model> 是 Damped、UnDamped 或 Linear。Damped 模型在误差大于 1.0 时对截断误差应用对数阻尼函数。UnDamped 模型不修改误差。Linear 模型在误差大于 1.0 时对截断误差应用线性阻尼函数。Linear 模型与 TSUPREM-4 匹配。
14.8 时间步控制
PDE 时间步长控制
Sentaurus Process 提供自动时间步长控制。您可以修改一些控制参数。
diffuse 命令的第一个时间步使用 diffuse 命令给出的初始时间。
在理想情况下,氧化、力学和扩散时间步彼此相等,下一个时间步按 IncreaseRatio 增加:
其中 是下一个扩散时间步, 是当前时间步, 是 IncreaseRatio。IncreaseRatio 的默认值是 2。
使用以下命令更改 IncreaseRatio:
tcl
pdbSet Diffuse IncreaseRatio {<n>}在某些情况下,理想时间步可能是解受限、网格受限或减少的:
- Solution limited:时间步缩短以减小局部截断误差;在日志文件中,此类步骤标记为 (s)
- Grid limited:时间步因网格运动而减小;在日志文件中,此类步骤标记为 (g)
- Reduced:时间步减小以防止超过氧化或力学步骤;在日志文件中,此类步骤标记为 (r)
如果未达到收敛,下一个时间步按 ReduceRatio 减小:
可以使用以下命令更改 ReduceRatio:
tcl
pdbSet Diffuse ReduceRatio {<n>}收敛信息
要获取扩散期间收敛的更多信息,请使用命令:
tcl
pdbSet Diffuse Convergence.Info <1 | 0>时间步长控制模型
可用的时间步长控制模型有:
- BPTS:使用历史中最大的先前时间步
- NGLTS:使用最新的非网格受限时间步
使用以下命令选择时间步长控制模型:
tcl
pdbSet Compute TSEM <model>其中 <model> 可以是 None、BPTS 或 NGLTS。
力学时间步长控制
仅当结构包含需要牛顿迭代的某些非线性特征时,力学的自动时间步长控制才会激活。时间步大小根据满足某些收敛标准进行调整。
收敛准则
要检查力学方程牛顿迭代的收敛性,准则有:
- Force residual(力残差)
- Energy(能量)
- Displacement(位移)
力残差准则通过将外部和内部力残差的最大范数与参考值进行比较来检查平衡满足:
能量准则通过将能量变化与参考值进行比较来检查平衡时能量最小化的满足:
位移准则通过将位移增量的最大范数与参考值进行比较来检查解精度的满足:
默认情况下,力残差和能量准则处于开启状态。位移准则可以替换能量准则。
使用以下参数激活或停用任何收敛准则:
tcl
pdbSet Mechanics Convergence.Force.Check <n>
pdbSet Mechanics Convergence.Energy.Check <n>
pdbSet Mechanics Convergence.Displacement.Check <n>其中 <n> 是 0(停用)或 1(激活)。
时间步长回退
自动时间步长回退程序在遇到以下问题时中断牛顿迭代循环并以较小的尺寸重新开始时间步:
- 收敛准则在最大牛顿迭代次数内未满足
- 解在多次迭代中收敛非常缓慢
- 解在多次迭代中发散
14.9 在 Sentaurus Workbench 中可视化仿真统计(SimStats)
仿真步骤的统计数据(如 CPU 和已用时间)(SimStats)可以作为设计实验(DoE)变量在 Sentaurus Workbench 中以表格形式可视化。
可以使用以下方式激活 SimStats 功能:
- 通过指定用户信息级别:
tcl
pdbSet Log.DOE <InfoLevel>- 通过指定单个 DoE 变量名称:
tcl
pdbSetString DOE.Var_name "SnMesh_meshing"InfoLevel 说明
| InfoLevel | DoE 变量分类 | 示例 |
|---|---|---|
| -1 或更低 | 停用 SimStats | 无输出 |
| 0 | 总仿真运行时间 | Elapsed_Time, User_Time, CPU_Time |
| 1 | InfoLevel 0 + 关键仿真步骤时间 | Mechanics_assembly_parallel_mode, Solver_Mechanics |
| 2 | InfoLevel 1 + 其他重要步骤时间 | BoxMethod, TS4Geom, SnMesh_meshing |
| 3 或更高 | 特定仿真相关的完整 DoE 变量列表 | 最详细的 SimStats 输出 |
多 #split 参数项目
对于具有多个 split 参数的项目,可以通过以下方式仅显示特定参数的 DoE 变量:
tcl
#postheader
#if "@swb_parameter@" == "Poly"
pdbSet Log.DOE 0
pdbSetString DOE.Prefix "@swb_parameter@"
#else
pdbSet Log.DOE -1
#endif
#endpostheader14.10 最小可执行示例
tcl
# ch14_min_numerics.cmd
go sprocess
# 1) 定义初始结构
line x location=0.00 spacing=0.02 tag=top
line x location=1.00 spacing=0.05 tag=bot
region silicon xlo=top xhi=bot substrate
init field=boron concentration=1e15
# 2) 设置求解器参数
math ils
pdbSet Math diffuse 3D ILS.method gmres
pdbSet Math diffuse 3D ILS.gmres.restart 60
# 3) 执行扩散
diffuse time=30 temp=900
# 4) 输出仿真统计
pdbSet Log.DOE 2
exit14.11 关键参数速查表
| 类别 | 参数/命令 | 作用 | 示例 |
|---|---|---|---|
| 选择求解器 | math ils | 选择 ILS 迭代求解器 | math ils |
| ILS 方法 | ILS.method | 选择迭代方法 | gmres/fgmres/sts3 |
| ILS 重启 | ILS.gmres.restart | GMRES 重启迭代数 | 60 |
| 并行组装 | math numThreads | 设置线程数 | numThreads=4 |
| 矩阵大小 | Matrix.Size.Scale | 矩阵大小缩放 | 1.1 |
| 节点排序 | Reorder.Nodes | 网格/全局排序 | Mesh/Global |
| 时间积分 | math tr_bdf | TRBDF 时间积分 | tr_bdf/euler |
| 收敛信息 | Convergence.Info | 输出收敛详情 | 1/0 |
14.12 常见问题与诊断步骤
问题 1:仿真收敛缓慢
诊断步骤:
- 检查 ILS 求解器参数是否适合当前问题
- 尝试使用 GMRES(60) 或 FGMES(40) 等更稳健的方法
- 调整 ILS.tolrel 和 ILS.tolabs 公差
- 考虑使用增强的重新排序选项
问题 2:矩阵组装内存不足
诊断步骤:
- 减小
NumberOfElementsPerDomain值 - 增加
Matrix.Size.Scale值(但要注意内存消耗) - 减少
numThreads线程数
问题 3:结果不可重现
诊断步骤:
- 检查是否使用
math auto或math compatible选项 - 确认硬件和操作系统版本相同
- 在单线程模式下运行以排除线程顺序问题
参考文献
[1] R. E. Bank et al., "Transient Simulation of Silicon Devices and Circuits," IEEE Transactions on Electron Devices, vol. ED-32, no. 10, pp. 1992–2007, 1985.
[2] O. C. Zienkiewicz and R. L. Taylor, The Finite Element Method, Butterworth-Heinemann: Oxford, 5th ed., 2000.
[3] K. J. Bathe and A. P. Cimento, "Some Practical Procedures for the Solution of Nonlinear Finite Element Equations," Computer Methods in Applied Mechanics and Engineering, vol. 22, no. 1, pp. 59–85, 1980.