|
|
本帖最后由 wal 于 2025-11-20 19:55 编辑
Multiwfn提供了便捷的批量运行方式,只是没法注释每一步是做什么的,修改已有序列会有些难度;同时有些处理需要根据体系手动操作,笔者觉得需要一个办法能让程序执行到一半停下来让自己接手。
这里分享一个自用的套壳程序BaneWfn,用于调用Multiwfn进行波函数分析。这是一个大项目里的子程序,不过笔者觉得它单拎出来对于上述两个问题应该也有点价值,所以就单独发个贴。
基本介绍
对于一个任务,首先要对着Multiwfn走一遍流程,把需要做的记录下来。比如,进入空穴-电子分析的流程是:
- 18
- 1
- <logfile>
- <state>
- 1
- <grid>
复制代码 格点处理完之后,进入后处理菜单,其中导出cub要用10和11:
- 10
- 1 // 1=total 2=local 3=cross
- 11
- 1
复制代码 类似地,了解其他功能:导出overlap用12,跃迁密度13,跃迁偶极密度14,CDD15,等等。现在,需要将这些信息灵活地记录下来,于是约定conf文件格式:
- # 主逻辑
- [main]
- 18
- 1
- ${logfile:-} # 输出文件
- ${state:-1}
- 1
- ${grid:-2}
- # 空穴-电子分析
- [cub]
- 10
- ${choice:-1} # 1=total 2=local 3=cross
- 11
- ${choice:-1}
- [overlap]
- 12
- ${func:2} # 1=Sm 2=Sr
- # 跃迁密度-transdens.cub
- [transdens]
- 13
- # ...
- # 可以自定义更多
- # 退出
- [quit]
- 0
- 0
- 0
- q
复制代码
其中,[main]记录主逻辑序列,[quit]块记录退出序列,其他块则是每种后处理的序列。为了让我们调用的时候可以稍微做些修改,约定使用shell风格的变量占位,且通过:-设定默认值。例如,${state:-1}表示若后续不指定,则state取默认值1。
然后,约定输入文件格式:- wfn=*.fchk
- [hole-ele]
- state 1
- %process
- cub choice 1
- transdens
- %command
- mkdir -p hole-ele
- mv hole.cub hole-ele/${input}_s1_hole.cub
- mv electron.cub hole-ele/${input}_s1_ele.cub
- end
- [hole-ele]
- state 2
- %process
- cub
- %command
- mv hole.cub hole-ele/${input}_s2_hole.cub
- mv electron.cub hole-ele/${input}_s2_ele.cub
- 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:
- Multiwfn_exec=D:\ChemicalPrograms\Multiwfn_3.8_dev_bin_Win64\Multiwfn.exe
- confpath=D:\MyProgram\banewfn\conf
- cores=4
复制代码 banewfn可执行文件接受一个输入文件参数,一个波函数文件参数。如果在输入文件中用wfn=定义了波函数文件则可不写波函数文件参数。可以不给齐,程序发现不够会进入交互界面索取。
例1 空穴-电子分析
可以这样运行:
- # 纯命令行
- banewfn hole.inp S1.fchk
- # 交互
- banewfn hole.inp
- banewfn
复制代码 在windows下,还可以给一种后缀绑定banewfn,比如.bw,这样双击.bw文件就可以自动运行了。
本例使用这种方式。在当前目录准备M1.fchk,M1.log,M2.fchk,M2.log,创建hole.bw文件:
- wfn=*.fchk
- [hole-ele]
- state 1
- %process
- cub
- %command
- move hole.cub ${input}_s1_hole.cub
- move electron.cub ${input}_s1_ele.cub
- end
复制代码
如果是第一次运行,右击hole.bw,选取打开方式,设定始终用banewfn打开.bw文件,然后双击运行。运行完毕后,当前目录下所有格点文件均已生成并重命名完毕。你可以如脚本般任意复制此bw文件,只需双击即可自动进行预设的一切操作。
Linux中也可以有些骚操作,比如本程序其实是可以用shebang实现脚本化的:
- #!/usr/bin/env banewfn
- wfn=*.fchk
- [hole-ele]
- state 1
- %process
- cub
- %command
- mv hole.cub ${input}_s1_hole.cub
- mv electron.cub ${input}_s1_ele.cub
- end
复制代码 将之保存为hole.bw,并将所在目录加入PATH,你就可以在任意位置运行hole.bw对当前目录下的fchk/log对进行空穴电子分析了:
例2 NICS-2D
本例展示一下复杂脚本简化操作。conf文件不再赘述,使用bw文件(对于不同体系,拟合环平面的原子ring需要自己指定,本例用的是苯):
- ring=1,3,5
- %command
- @echo off
- echo \#p b3lyp/6-31+G* NMR > template.gjf
- echo. >> template.gjf
- echo template file >> template.gjf
- echo. >> template.gjf
- echo 0 1 >> template.gjf
- echo [geometry] >> template.gjf
- echo. >> template.gjf
- echo. >> template.gjf
- end
- [aromatic]
- %process
- gen2dinp ring ${ring}
- end
- %command
- @echo off
- if exist template.gjf del template.gjf
- setlocal enabledelayedexpansion
- for /f "tokens=6,7,8 delims= " %%a in ('findstr /C:"The unit normal vector is " aromatic_${input}.out') do (
- set "X=%%a"
- set "Y=%%b"
- set "Z=%%c"
- )
- set vector=!X!,!Y!,!Z!
- echo [aromatic] > nics2.bw
- echo %%process >> nics2.bw
- echo nics2d ring ${ring} vector !vector! >> nics2.bw
- echo wait >> nics2.bw
- 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
-
查看全部评分 View all ratings
|