计算化学公社

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

[辅助/分析程序] 模板化Multiwfn运行的一种途径

[复制链接 Copy URL]

683

帖子

12

威望

2825

eV
积分
3748

Level 5 (御坂)

鸩羽

本帖最后由 wal 于 2025-11-20 19:55 编辑

Multiwfn提供了便捷的批量运行方式,只是没法注释每一步是做什么的,修改已有序列会有些难度;同时有些处理需要根据体系手动操作,笔者觉得需要一个办法能让程序执行到一半停下来让自己接手。
这里分享一个自用的套壳程序BaneWfn,用于调用Multiwfn进行波函数分析。这是一个大项目里的子程序,不过笔者觉得它单拎出来对于上述两个问题应该也有点价值,所以就单独发个贴。

基本介绍
对于一个任务,首先要对着Multiwfn走一遍流程,把需要做的记录下来。比如,进入空穴-电子分析的流程是:
  1. 18
  2. 1
  3. <logfile>
  4. <state>
  5. 1
  6. <grid>
复制代码
格点处理完之后,进入后处理菜单,其中导出cub要用10和11:
  1. 10
  2. 1    // 1=total 2=local 3=cross
  3. 11
  4. 1
复制代码
类似地,了解其他功能:导出overlap用12,跃迁密度13,跃迁偶极密度14,CDD15,等等。现在,需要将这些信息灵活地记录下来,于是约定conf文件格式:
  1. # 主逻辑
  2. [main]
  3. 18
  4. 1
  5. ${logfile:-} # 输出文件
  6. ${state:-1}
  7. 1
  8. ${grid:-2}

  9. # 空穴-电子分析
  10. [cub]
  11. 10
  12. ${choice:-1} # 1=total 2=local 3=cross
  13. 11
  14. ${choice:-1}

  15. [overlap]
  16. 12
  17. ${func:2} # 1=Sm 2=Sr

  18. # 跃迁密度-transdens.cub
  19. [transdens]
  20. 13

  21. # ...
  22. # 可以自定义更多

  23. # 退出
  24. [quit]
  25. 0
  26. 0
  27. 0
  28. q
复制代码

其中,[main]记录主逻辑序列,[quit]块记录退出序列,其他块则是每种后处理的序列。为了让我们调用的时候可以稍微做些修改,约定使用shell风格的变量占位,且通过:-设定默认值。例如,${state:-1}表示若后续不指定,则state取默认值1。
然后,约定输入文件格式:
  1. wfn=*.fchk
  2. [hole-ele]
  3. state 1
  4. %process
  5. cub choice 1
  6. transdens
  7. %command
  8. mkdir -p hole-ele
  9. mv hole.cub hole-ele/${input}_s1_hole.cub
  10. mv electron.cub hole-ele/${input}_s1_ele.cub
  11. end

  12. [hole-ele]
  13. state 2
  14. %process
  15. cub
  16. %command
  17. mv hole.cub hole-ele/${input}_s2_hole.cub
  18. mv electron.cub hole-ele/${input}_s2_ele.cub
  19. end
复制代码


基本规则:
- [module]块告诉程序用的是哪个conf文件,然后跟着变量设定,如state 2设定分析第二个激发态,如果想要高质量格点,可以另起一行再加上grid 3。
- %process开始,后面调用conf中用方括号定义的后处理。前述conf定义了cub,这里写cub就加载了对应序列。变更变量值的话要在这一行修改,多个变量值之间空格分隔,不能另起一行,因为这里的每一行都会被视为一步独立的后处理。(所以如果你想在一次脚本运行中完成很多后处理,你要保证每次都回到main序列走入的菜单)
- 随后,你也可以用%command来执行一些命令。这在linux中会被写入sh脚本执行,Windows下会被写入bat脚本执行。最终,一个[module]块应当以end结尾,然后可以继续开[module]块做别的处理。
细节:
- 若某个[module]块未以end结尾而是以wait结尾,则程序运行完指定序列后会停住,允许用户继续交互操作Multiwfn。
- 文件头可以以wfn=xxx的形式指定波函数文件,允许通配符,匹配到多个文件时自动批量处理,但应善用${input}以避免覆盖问题;也可以以core=xx的形式指定并行核数。
- ${input}将会被替换为输入给Multiwfn的波函数文件名(不带后缀),其他的${name}这种shell变量风格占位符会依次尝试这样确定:1)程序运行时通过命令行参数指定键值 2)输入文件头部的键值定义 3)工作目录名为name的文件里的内容
- %command可以不依赖[module]块单独写,但要以end结尾
- [module]块必须顶格写
- #后面的所有东西都视为注释。如果你想在%command里使用#,你需要引号引用或者\转义。
- 空行将会被移除,使用cat时要当心

