漂移–扩散求解器配置
可以通过在电学功能区中选择 配置 来配置漂移–扩散求解器。 这将打开求解器配置窗口,在其中可以调整迭代次数上限、误差容限以及收敛策略等数值属性。 这些选项使用户能够针对不同器件仿真控制求解器的性能和稳定性。
配置电学求解器
OghmaNano 的电学引擎求解一组紧密耦合的非线性方程(泊松方程 + 漂移–扩散方程, 以及任何已启用的动力学过程)。这些方程包含指数项并具有强耦合性, 因此通过在单一全局雅可比矩阵上使用牛顿–拉夫森方法进行迭代求解。 通常不需要更改默认设置,但配置面板允许您稳定困难算例、加速简单算例, 或检查数值行为。
通过进入 电学 选项卡,选择 漂移–扩散,然后点击 配置 来打开配置界面 — 参见 DD Solver Open。 这将弹出如 DD Solver Window 所示的窗口,在其中可以调整求解器的迭代和收敛方式。
各个部分的作用
该面板分为四个主要模块,分别控制运行的不同阶段: 首次迭代、后续迭代、电压扫描 和 退出策略。 在所有阶段,核心思想都是一致的:从一个初始猜测开始, 使用牛顿步更新未知量,并在全局误差足够小时停止。 限制因子(clamp) 用于限制每一步的最大更新量, 以防止求解器跳入非物理区域。 较小的限制因子 → 更慢但非常稳定;较大的限制因子 → 更快但可能不稳定。
首次迭代
- 最大电学迭代次数(首次步骤) — 第一次求解(通常在暗态 0 V 下)的牛顿步数上限。 对于困难的冷启动,较大的上限有助于收敛。
- 电学限制因子(首次步骤) — 缩放首次步骤中牛顿更新的最大幅度。 经验法则:0.1 非常安全(但较慢),1.0 是良好的默认值, ≥2.0 可能很快但稳定性较差。
- 期望的求解器误差(首次步骤) — 首次求解的收敛目标(越小越精确但越慢)。 典型可接受值不应差于 \(1\times10^{-5}\); 为了稳健启动,可设为 \(1\times10^{-8}\)–\(1\times10^{-9}\)。
后续迭代
- 最大电学迭代次数 — 首次之后所有求解步骤的迭代次数上限。
- 电学限制因子 — 与上类似,但应用于除首次步骤之外的所有步骤。 通常可以相对于首次步骤放宽以提高速度。
- 期望的求解器误差 — 常规步骤的收敛目标。 根据精度需求设置;\(1\times10^{-6}\)–\(1\times10^{-8}\) 很常见。
电压扫描
当从初始偏压(例如 0 V)扫描到目标工作点(可能是高电压)时, 中间的求解通常只是过渡点。 该模块允许在扫描过程中使用更宽松的容限或不同的限制因子, 以更快地完成扫描,同时在最终工作点保持严格的求解条件。
- 最大电学迭代次数(扫描) — 每个扫描步骤的迭代上限。
- 电学限制因子(扫描) — 扫描过程中的步长控制。
- 期望的求解器误差(扫描) — 仅用于扫描步骤的收敛目标。
- 牛顿最小迭代次数 — 强制至少执行指定次数的迭代, 以避免仅因初始残差较小而过早退出。
退出策略
- 牛顿求解器智能退出 — 如果残差在噪声范围内上下波动且无明显趋势, 则停止迭代并接受当前最优状态。
- 在牛顿求解器中求解基尔霍夫电流定律 — 将 KCL 约束直接纳入雅可比矩阵,以获得更严格的电流连续性。
- 在收敛问题时退出 / 在费米能级反转时退出 — 对明显不良状态的强制停止保护。
求解器类型与工具
- 使用的牛顿求解器 — 选择算法:
none— 不进行电学求解(仅光学/热学)。newton— 标准一维牛顿求解器。
- 矩阵求解器 / 复数矩阵求解器 — 选择线性求解器后端。
- Slotboom T0 / D0 / n0 —
newtonnorm的参数。 - 使用牛顿缓存(实验性) — 将大型中间数据写入磁盘以减轻内存压力(实验性)。
- 求解器输出详细程度 — 控制打印的进度信息量。
实践建议
如果算例较为敏感(高掺杂、极端电场、强注入), 请降低限制因子并收紧首次步骤的容差。 对于简单、行为良好的算例,可提高限制因子以加快速度。 使用扫描模块快速到达工作点,然后在该点施加更严格的容差。
另请参见: DD Solver Open 中显示的配置入口,以及 DD Solver Window 中的完整对话框。
求解器稳定性
OghmaNano 是一个数值模拟器,用于求解电荷、势能和复合过程的一组紧密耦合的微分方程。 与任何数值求解器一样,它需要物理上合理的输入参数才能成功收敛。 精确为零、无限大,或跨越过多数量级的数值 都会导致底层矩阵运算不稳定。 为帮助您避免这些问题,本节强调在配置仿真时的一些实际注意事项。
避免非常大的数和非常小的数
打开 MATLAB(或 Linux 上的 Octave),并输入以下表达式: \(((1e-1+1e1)-1e1)/1e-1\)。 在按下回车之前,先在脑中计算: \(1e1\) 和 \(-1e1\) 相互抵消, 剩下 \(\frac{1e-1}{1e-1}=1\)。 现在将 10 的指数替换为 19,再尝试: \(((1e-19+1e19)-1e19)/1e-19\)。 在纸面计算中,结果同样应为 \(1\)。
然而,当让计算机计算时,结果将是 \(0\),而不是 \(1\)。 这是因为计算机以有限精度存储数字 (现代机器大约为 15–16 位十进制有效数字)。 当你将 \(1e-19\) 加到 \(1e19\) 上时, 较小的项在舍入中被丢失, 计算机看到的是 \(1.000000000000000e19\), 而不是 \(1.0000000000000000001e19\)。 随后减去 \(1e19\) 得到精确的零, \(1e-19\) 的贡献因此消失。
数值精度很重要
如果仿真参数跨越过多数量级, 求解器可能会失去精度。 尽量避免极端比例, 尤其是在迁移率或态密度中, 以确保稳定性。
无论计算机多么强大,都会受到这一限制的影响。 对于器件仿真而言,这意味着应避免 在同一矩阵中同时出现非常大的数和非常小的数。 例如,将 \(1e-19\) 的迁移率 与 \(1e5\) 并列, 会导致数值困难。 在模拟绝缘体时这一点尤为重要。
避免零值
零值会导致除零错误。 不要将迁移率、俘获截面、尾态斜率 或态密度设置为精确的零。 对于复合常数,使用零是可以的。
⚠️ 避免精确为零
用非常小的数值(例如 \(1e-30\)) 替代零,以防止数值不稳定, 同时仍然近似“几乎为零”。
带隙中的过大步长
带隙中的大能量步长会产生 极小或极大的载流子浓度, 这会直接导致 避免非常大的数和非常小的数 中描述的精度问题。 保持能量离散足够精细, 以避免非物理跳变。
🔍 检查您的网格
如果带隙离散过于粗糙, 可能会生成非物理的载流子浓度。 请细化网格, 使数值保持在数值稳定的范围内。