|
|
本帖最后由 gravitylead 于 2026-4-1 15:09 编辑
分享一个我自己使用的线性内插(linear interpolations in internal coordinates,LIICs)脚本。
脚本如下: 1. 脚本的使用环境需求:
Python > 3.11 (使用了 tomllib 库)和 numpy(进行矩阵运算)
使用方法:
计算参数通过 liic-config.toml 文件进行配置。如果当前文件夹下没有 liic-config.toml 文件,脚本会自动生成一个 liic-config.toml 文件模板,内容如下:
- [settings]
- step = 10 # The number of points requires in LIIC
- inputcoord = true # Whether add the input coordinates to the output file. (true or false )
- sort = false # Reordering atoms during the construction of internal coordinates
- # This option will not impact on the atomic order of the output structure
- mod = 'onexyz' # choose output mod:
- # 'onexyz' Write all structures into one .xyz file
- # 'manyxyz' Each structure will be written into a separate file
-
- [coords]
- # The first point of LIIC
- StartCoord = """
-
- """
- # The final point of LIIC
- EndCoord = """
-
- """
复制代码
将需要进行插值的两个分子坐标以标准 .xyz 格式分别放入 [coords] 下的 StartCoord 和 EndCoord 中,保存 .toml 文件后重新运行脚本,即可得到插值的坐标点。
[settings] 中的参数含义:
- step:插值点的数目
- inputcoord:是否在输出的坐标中包含输入的两个坐标点,默认包含。
- sort:在笛卡尔坐标转内坐标前按照重原子在前氢原子在后的顺序重拍原子顺序,插值完成后恢复顺序。某些情况下,使用默认顺序插值时会得到错乱的中间结构,这一选项可以解决。
- mod:输出文件的格式
- onexyz 所有的坐标都会输入到一个 .xyz 文件中,方便使用 vmd 等软件查看结构是否合理
- manyxyz 每一个结构单独保存在一个名为 liic-step%2d.xyz 的文件中,方便计算
2. 线性内插算法简述
其核心算法非常简单。将插值前后的分子内坐标分别记为 A,B,插值点的总数为n,则第 i 个插值点 Ci 的内坐标为:
Ci = A + i × (B-A)/(n+1)
从公式中不难看出,线性插值是一个纯粹的数学过程,可以在任何坐标下进行。
实践中一般采用内坐标而非笛卡尔坐标进行插值。举一个简单的例子,对于一个甲基发生旋转的体系,内坐标下的线性插值氢原子会旋转到目标位置,C-H 键长不变;而笛卡尔坐标下氢原子会以直线路径移动到目标位置,C-H 键长先缩短后拉长。从插值得到的势能面来看,笛卡尔坐标下的插值会造成一个高达数个 eV 的异常能垒(C-H 键异常缩短所致),而内坐标下的插值更符合化学直觉。
我的脚本选择输入笛卡尔坐标,自动转为内坐标进行插值,再转回笛卡尔坐标输出的方案。坐标转换的算法在脚本内实现,不借助多余的第三方库。输出结构时,使用点云对齐算法 (Kabsch_fit) 使得结构之间具备最大重叠,这能让输出的结构不会发生整体旋转。
3. 备注- 这个脚本我使用的次数并不多,没有经过充分的测试,建议每次得到插值结构后先用 vmd 等分子可视化软件打开看一下结构对不对。
- 对于势能面搜索而言,刚性扫描,柔性扫描,以及许多其他的势能面扫描方法都能够得到更加合理的势能面曲线。
|
|