- 11.4更新后,command块内不再有上面两个行为,避免影响bash脚本
- 11.4更新后,windows下在banewfn.rc中设置gitbash_exec后,可以通过在%command第一行写#!/bin/bash告诉脚本用git bash来执行该脚本
最后,告诉程序你把配置文件和Multiwfn放在哪里就可以运行了。程序会在当前目录、自身目录、~/.bane/wfn中依次寻找banewfn.rc:
  1. Multiwfn_exec=D:\ChemicalPrograms\Multiwfn_3.8_dev_bin_Win64\Multiwfn.exe
  2. confpath=D:\MyProgram\banewfn\conf
  3. cores=4
复制代码
banewfn可执行文件接受一个输入文件参数,一个波函数文件参数。如果在输入文件中用wfn=定义了波函数文件则可不写波函数文件参数。可以不给齐,程序发现不够会进入交互界面索取。

例1 空穴-电子分析
可以这样运行:
  1. # 纯命令行
  2. banewfn hole.inp S1.fchk
  3. # 交互
  4. banewfn hole.inp
  5. banewfn
复制代码
在windows下,还可以给一种后缀绑定banewfn,比如.bw,这样双击.bw文件就可以自动运行了。

本例使用这种方式。在当前目录准备M1.fchk,M1.log,M2.fchk,M2.log,创建hole.bw文件:
  1. wfn=*.fchk
  2. [hole-ele]
  3.     state 1
  4. %process
  5.     cub
  6. %command
  7. move hole.cub ${input}_s1_hole.cub
  8. move electron.cub ${input}_s1_ele.cub
  9. end
复制代码

如果是第一次运行,右击hole.bw,选取打开方式,设定始终用banewfn打开.bw文件,然后双击运行。运行完毕后,当前目录下所有格点文件均已生成并重命名完毕。你可以如脚本般任意复制此bw文件,只需双击即可自动进行预设的一切操作。

Linux中也可以有些骚操作,比如本程序其实是可以用shebang实现脚本化的:
  1. #!/usr/bin/env banewfn
  2. wfn=*.fchk
  3. [hole-ele]
  4.     state 1
  5. %process
  6.     cub
  7. %command
  8. mv hole.cub ${input}_s1_hole.cub
  9. mv electron.cub ${input}_s1_ele.cub
  10. end
复制代码
将之保存为hole.bw,并将所在目录加入PATH,你就可以在任意位置运行hole.bw对当前目录下的fchk/log对进行空穴电子分析了:

例2 NICS-2D
本例展示一下复杂脚本简化操作。conf文件不再赘述,使用bw文件(对于不同体系,拟合环平面的原子ring需要自己指定,本例用的是苯):
  1. ring=1,3,5

  2. %command
  3.     @echo off
  4.     echo \#p b3lyp/6-31+G* NMR > template.gjf
  5.     echo. >> template.gjf
  6.     echo template file >> template.gjf
  7.     echo. >> template.gjf
  8.     echo   0  1 >> template.gjf
  9.     echo [geometry] >> template.gjf
  10.     echo. >> template.gjf
  11.     echo. >> template.gjf
  12. end

  13. [aromatic]
  14. %process
  15.     gen2dinp ring ${ring}
  16. end

  17. %command
  18.     @echo off
  19.     if exist template.gjf del template.gjf
  20.     setlocal enabledelayedexpansion
  21.     for /f "tokens=6,7,8 delims= " %%a in ('findstr /C:"The unit normal vector is " aromatic_${input}.out') do (
  22.         set "X=%%a"
  23.         set "Y=%%b"
  24.         set "Z=%%c"
  25.     )
  26.     set vector=!X!,!Y!,!Z!
  27.     echo [aromatic] > nics2.bw
  28.     echo %%process >> nics2.bw
  29.     echo     nics2d ring ${ring} vector !vector! >> nics2.bw
  30.     echo wait >> nics2.bw
  31. end
复制代码

双击运行,在交互界面提供结构文件,即可生成NICS输入文件和下一步的bw文件:

