“第10届量子化学波函数分析与Multiwfn程序培训班将于5月4-8日于北京举办,这是一次性完整、系统学习波函数分析的各种理论知识和全面掌握强大的Multiwfn波函数分析程序使用的最不可错过的机会!请点击此链接查看详情和报名方式,欢迎参加!

“第18届北京科音分子动力学与GROMACS培训班” 将于5月23-26日于北京举办。这是一次性全面、系统学习分子动力学模拟知识和最流行的分子动力学程序GROMACS的关键机会!报名正在进行中,请点击此链接查看详情,欢迎参加!

计算化学公社

 找回密码 Forget password
 注册 Register
Views: 85|回复 Reply: 0
打印 Print 上一主题 Last thread 下一主题 Next thread

[Python] 一个简单的线性内插 (LIIC) 脚本

[复制链接 Copy URL]

7

帖子

0

威望

545

eV
积分
552

Level 4 (黑子)

本帖最后由 gravitylead 于 2026-4-1 15:09 编辑

分享一个我自己使用的线性内插(linear interpolations in internal coordinates,LIICs)脚本。
脚本如下:
liic-v1.0.py (15.79 KB, 下载次数 Times of downloads: 8)
1. 脚本的使用环境需求:
Python > 3.11 (使用了 tomllib 库)和 numpy(进行矩阵运算)
使用方法:
计算参数通过 liic-config.toml 文件进行配置。如果当前文件夹下没有 liic-config.toml 文件,脚本会自动生成一个 liic-config.toml 文件模板,内容如下:
  1. [settings]  
  2. step       = 10         # The number of points requires in LIIC  
  3. inputcoord = true       # Whether add the input coordinates to the output file. (true or false )  
  4. sort       = false      # Reordering atoms during the construction of internal coordinates   
  5.                         # This option will not impact on the atomic order of the output structure  
  6. mod        = 'onexyz'   # choose output mod:   
  7.                         # 'onexyz'  Write all structures into one .xyz file  
  8.                         # 'manyxyz' Each structure will be written into a separate file  
  9.                      
  10. [coords]  
  11. # The first point of LIIC  
  12. StartCoord = """  
  13.   
  14. """  
  15. # The final point of LIIC  
  16. EndCoord = """  
  17.   
  18. """
复制代码

将需要进行插值的两个分子坐标以标准 .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 等分子可视化软件打开看一下结构对不对。
  • 对于势能面搜索而言,刚性扫描,柔性扫描,以及许多其他的势能面扫描方法都能够得到更加合理的势能面曲线。



本版积分规则 Credits rule

手机版 Mobile version|北京科音自然科学研究中心 Beijing Kein Research Center for Natural Sciences|京公网安备 11010502035419号|计算化学公社 — 北京科音旗下高水平计算化学交流论坛 ( 京ICP备14038949号-1 )|网站地图

GMT+8, 2026-4-13 17:34 , Processed in 0.164935 second(s), 23 queries , Gzip On.

快速回复 返回顶部 返回列表 Return to list