用户工具

站点工具


atk:器件体系negf计算收敛指南

差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

两侧同时换到之前的修订记录前一修订版
后一修订版
前一修订版
atk:器件体系negf计算收敛指南 [2020/06/01 21:54] – [8.尝试一个新的泊松求解器] xie.congweiatk:器件体系negf计算收敛指南 [2020/06/01 22:06] (当前版本) – [参考] xie.congwei
行 131: 行 131:
 更改 Poisson 求解器也可以帮助收敛,例如从 ''MultigridSolver'' 到 ''ParallelConjugateGradientSolver'',因为它们使用了不同的数值方法。这意味着计算得出的静电中的数值噪声将有所不同,这反过来又会影响具有更复杂静电系统(例如栅)的收敛。还要注意,对于并行运行的大型计算,''ParallelConjugateGradientSolver'' 通常会更快一些。 更改 Poisson 求解器也可以帮助收敛,例如从 ''MultigridSolver'' 到 ''ParallelConjugateGradientSolver'',因为它们使用了不同的数值方法。这意味着计算得出的静电中的数值噪声将有所不同,这反过来又会影响具有更复杂静电系统(例如栅)的收敛。还要注意,对于并行运行的大型计算,''ParallelConjugateGradientSolver'' 通常会更快一些。
 ==== 9.增大网格密度截断能量 ==== ==== 9.增大网格密度截断能量 ====
 +
 +零偏压计算的最后一项检查是密度网格截断。与横向的 k 点一样,它应该足够高以提供正确的物理结果。确保就感兴趣的量进行适当收敛也将有助于收敛。下图我们展示了费米能级随网格截段的变化而变化,可以看出非常低的网格截断在确定费米能级时会带来不准确性。然而还要注意,此图和上文与 k 点有关的那个图在比例上的差异。
 +
 +{{ :atk:meshpoint-20200601.png?600 |}}
 +
 +图194 计算的费米能级与网格截断的关系。
 ===== 有限偏压 NEGF 计算 ===== ===== 有限偏压 NEGF 计算 =====
 +
 +通常情况下,有限偏压的计算要比零偏压更难收敛,以上所有要点也适用于这种情况。但还有另一件事可以尝试,将在下一章节中进行说明,并且如果零偏压计算能够很好地收敛时,则应该首先尝试一下。
 ==== 1.总是从收敛的计算重启 ==== ==== 1.总是从收敛的计算重启 ====
 +
 +有限偏压计算应始终从较小偏压或零偏压的收敛计算中重新开始。如果不收敛,它通常将有助于减小偏压差异。例如您想要从零偏压开始进行 0.4 V 的计算,最好的方法是逐步计算,比如以 0.1 V 为步长。以下示例脚本可以完全做到这一点:[[https://docs.quantumatk.com/_downloads/iv.py|↓ iv.py]]。
 +
 +<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_zero_bias.hdf5'
 +device_configuration = nlread(zero_bias_file, DeviceConfiguration)[-1]
 +
 +for bias in bias_list:
 +    if processIsMaster():
 +        print("Bias is now: ", bias )
 +    # Get the calculator
 +    calculator = device_configuration.calculator()
 +
 +    # Set the bias voltage
 +    calculator=calculator(electrode_voltages=(bias/2, -bias/2))
 +
 +    # Attach the calculator and use the old initial state
 +    device_configuration.setCalculator(
 +      calculator(),
 +      initial_state=device_configuration)
 +    device_configuration.update()
 +    nlsave('device_bias_%.2f.hdf5' % bias.inUnitsOf(Volt), device_configuration)
 +</code>
 +
 +这种方法对于较高偏压会变得更重要,因为可能需要更短的增量才能实现收敛。因此在上述情况下,也许 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** 的 ''IterationControlParameters'' 类中定义——导航至 **New Calculator** 程序后在 //Iteration control parameters// 条目调整设置。
 +
 +{{ :atk:iteration_control_parameters-20200601.png?750 |}}
 ==== 1.最大步数 ==== ==== 1.最大步数 ====
 +
 +即使是稳健且表现良好的 NEGF 计算,有时朝着基态收敛的速度也会比预期的慢,因此可能需要额外的 SCF 步骤才能正确收敛。
 +
 +在这种情况下,只需增加参数 **Maximum steps**。
 +
 +然而,首先要从失败的计算中查阅 QuantumATK 的日志文件,确认 SCF 循环实际上是否运行良好,即是否收敛到了<color #00a2e8>合理的基态</color>。如果没有,那么额外的 SCF 步骤就不可能解决问题——可以考虑调整 <color #00a2e8>Pulay 混合</color>
 +
 +
 +
 +
 +
 === 什么是合理的基态? === === 什么是合理的基态? ===
 +
 +首先,**能带能量**和**哈密顿矩阵元素**都应稳定地收敛于恒定值。检查 ATK 日志文件:在每次 SCF 迭代之后查找报告能带能量 ''E'' 和与上一次 SCF 迭代的能量差(''dE'')和汉密尔顿矩阵元素(''dH'') 的所在行。在终端,可以很方便地使用 grep 命令实现:
 +
 +<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 =   -59.05 dE =  2.800614e-02 dH =  2.041091e-03                       |
 +|  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                       |
 +</code>
 +
 +  * 能量和哈密顿量的差 ''dE'' 和 ''dH'' 应当朝着指定的公差(默认为10<sup>-4</sup>)持续稳定地减小。
 +  * 能量可能会在 SCF 循环的开始时振荡,但最终应会收敛到恒定值。
 +
 +其次 **Mulliken populations**(马利肯布居数)应在物理上合理。检查 ATK 日志文件中最近几次 SCF 迭代的 //Density Matrix Report// 。针对每个原子,报告了 ''DM'' 和 ''DD'' 的值。前者是器件密度矩阵(马利肯布居数)的迹,而后者是 ''DM'' 与原子上的中性原子电荷之间的差(由赝势给出)。
 +
 +  - 在相同局部环境中的原子应具有大致相同的占有率。
 +  - 变化应该是系统的和物理的,例如在氧化物中,我们期望氧原子上有多余的电子,而更多带正电性邻近原子上的电子少。
 +  - 电荷不应在电极附近积累。
 +
 +在下面的示例中,我们看到如何满足这些要求:
 +
 +<code python>  
 ++------------------------------------------------------------------------------+
 +| Density Matrix Report                             DM        DD               |
 ++------------------------------------------------------------------------------+
 +|    Si      1.907 ,    1.100 ,    1.564 ]    3.89764  -0.10236            |
 +|    Ni      0.001 ,   -0.000 ,    2.342 ]   18.21499   0.21499            |
 +|    Si      0.001 ,    2.201 ,    3.120 ]    3.89379  -0.10621            |
 +|    Si      0.001 ,   -0.000 ,    4.675 ]    3.89556  -0.10444            |
 +|    Ni      0.001 ,    2.201 ,    5.453 ]   18.21180   0.21180            |
 +|    Si      1.907 ,    1.100 ,    6.231 ]    3.89446  -0.10554            |
 +|    Si      0.001 ,    2.201 ,    7.787 ]    3.89564  -0.10436            |
 +|    Ni      1.907 ,    1.100 ,    8.565 ]   18.21115   0.21115            |
 +</code>
 +
 +  - 对于所有 Ni 原子和所有 Si 原子,Mulliken 布居数大致相同。
 +  - 我们看到所有的 Si 原子的 ''DD'' 值都为负,而 Ni 原子的相应正值是是它的两倍。
 +  - 靠近电极边界的原子(折射率最低的原子)不会显示出异常大的 Mulliken 布居数。
 ==== 2.Pulay 混合 ==== ==== 2.Pulay 混合 ====
 +
 +SCF 循环使用 ''PulayMixer'' 在每个 SCF 步骤中通过将之前一些步数中的密度混合到当前步骤的猜测中来生成电子密度。**Damping factor** 参数控制在混合中使用前几个密度的百分数,**History steps** 控制要使用前面步骤中密度的数量。
 +
 +通常默认的 Pulay mixing 参数应该可以实现快速、稳定的 SCF 收敛,但有时可以进行一些调整:
 +
 +  * 首先尝试将 **Damping factor** 减小到 0.05 或者甚至 0.01。对于费米能级的金属态尤其有帮助。
 +  * 增加 **History steps** 的数量可能会稍微改善收敛性,但也会增加内存消耗。
 ==== 3.公差 ==== ==== 3.公差 ====
 +
 +SCF 循环将会一直持续至达到精度公差或最大步数为止。该公差是对总能带能量和哈密顿矩阵元素都进行测量的——在两种情况下,一个 SCF 步骤与另一个 SCF 步骤之间的绝对差都必须低于指定的公差,以使计算被认为是准确和收敛的。
 +
 +  * 在极少数情况下,可能需要将 **Tolerance** 增大到默认值以上才能使 NEGF 计算收敛,但是这也会导致产生不准确的基态。//因此,高的公差只能作为不得已的选择!//实际上,更常见的是收紧 SCF 公差(将其降低到例如 10<sup>-6</sup>)以提高收敛基态的精度。
 ===== 联系支持 ===== ===== 联系支持 =====
 +
 +如果任何尝试都失败了,请在在线 QuantumATK 论坛(https://forum.quantumatk.com)上发帖或联系 QuantumATK 支持(quantumatk-support@synopsys.com)。在使用这两种方式联系时,请附上您的 QuantumATK 脚本和日志文件。
 ===== 参考 ===== ===== 参考 =====
  
 +
 +  * 英文原文:https://docs.quantumatk.com/technicalnotes/negf_convergence_guide/negf_convergence_guide.html
atk/器件体系negf计算收敛指南.1591019671.txt.gz · 最后更改: 2020/06/01 21:54 由 xie.congwei

© 2014-2022 费米科技(京ICP备14023855号