这里会显示出您选择的修订版和当前版本之间的差别。
两侧同时换到之前的修订记录前一修订版后一修订版 | 前一修订版 | ||
atk:器件体系negf计算收敛指南 [2020/06/01 21:53] – [7.提高围道积分的精度] xie.congwei | atk:器件体系negf计算收敛指南 [2020/06/01 22:06] (当前版本) – [参考] xie.congwei | ||
---|---|---|---|
行 128: | 行 128: | ||
图193 使用半圆轮廓时的轮廓积分的草图。有关更多详细信息,请参见手册页。 | 图193 使用半圆轮廓时的轮廓积分的草图。有关更多详细信息,请参见手册页。 | ||
==== 8.尝试一个新的泊松求解器 ==== | ==== 8.尝试一个新的泊松求解器 ==== | ||
+ | |||
+ | 更改 Poisson 求解器也可以帮助收敛,例如从 '' | ||
==== 9.增大网格密度截断能量 ==== | ==== 9.增大网格密度截断能量 ==== | ||
+ | |||
+ | 零偏压计算的最后一项检查是密度网格截断。与横向的 k 点一样,它应该足够高以提供正确的物理结果。确保就感兴趣的量进行适当收敛也将有助于收敛。下图我们展示了费米能级随网格截段的变化而变化,可以看出非常低的网格截断在确定费米能级时会带来不准确性。然而还要注意,此图和上文与 k 点有关的那个图在比例上的差异。 | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | 图194 计算的费米能级与网格截断的关系。 | ||
===== 有限偏压 NEGF 计算 ===== | ===== 有限偏压 NEGF 计算 ===== | ||
+ | |||
+ | 通常情况下,有限偏压的计算要比零偏压更难收敛,以上所有要点也适用于这种情况。但还有另一件事可以尝试,将在下一章节中进行说明,并且如果零偏压计算能够很好地收敛时,则应该首先尝试一下。 | ||
==== 1.总是从收敛的计算重启 ==== | ==== 1.总是从收敛的计算重启 ==== | ||
+ | |||
+ | 有限偏压计算应始终从较小偏压或零偏压的收敛计算中重新开始。如果不收敛,它通常将有助于减小偏压差异。例如您想要从零偏压开始进行 0.4 V 的计算,最好的方法是逐步计算,比如以 0.1 V 为步长。以下示例脚本可以完全做到这一点:[[https:// | ||
+ | |||
+ | <code python> | ||
+ | # Set bias | ||
+ | # Positive: Forward | ||
+ | # Negative: Reverse | ||
+ | |||
+ | bias_list = [0.10, 0.20, 0.30, 0.40]*Volt | ||
+ | |||
+ | # Read DeviceConfiguration | ||
+ | zero_bias_file = ' | ||
+ | device_configuration = nlread(zero_bias_file, | ||
+ | |||
+ | for bias in bias_list: | ||
+ | if processIsMaster(): | ||
+ | print(" | ||
+ | # Get the calculator | ||
+ | calculator = device_configuration.calculator() | ||
+ | |||
+ | # Set the bias voltage | ||
+ | calculator=calculator(electrode_voltages=(bias/ | ||
+ | |||
+ | # Attach the calculator and use the old initial state | ||
+ | device_configuration.setCalculator( | ||
+ | calculator(), | ||
+ | initial_state=device_configuration) | ||
+ | device_configuration.update() | ||
+ | nlsave(' | ||
+ | </ | ||
+ | |||
+ | 这种方法对于较高偏压会变得更重要,因为可能需要更短的增量才能实现收敛。因此在上述情况下,也许 0.1 V 和 0.2 V 时收敛,但 0.3 V 时不会。建议尝试 0.25 V,从 0.2 V 开始以 0.05 V 递进。当然,这种方法是否可行取决于所研究的系统以及您希望实现的最终目标。 | ||
+ | |||
===== SCF 迭代控制参数 ===== | ===== SCF 迭代控制参数 ===== | ||
+ | |||
+ | 如果您已经验证了 NEGF 计算中使用的**物理模型**是合理且适当的(请参阅上文),但计算仍然无法收敛,那么最后一个选择就是调整控制 SCF 循环的参数。 | ||
+ | |||
+ | SCF 参数在 **ATK Python** 的 '' | ||
+ | |||
+ | {{ : | ||
==== 1.最大步数 ==== | ==== 1.最大步数 ==== | ||
+ | |||
+ | 即使是稳健且表现良好的 NEGF 计算,有时朝着基态收敛的速度也会比预期的慢,因此可能需要额外的 SCF 步骤才能正确收敛。 | ||
+ | |||
+ | 在这种情况下,只需增加参数 **Maximum steps**。 | ||
+ | |||
+ | 然而,首先要从失败的计算中查阅 QuantumATK 的日志文件,确认 SCF 循环实际上是否运行良好,即是否收敛到了< | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
=== 什么是合理的基态? === | === 什么是合理的基态? === | ||
+ | |||
+ | 首先,**能带能量**和**哈密顿矩阵元素**都应稳定地收敛于恒定值。检查 ATK 日志文件:在每次 SCF 迭代之后查找报告能带能量 '' | ||
+ | |||
+ | <code python> | ||
+ | user@machine $ grep dE atk.log | ||
+ | | 0 E = -70.6148 dE = 5.719151e-01 dH = 7.266251e-01 | ||
+ | | 1 E = -56.8671 dE = 1.374766e+01 dH = 5.675282e-01 | ||
+ | | 2 E = -58.5695 dE = 1.702319e+00 dH = 1.737177e-01 | ||
+ | | 3 E = -59.6745 dE = 1.105067e+00 dH = 9.875918e-02 | ||
+ | | 4 E = -59.3529 dE = 3.216787e-01 dH = 4.048304e-02 | ||
+ | | 5 E = -59.0695 dE = 2.833359e-01 dH = 2.447425e-02 | ||
+ | | 6 E = -59.2082 dE = 1.386839e-01 dH = 2.978777e-03 | ||
+ | | 7 E = -59.0397 dE = 1.684759e-01 dH = 1.492602e-02 | ||
+ | | 8 E = -59.078 dE = 3.826926e-02 dH = 1.691435e-03 | ||
+ | | 9 E = | ||
+ | | 10 E = -59.0559 dE = 5.931576e-03 dH = 1.624175e-03 | ||
+ | | 11 E = -59.0553 dE = 6.427625e-04 dH = 2.825693e-04 | ||
+ | | 12 E = -59.0543 dE = 1.008929e-03 dH = 1.880459e-04 | ||
+ | | 13 E = -59.0542 dE = 1.964723e-05 dH = 6.034241e-05 | ||
+ | </ | ||
+ | |||
+ | * 能量和哈密顿量的差 '' | ||
+ | * 能量可能会在 SCF 循环的开始时振荡,但最终应会收敛到恒定值。 | ||
+ | |||
+ | 其次 **Mulliken populations**(马利肯布居数)应在物理上合理。检查 ATK 日志文件中最近几次 SCF 迭代的 //Density Matrix Report// 。针对每个原子,报告了 '' | ||
+ | |||
+ | - 在相同局部环境中的原子应具有大致相同的占有率。 | ||
+ | - 变化应该是系统的和物理的,例如在氧化物中,我们期望氧原子上有多余的电子,而更多带正电性邻近原子上的电子少。 | ||
+ | - 电荷不应在电极附近积累。 | ||
+ | |||
+ | 在下面的示例中,我们看到如何满足这些要求: | ||
+ | |||
+ | <code python> | ||
+ | +------------------------------------------------------------------------------+ | ||
+ | | Density Matrix Report | ||
+ | +------------------------------------------------------------------------------+ | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | </ | ||
+ | |||
+ | - 对于所有 Ni 原子和所有 Si 原子,Mulliken 布居数大致相同。 | ||
+ | - 我们看到所有的 Si 原子的 '' | ||
+ | - 靠近电极边界的原子(折射率最低的原子)不会显示出异常大的 Mulliken 布居数。 | ||
==== 2.Pulay 混合 ==== | ==== 2.Pulay 混合 ==== | ||
+ | |||
+ | SCF 循环使用 '' | ||
+ | |||
+ | 通常默认的 Pulay mixing 参数应该可以实现快速、稳定的 SCF 收敛,但有时可以进行一些调整: | ||
+ | |||
+ | * 首先尝试将 **Damping factor** 减小到 0.05 或者甚至 0.01。对于费米能级的金属态尤其有帮助。 | ||
+ | * 增加 **History steps** 的数量可能会稍微改善收敛性,但也会增加内存消耗。 | ||
==== 3.公差 ==== | ==== 3.公差 ==== | ||
+ | |||
+ | SCF 循环将会一直持续至达到精度公差或最大步数为止。该公差是对总能带能量和哈密顿矩阵元素都进行测量的——在两种情况下,一个 SCF 步骤与另一个 SCF 步骤之间的绝对差都必须低于指定的公差,以使计算被认为是准确和收敛的。 | ||
+ | |||
+ | * 在极少数情况下,可能需要将 **Tolerance** 增大到默认值以上才能使 NEGF 计算收敛,但是这也会导致产生不准确的基态。// | ||
===== 联系支持 ===== | ===== 联系支持 ===== | ||
+ | |||
+ | 如果任何尝试都失败了,请在在线 QuantumATK 论坛(https:// | ||
===== 参考 ===== | ===== 参考 ===== | ||
+ | |||
+ | * 英文原文:https:// |