xtb 这个命令行程序,我在三个完全不同的场景里反复用到它:给几百个原子的配合物做预优化、给反应路径快速筛候选构象、给后续高精度计算准备一个靠谱的初始结构。它不算新东西,但在很多课题组里,它已经从“可选的加速器”变成了流程里固定的一环。这篇东西不打算照抄手册,而是把我这几年从零上手、到能把它塞进日常工作流的完整路径摊开:装在哪里、参数怎么选、哪几个坑必须提前知道、哪些活它干得比高精度方法漂亮、哪些活碰都别碰。刚摸计算化学的本科生能照着跑通第一个算例,已经用过一段时间的人也大概率能在中间几节找到自己没注意过的细节。
1. xtb 到底是个什么东西,什么时候该想起它
1.1 半经验方法在今天的真实位置
很多人刚接触计算化学时的认知是线性的:分子力学最粗糙,半经验次之,DFT 更准,耦合簇最准。这个排序在精度上没错,但在“该用哪个”这个问题上会误导人。真正决定选择的是体系大小和你需要的精度之间的比值。DFT 的计算量随体系规模大致按三次方往上走,一个 300 原子的团簇做一次几何优化,普通工作站跑上几周是常态;而同样规模的结构用 xtb 的 GFN2 方法优化,几个小时就能收敛,中间还能顺手做几轮构象筛选。
我常拿卷尺和激光测距仪打比方:激光测距仪当然更准,但你要判断一扇门装不装得进去,卷尺量一下足够了,而且快得多。xtb 就是计算化学里的那把卷尺。它只显式处理价电子,把内层电子和大量双电子积分用参数化的方式吸收掉,代价是绝对能量和部分电子结构细节失真,收益是计算量掉了一到两个数量级,同时几何优化的结果在有机体系里常常离 DFT 只差百分之几的键长。
所以它最舒服的位置不是“替代 DFT”,而是“喂给 DFT”。先用它把成千上万个候选结构砍到几十个,再上高精度方法,整体效率比一上来就堆算力高得多。这条原则在后面第 4 节的流程里会反复出现。
1.2 GFN 家族四个成员的脾气
xtb 内部不是只有一种方法,而是 GFN 系列的好几个变体,选错了比装错了更浪费。我整理了一张实际用得上的对照表:
| 方法 | 命令行写法 | 相对成本 | 主要特点 | 我一般拿它做什么 |
|---|---|---|---|---|
| GFN-FF | --gfn ff | 极低 | 纯力场,不产生电子结构 | 上千原子体系的粗预优化、去原子重叠 |
| GFN0-xTB | --gfn 0 | 很低 | 近似最激进,部分流程免迭代 | 大规模构象初筛、批量打分 |
| GFN1-xTB | --gfn 1 | 中 | 元素覆盖广,带点电荷修正 | 含金属或重元素的体系 |
| GFN2-xTB | --gfn 2 | 中 | 多极静电加色散修正,默认方法 | 有机分子的几何优化与能量排序 |
默认值是 GFN2,绝大多数情况下不用改。GFN1 和 GFN2 的差别不只是“新老版本”,它们内部对静电的处理方式不同:GFN1 用简化的点电荷模型,对带电体系和金属中心更稳一些;GFN2 引入多极展开加 D4 色散,主族有机分子的非共价作用描述得更细。我遇到过含过渡金属的配合物用 GFN2 优化出奇怪配位几何,换 GFN1 就正常的情况,反过来在纯有机大分子里 GFN2 的构象能排序明显更接近高精度结果。
还有一点容易被忽略:GFN-FF 虽然是力场,但它和 xtb 共用同一套命令行和文件体系,可以在同一个流程里切换。我处理超大体系的标准做法是 GFN-FF 跑 200 步粗优化,再换 GFN2 精修 300 步,两步加起来比直接 GFN2 从乱七八糟的初始结构开始要快,因为 GFN2 最怕的就是初始结构里有原子重叠。
1.3 能力边界清单:能干什么,别指望什么
这部分我写得直白一点,因为新手最容易在这里翻车。
可以放心用的:有机分子的几何优化(键长误差通常在 0.02 埃以内)、构象相对能排序、分子间作用能趋势、隐式溶剂下的溶解度定性趋势、振动频率的定性指认、电离能和电子亲和能的数量级估计、初步的反应路径探索、大规模筛选的粗打分。
不要指望的:反应能垒的定量结果。GFN2 对能垒的误差常在 5 到 10 kcal/mol 区间,用它去区分两条能垒只差 2 kcal/mol 的路径基本等于掷骰子。过渡金属的自旋态精细排序也不可靠,不同自旋态之间的能量差经常被算反。激发态、核磁化学位移、强关联体系,这些都不在它的设计目标里。
我在组里立过一条规矩:凡是要写进论文正文的能量比较,xtb 的结果只能出现在“筛选”或“预优化”的描述里,最终数字必须来自更高精度的方法。反过来,凡是只需要“大概谁更稳定”的场景,用高精度方法反而是在浪费机时。这条边界如果一开始就想清楚,后面能省掉大量返工。
2. 装起来,跑通第一个算例
2.1 三条安装路径与各自的坑
装 xtb 有三条路,选哪条取决于你想不想折腾。
第一条是包管理器,最省事。社区维护的 conda 频道里有现成的二进制包,一条命令搞定,环境隔离也顺便解决了。缺点是版本更新滞后,某些新参数在旧版本里根本不存在,而且默认构建有时候没开满并行。我在自己的工作站上就是这条路,原因是省心,跑挂了重装一次不到两分钟。
conda create -n xtb-env python=3.10 conda activate xtb-env conda install -c conda-forge xtb crest第二条是官方发布的预编译二进制包,解压之后把目录加进环境变量就能用。这条路的版本最全,老版本新版本都能拿到,适合需要复现某篇工作、必须锁死版本号的场景。要注意的是解压目录不要带空格和中文,某些脚本在路径处理上很脆弱。
tar -xzf xtb-binary.tar.xz export PATH=$HOME/software/xtb/bin:$PATH第三条是源码编译。只有两种情况值得走:你需要链接特定的数学库来榨性能,或者你的机器架构二进制包不覆盖。编译需要 Fortran 编译器、CMake 和一个 BLAS 实现,过程不算复杂但报错信息经常很晦涩。我的建议是除非有明确理由,别碰这条路。
注意:不同大版本之间的默认行为会变,尤其是收敛判据和色散修正的默认开关。如果你在复现别人的结果,第一件事是
xtb --version对一下版本号,别急着怀疑自己的输入文件。
2.2 五分钟自检:确认装对了
装完不要直接上自己的体系,先用水二聚体跑一遍。这个算例小到几十毫秒出结果,但能同时验证文件读取、SCF 收敛、几何优化、输出写入四条链路。
cat > water_dimer.xyz << 'EOF' 6 water dimer test O -1.391 0.000 0.000 H -1.991 0.000 0.000 H -1.091 0.900 0.000 O 1.391 0.000 0.000 H 1.991 0.000 0.000 H 1.091 -0.900 0.000 EOF xtb water_dimer.xyz --gfn 2 --opt跑完之后目录里应该多出七八个文件,其中xtbopt.xyz里是优化后的结构,xtb.out是完整日志。打开日志末尾,找TOTAL ENERGY那一行,水二聚体在这个方法下的电子能应该在 -11 Hartree 这个量级附近。如果差得离谱(比如正数),基本可以确定电荷或自旋设置错了。
xyz 文件的格式有两个硬性要求:第一行是原子数,第二行是注释行(写什么都行,但不能省),从第三行开始才是坐标。我见过太多新手把注释行删掉,程序报读取错误还以为是安装问题。
2.3 参数体系与输出文件地图
xtb 的命令行参数不算多,但有几个容易混淆,我按使用频率排一下:
xtb coord.xyz \ --gfn 2 \ --chrg 0 \ --uhf 0 \ --opt tight \ --alpb water \ --namespace run01 \ --parallel 8--chrg是总电荷,--uhf是未配对电子数(不是自旋多重度,多重度等于未配对电子数加一,这个换算错误我至少见过十次)。--namespace给所有输出文件加前缀,批量跑的时候必加,否则第二次运行会把第一次的结果覆盖掉,而且不会有任何提示。--parallel控制线程数,注意这个并行效率在超过 8 核之后提升就很不明显了,别指望开满 64 核能快 8 倍。
输出文件的用途值得单独列一下:
| 文件名 | 内容 | 什么时候看它 |
|---|---|---|
xtb.out | 完整运行日志 | 出错、看能量、看电荷 |
xtbopt.xyz | 优化后的最终结构 | 优化类任务必看 |
xtbopt.log | 优化轨迹(多帧 xyz) | 判断优化是否在打转 |
xtb.trj | 轨迹文件 | 做动画、看路径 |
xtbhess.xyz | 频率计算的 Hessian | 后处理用 |
vibspectrum | 振动频率与强度 | 指认振动模式 |
charges | 原子电荷 | 分析电子分布 |
wbo | Wiberg 键级 | 判断成键强弱 |
xtb.json | 结构化输出 | 写脚本批量解析 |
这里有个很实用的细节:--json会把能量、梯度范数、轨道能级等压缩成一个 JSON 文件,用脚本解析比正则匹配日志稳定得多。我早期写的批量脚本全靠 grep 日志,后来程序稍微改了输出格式就全线崩溃,换成读 JSON 之后省了很多维护成本。
3. 四类高频计算的标准配方
3.1 单点能:别只盯着一个数字
单点计算是最简单的用法,一个结构进去,一个能量出来。
xtb mol.xyz --gfn 2 --sp但单点能本身几乎没有信息量,真正有用的是它周边的东西。日志里我会重点看三块:一是 HOMO 与 LUMO 的能级和 gap,虽然绝对值不准,但同一系列分子的相对趋势是可用的;二是原子电荷,xtb 默认输出 Mulliken 电荷,也支持其他布居方案,注意这些电荷的绝对值没有物理意义,只能做同系列相对比较;三是配位数和原子间距离矩阵,用来快速检查结构有没有塌陷或者穿模。
一个经常被忽略的点:xtb 输出的能量是电子能,不含零点振动能。如果你要拿它和实验的生成热比较,或者和另一套含 ZPE 的数据混用,必须先统一口径。我就吃过这个亏,当时拿一批单点能和文献里的热化学数据对,差了将近 8 kcal/mol,查了半天才发现是 ZPE 没算进去。
还有一个原则:比较两个结构的能量,必须保证化学式相同、方法相同、电荷和自旋相同、溶剂模型相同。任何一项不同,差值都失去意义。这条听起来像废话,但我在审稿和帮人看数据时,四次里有三次的问题出在这里。
3.2 几何优化:收敛级别与加速策略
几何优化的基本写法:
xtb mol.xyz --gfn 2 --opt默认的收敛级别是 normal,对大多数有机体系够用。想更严格就用--opt tight,代价是步数明显增加。如果你要做频率计算,我强烈建议优化时直接带上--ohess,它会用 Hessian 信息加速收敛,同时把 Hessian 留给后续步骤用。
xtb mol.xyz --gfn 2 --opt tight --ohess关于收敛,有几个参数必须分清。命令行里的--cycles管的是 SCF 迭代次数,不是几何优化步数;几何优化的最大步数在控制文件里通过$opt段的maxcycle设置。我最初就搞混过,优化跑了 200 步还没收敛,我拼命调--cycles,完全没用。
优化策略上,我的经验是按体系大小分档:
| 体系规模 | 推荐流程 |
|---|---|
| 小于 100 原子 | 直接 GFN2 加--opt tight |
| 100 到 300 原子 | GFN-FF 粗优化 100 到 200 步,再 GFN2 精修 |
| 大于 300 原子 | GFN-FF 全流程,只对关键局部用 GFN2 复核 |
大体系直接上 GFN2 最典型的问题是前几十步梯度极大,结构会剧烈震荡甚至断键,跑出来的东西完全不能用。先用 GFN-FF 把明显的原子重叠和扭曲理顺,再交给 GFN2,收敛步数通常能砍掉一半以上。
提示:优化跑完之后,一定要拿
xtbopt.xyz往下走,而不是原始输入文件。我见过不止一次有人拿着输入结构去做后续计算,白跑一整天。
3.3 频率与热化学:虚频到底说明了什么
频率计算的写法:
xtb mol.xyz --gfn 2 --opt tight --hess注意--hess和--ohess的区别:--ohess是在优化过程中使用 Hessian,--hess是在优化之后额外做一次频率计算。两个可以同时用,但顺序上程序会自己处理。
跑完之后目录里会有vibspectrum和g98.out,后者可以直接拖进常见的可视化软件里看振动模式动画。这一步对确认虚频到底对应哪个运动非常关键,光看数字没用。
虚频的判断规则很朴素:极小值点应该零个虚频,过渡态应该恰好一个。但实际跑出来经常是一堆小虚频,这时候不要慌,按下面的思路排查。
低于 50 波数的几个小虚频,绝大多数是数值噪声,尤其是大体系或者含弱相互作用的体系,来源是积分格点精度不足。可以尝试提高积分精度参数重新算一次,如果虚频还是那几个且数值很小,一般可以忽略。真正需要警惕的是 100 波数以上的虚频,那通常意味着结构确实没优化到位,或者收敛级别太松。
这里有个我踩过的坑:用 normal 级别优化完直接算频率,出来三个 30 到 60 波数的虚频,我以为结构有问题,重新优化了三遍都一样。后来把优化级别换成 tight,虚频全消失了。所以做频率之前,优化级别至少要到 tight,这一条几乎可以写进肌肉记忆。
热化学方面,频率计算会输出 RRHO 近似下的自由能。这些数值的绝对值不可靠,但同一系列分子之间的相对趋势有参考价值。如果你的体系有明显的内旋转或者多重稳定构象,RRHO 的处理会失真得比较厉害,这时候要么做构象平均,要么干脆别用自由能做定量结论。
3.4 溶剂化模型怎么挑
xtb 内置了几种隐式溶剂模型,最常用的是两个:
xtb mol.xyz --gfn 2 --opt --alpb water xtb mol.xyz --gfn 2 --opt --gbsa waterALPB 是较新的一种,对有机溶剂和中性分子的描述更平衡;GBSA 更老,但在某些极性体系里反而给得更保守。我的默认选择是 ALPB,只有在对比旧数据或者发现结果明显异常时才换 GBSA。
溶剂名用英文小写,常见的有 water、methanol、ethanol、acetone、acetonitrile、chloroform、dichloromethane、thf、toluene、dmso 等。写错溶剂名程序会直接报错退出,这个倒是不难发现。
真正需要注意的是模型的适用边界。隐式溶剂把所有溶剂分子抽象成一个连续介质,它完全无法描述具体的氢键网络。如果你的反应涉及质子转移、涉及溶剂分子直接参与成键断键,隐式模型给出的结果可能和真实情况差很远。我处理这类问题的方式是:先用隐式溶剂做大批量筛选,把候选锁死到少数几个,再用显式溶剂加几个关键溶剂分子做小规模复核。
还有一个细节:加溶剂模型之后能量会整体下降,所以带溶剂和不带溶剂的能量绝对不能直接相减。气相和溶液相的能量差只有在专门设计的计算流程里才有意义,随手做减法是最常见的错误之一。
3.5 约束优化与坐标扫描的写法
这两类任务都需要一个额外的控制文件,命令行里用--input传进去。
约束优化用来固定某些几何参数,比如固定一个键长观察结构如何响应:
$constrain distance: 1,2,auto force constant=0.5 $enddistance: 1,2指的是第 1 和第 2 个原子,auto表示取当前结构里的值。如果你要指定具体数值,直接写成数字即可。force constant是约束力常数,数值越大约束越硬,通常 0.5 到 1.0 就够用,设太大容易导致优化震荡。
角度和二面角的写法同理,把distance换成angle或dihedral,后面跟三个或四个原子编号。
坐标扫描的写法稍微复杂一点:
$scan distance: 1,2=1.0,3.0,21 $end含义是从 1.0 埃扫到 3.0 埃,取 21 个点。配合--opt做松弛扫描,每一步都让其余自由度自由弛豫;配合--sp做刚性扫描,只移动指定坐标。做键解离曲线或者二面角旋转能垒,这两种都要会。
我的实际经验是:刚性扫描出结果快,但曲线上会有明显的不平滑毛刺,因为其余自由度没弛豫;松弛扫描平滑得多,但步数多的时候耗时会翻好几倍。如果只是想看个大概趋势,刚性扫描二十个点足够;如果曲线要用在论文里,必须用松弛扫描,而且点数不能太少,至少 20 个点才能把过渡态附近的结构找出来。
注意:扫描过程中的中间结构默认保存在轨迹文件里,帧数和你设置的点数一致。做后处理时记得按顺序读取,别把起始和终止结构搞反了。
4. 把 xtb 接进真实工作流
4.1 构象搜索:别用 xtb 硬扛
构象搜索是 xtb 最有价值的应用场景之一,但直接用 xtb 做这件事效率很低。真正该用的是配套的构象搜索工具,它内部调用 xtb 做能量评估,外层用元动力学加遗传算法的方式探索构象空间。
crest mol.xyz --gfn2 --alpb water跑完之后crest_conformers.xyz里是所有找到的构象按能量排序,crest_best.xyz是最低能量那一个。体系大的话可以先用快速模式筛一遍,再做精细搜索。
这里有几个参数值得掌握。--nci专门针对弱相互作用体系优化,比如分子间复合物或者超分子体系,开了之后对非共价作用的处理会细致不少。--quick是快速模式,精度降一档但速度快很多,适合先摸清构象空间的轮廓。--gfn2//gfnff这种双斜杠写法表示用 GFN-FF 做前期搜索、GFN2 做后期精修,大体系里这个组合能省不少时间。
我自己处理柔性分子时的标准流程是:先用快速模式跑一遍拿到大致分布,看能量最低的几十个构象在结构上有没有明显分组,然后对每一组的代表结构做一次完整搜索。这样比直接上完整搜索省一半时间,而且不容易漏掉高能但重要的构象。
4.2 批量任务脚本模板
单文件跑得再熟,到了几十上百个结构的时候,手工操作一定会出错。批量脚本的核心是三点:命名空间隔离、失败重试、结果汇总。
import subprocess from pathlib import Path mols = sorted(Path("inputs").glob("*.xyz")) results = [] for mol in mols: ns = mol.stem cmd = [ "xtb", str(mol), "--gfn", "2", "--opt", "tight", "--alpb", "water", "--namespace", ns, "--json", "--parallel", "8", ] proc = subprocess.run(cmd, capture_output=True, text=True) if proc.returncode != 0: results.append((ns, "FAILED", None)) continue out = Path(f"{ns}.xtb.json") if out.exists(): results.append((ns, "OK", out)) else: results.append((ns, "NO_OUTPUT", None)) for name, status, path in results: print(name, status, path)这个模板看起来简单,但里面每一行都有来历。--namespace保证输出不互相覆盖;returncode检查能抓出崩溃的算例;--json让后续解析不用碰日志文本。实际用的时候我还会加一层超时控制,某个结构卡在优化里跑一天不结束是很常见的,不加超时会让整个批次停在那里。
批量任务最常见的失败原因是某个结构本身有问题,比如电荷设置不对、原子重叠严重、元素超范围。所以脚本里最好把失败样本单独归到一个列表里,跑完之后人工看一眼,别让一个坏样本拖垮整批。
4.3 分层计算:什么时候该把结果交给高精度方法
xtb 在整个流程里的角色是“漏斗的上半部分”。我常用的三段式流程是这样:
第一段,GFN-FF 或者 GFN0 做超大规模粗筛,把几千个候选压到几百个。这一段的唯一目标是剔除明显不合理的结构,不追求精度。
第二段,GFN2 带隐式溶剂做优化和能量排序,把几百个压到几十个。这一段要开始认真对待收敛级别和溶剂模型,因为排在前面的结构会被送进下一段。
第三段,把前几十个结构交给高精度方法做最终优化和能量计算。这一步通常只保留个位数。
这套流程的关键在于误差抵消。如果你在第二段和第三段用的是同一套溶剂模型、同一套电荷处理方式,那么两段之间的能量趋势往往是一致的,也就是说 xtb 排出来的顺序在高精度方法下大概率不会大改。反过来说,如果两段的设置不一致,排序可能完全翻转,前面的筛选就白做了。
我踩过一次典型的坑:第二段用 ALPB 水模型,第三段用气相,结果几个在溶液里稳定的构象到了气相全部失稳,排序完全反了。后来统一了口径,问题再没出现过。
5. 报错与精度陷阱实录
5.1 高频报错对照表
这几年攒下来的报错,能覆盖新手遇到的八成情况:
| 报错关键词 | 真实原因 | 处理方式 |
|---|---|---|
| SCF not converged | 电子结构难收敛,常见于金属体系或近简并轨道 | 增加 SCF 迭代上限,适当提高电子温度,检查电荷与自旋 |
| no element with Z= | 元素超出方法覆盖范围 | 换 GFN1 或检查输入元素符号拼写 |
| Problem with reading file | xyz 格式错误 | 确认第一行原子数、第二行注释行都在 |
| inconsistent setup | 电荷与未配对电子数不匹配 | 核对电子数奇偶性 |
| geometry optimization did not converge | 步数用尽或结构在震荡 | 看轨迹判断是打转还是缓慢逼近,换优化器 |
| error in coordinate update | 单步位移过大 | 降低最大步长,先用 GFN-FF 粗优化 |
| internal error in numerical integration | 积分格点精度不足 | 提高积分精度参数重算 |
第一条是最常见的。SCF 不收敛时不要急着改结构,先确认电荷和自旋设置对不对。我见过一个带两个未配对电子的体系被写成零,程序硬着头皮算,能收敛才怪。确认设置没问题之后,再考虑提高迭代上限或者提高电子温度来帮助收敛,后者相当于给轨道占据加一点模糊,能缓解近简并带来的震荡。
第二条在新手那里出现频率也很高。GFN2 的元素覆盖虽然广,但并不是元素周期表全部,遇到超重元素必须换方法或者换工具。这个报错信息里会直接告诉你 Z 等于多少,照着查一下就知道是哪个原子出了问题。
5.2 优化不收敛的排查顺序
优化跑不完是最耗时间的问题,因为它不像报错那样立刻停下,而是默默地烧机时。我按下面的顺序排查,基本上前三步就能定位。
第一步,看xtbopt.log的最后几十帧。如果结构在两种构象之间来回跳,说明势能面本身有两个接近的极小值,或者约束设置有冲突;如果结构几乎不动但梯度降不下去,说明收敛判据对这个体系太严;如果某一步之后结构突然崩坏,说明那一步的位移过大。
第二步,检查初始结构。原子重叠是最常见的隐形杀手,两个原子距离小于 0.7 埃的时候,初始梯度会大到离谱,优化器第一步就把结构甩飞。用可视化软件看一眼初始结构,或者写个脚本扫一遍最小原子间距,几秒钟的事。
第三步,换优化策略。默认优化器在大多数体系上没问题,但对某些病态体系会震荡。加上--ohess用 Hessian 信息通常能显著改善,或者换成基于信赖域的优化方式。大体系的另一个选项是先用 GFN-FF 跑一段,把结构捋顺了再切回 GFN2。
第四步,检查物理合理性。有些结构本来就优化不出来,比如你强行给一个五配位的碳,或者让两个带同种电荷的基团靠得很近。这种情况不是程序的问题,是化学直觉的问题。
提示:优化步数用尽但梯度已经很小的情况,把最大步数调大一点往往就能收敛,不必从头再来。轨迹文件里最后一帧可以直接当新的初始结构。
5.3 最容易踩的精度误区
最后这一节是我觉得最该写在前面、但放在最后更合适的内容,因为只有跑过一轮的人才看得懂。
第一个误区是拿 GFN2 的能量去算反应能垒。这个前面提过,但值得再说一遍:能垒误差 5 到 10 kcal/mol 意味着你无法区分两条竞争路径,也无法判断某个取代基是加速还是减速。能垒这件事,xtb 只能告诉你“大概有没有能垒”,不能告诉你“能垒是多少”。
第二个误区是跨方法比较能量。GFN2 算出来的能量和 GFN1 算出来的能量不能相减,和 GFN-FF 更不能。不同方法有不同的参数化基准,绝对能量之间没有任何可比性。同一个体系想比较不同状态,必须锁死同一个方法。
第三个误区是把原子电荷当真。Mulliken 电荷对基组和方法极其敏感,xtb 里输出的电荷只能用于同系列分子的相对趋势分析,绝对值拿到论文里当结论会被质疑。真要做电荷分析,得上更高精度的方法配合合适的布居方案。
第四个误区是忽略构象。一个柔性分子在溶液里是构象系综,不是单一结构。拿一个随手画的构象算出来的能量去代表整个分子,误差可能比方法本身的误差还大。构象搜索这一步该做就得做,省不掉。
第五个误区是频率不缩放。xtb 的谐振频率系统性偏高,做指认的时候要心里有数,实际比对实验光谱时通常需要一个 1.0 到 1.1 之间的经验缩放因子,具体值取决于体系类型。不缩放直接对比,低波数区还好,高波数区的偏差会很明显。
第六个误区是把 xtb 优化出来的结构直接当成高精度结构的替代。几何参数上它确实接近,但涉及分子间作用、质子位置、氢键网络的时候,差异会放大。凡是最终结构要进论文的,都得用高精度方法再优化一遍。
我在实际使用中的体会是,xtb 用得好不好,八成不取决于你对参数的熟悉程度,而取决于你对“这个结果要用在哪里”的判断。同一份输出,用在筛选环节是宝贝,用在结论环节是灾难。把这条线划清楚,剩下的都是熟练度问题。