进行Gaussian计算(甚至你可以在bw里直接让g16自动算),然后双击运行第二步的bw文件。提供结构文件后,由于使用了wait,程序在执行完一些我在conf里定义的基础修饰后停在了后处理界面,你可以继续看效果调整绘图风格:

如果懒得调试,只是想随便画画,直接用end也可以,我自己写的序列是保存了一张样图的:


于是,整个NICS-2D流程都可以包含在nics.bw一个文件里,且省去了大量的重复操作步骤。

下载
压缩包里exe后缀是win版,无后缀的是linux版。自带一些我写的conf以及依赖这些conf的例子
release.7z (3 MB, 下载次数 Times of downloads: 18)
因为是个子程序,后续有更新可能不会在这里同步了,各位小伙伴们有兴趣看更新的可以看GitHub,但是别骂我代码菜






评分 Rate

参与人数
Participants 15
威望 +2 eV +67 收起 理由
Reason
cyh时代 + 2 好物!
djjj148 + 5
yzh + 5 233333
sobereva + 2
wangyj + 5 谢谢
hebrewsnabla + 5
〇66 + 5 牛!
huangxc82 + 5 好物!
leleyi + 5 精品内容
SharkYYX2025 + 5 好萌好萌好萌!
北大-陶豫 + 5 好物!
Uus/pMeC6H4-/キ + 5 好物!
student0618 + 5 谢谢分享
wzkchem5 + 5
Stardust0831 + 5 GJ!

查看全部评分 View all ratings

某不知名实验组从苞米地里长出来的计算选手

401

帖子

3

威望

2519

eV
积分
2980

Level 5 (御坂)

2#
发表于 Post on 2025-11-1 16:57:21 | 只看该作者 Only view this author
最近在写multiwfn和vesta的接口,刚刚写完调用multiwfn部分的代码,一上论坛发现有了现成工具

评分 Rate

参与人数
Participants 1
eV +5 收起 理由
Reason
wal + 5 没事python的更容易套工作流555

查看全部评分 View all ratings

683

帖子

12

威望

2825

eV
积分
3748

Level 5 (御坂)

鸩羽

3#
 楼主 Author| 发表于 Post on 2025-11-2 11:51:42 | 只看该作者 Only view this author
本帖最后由 wal 于 2025-11-4 17:11 编辑

再贴几个例子(11.4更新后这些example已包含在主楼压缩包内) examples2.7z (10.95 KB, 下载次数 Times of downloads: 3) 各位如果用上了欢迎贴出来自己的小脚本呀,虽然不知道有没有人会用这个小玩具555

weak_interaction里是IRI,IGM,IGMH的一键脚本。以IRI为例,双击bw文件后会为每个分子生成各自的文件夹,其中含有一键可视化所需的全部内容:

如果你的VMD在PATH里,双击iri.bat可以直接在VMD中进行可视化,不用进行任何多余操作(.vmd文件抄了卢老师Multiwfn的example)

iri.plt是散点图绘图脚本,需要安装gnuplot双击绘图。
除bw外,还有个inp后缀的是linux版,额外有自动绘制散点图的功能

MO文件夹里是最常用的导出前线轨道的fmo.bw,还有个nto.bw可以导出NTO轨道。可以联动,使用nto.bw导出NTO轨道,然后再用fmo.bw导出HONTO和LUNTO

评分 Rate

参与人数
Participants 1
eV +3 收起 理由
Reason
SharkYYX2025 + 3 233333

查看全部评分 View all ratings

某不知名实验组从苞米地里长出来的计算选手

683

帖子

12

威望

2825

eV
积分
3748

Level 5 (御坂)

鸩羽

4#
 楼主 Author| 发表于 Post on 2025-11-4 12:55:12 | 只看该作者 Only view this author
本帖最后由 wal 于 2025-11-4 17:12 编辑

还是小小地更新一下,这个比较重要
今天移除了command块内的空行删除与#注释移除逻辑,因为自己写的时候经常发现cat生成高斯输入文件时很头疼。。
另外添加了git bash支持,如果有高级用户希望通过git bash在Windows下执行shell脚本,可以在banewfn.rc内指定gitbash_exec,然后在希望通过bash执行的command块首行写入#!/bin/bash的shebang,脚本就会通过git bash来执行它,"C:\Program Files\Git\bin\bash.exe" -c "scripts.sh"。给个自动处理静电势的example(主楼压缩包内有对应文件):
  1. [grid]
  2. %process
  3.     electron
  4.     esp
  5. %command
  6. #!/bin/bash
  7.     mkdir -p ESP
  8.     mv density.cub ESP/density1.cub
  9.     mv totesp.cub ESP/ESP1.cub

  10.     cat << EOF > ESP/esp.bat
  11.     vmd -e esp.vmd
  12. EOF

  13.     cat << EOF2 > ESP/esp.vmd
  14.     source D:/program/VMD/scripts/ESPiso.vmd
  15.     source D:/program/VMD/scripts/ESPext.vmd
  16.     set colorlow -20
  17.     set colorhigh 20
  18.     puts "unit: kcal/mol"
  19. EOF2
  20. end

  21. [surface]
  22. %process
  23.     espext
  24. %command
  25. #!/bin/bash
  26.     mv vtx.pdb ESP/vtx1.pdb
  27.     mv mol.pdb ESP/mol1.pdb

  28.     unit=$(grep "REMARK.*Unit of B-factor field" surfanalysis.pdb | awk '{print $NF}')
  29.     if [ -z "$unit" ]; then unit="unknown"; fi
  30.     printf "%5s %6s %4s %15s\n" "index" "serial" "type" "Unit($unit)" > index.txt
  31.     index=0; while IFS= read -r line; do
  32.         if [[ $line =~ ^HETATM ]]; then
  33.             serial=$(echo "$line" | awk '{print $2}')      # 第2列:原子编号
  34.             type=$(echo "$line" | awk '{print $3}')        # 第3列:原子类型
  35.             value=$(echo "$line" | cut -c61-66 | awk '{print $1}')  # 第11列:B-factor值(固定位置61-66)
  36.             printf "%5d %6d %4s %8s\n" "$index" "$serial" "$type" "$value" >> index.txt
  37.             ((index++))
  38.         fi
  39.     done < surfanalysis.pdb

  40.     mv index.txt *.out surfanalysis.pdb ESP
  41. end
复制代码


双击ESP.bw并提供波函数文件,运行完毕后,ESP的所有文件均已产生在当前目录下的ESP文件夹内(不过win下grep这一步有点点慢):

ESP文件夹:

index.txt里记录了刚刚用bash脚本提取的静电势极值点index:

注意,这里没有直接生成包含实际命令的.vmd文件,而是引用了我本地存对应文件的路径,如果你也想一键可视化的话要改一下bw文件里的这两个东西的路径
  1. source D:/program/VMD/scripts/ESPiso.vmd
  2. source D:/program/VMD/scripts/ESPext.vmd
复制代码





某不知名实验组从苞米地里长出来的计算选手

683

帖子

12

威望

2825

eV
积分
3748

Level 5 (御坂)

鸩羽

5#
 楼主 Author| 发表于 Post on 2025-11-6 19:26:33 | 只看该作者 Only view this author
加个IFCT的例子。看见有人想做,顺手写了一下,也往这里发一份。

IFCT.7z

1.06 MB, 下载次数 Times of downloads: 0

某不知名实验组从苞米地里长出来的计算选手

1150

帖子

0

威望

4385

eV
积分
5535

Level 6 (一方通行)

6#
发表于 Post on 2025-11-6 21:13:33 | 只看该作者 Only view this author
wal 发表于 2025-11-2 11:51
再贴几个例子(11.4更新后这些example已包含在主楼压缩包内) 各位如果用上了欢迎贴出来自己的小脚本呀,虽然 ...

钟成老师的脚本在 5 年前已经有类似的功能了
http://bbs.keinsci.com/thread-18150-1-1.html

683

帖子

12

威望

2825

eV
积分
3748

Level 5 (御坂)

鸩羽

7#
 楼主 Author| 发表于 Post on 2025-11-6 21:17:20 | 只看该作者 Only view this author
本帖最后由 wal 于 2025-11-6 21:18 编辑
乐平 发表于 2025-11-6 21:13
钟成老师的脚本在 5 年前已经有类似的功能了
http://bbs.keinsci.com/thread-18150-1-1.html

嗯嗯 我个人用的输入里都用的是vcube命名风格 包括hole那个example也是纯方便vcube的命名这里只是贴个无依赖的懒狗模式
某不知名实验组从苞米地里长出来的计算选手

本版积分规则 Credits rule

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

GMT+8, 2026-1-25 05:00 , Processed in 0.419818 second(s), 25 queries , Gzip On.

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