banewfn
Multiwfn以其强大的波函数分析功能而闻名。然而,数字交互的运行方式使得其输入文件可能较为难读。比如,笔者想导出前线轨道,则需要这一串抽象的数字作为输入:
1
2
3
4
5
6
7
8
9
200
3
h
2
3
l
2
0
q
虽然可以存为模板等待调用,但而假若下次想微调一些流程,就不能像QM计算的输入文件那样给opt加个calcfc这种方式来实现,这是笔者一直以来比较想解决的问题。
笔者的想法是自己立一套村规,再写个解析器翻译成Multiwfn输入:
1
2
3
4
5
6
7
8
9
10
11
wfn=h2o.fchk # 指定波函数文件
[hole-ele] # 指定分析内容
state 1 # 指定激发态号
%process # 指定后处理内容
cub choice 1 # 要求导出总cub
Cele # 导出高斯平滑后的cub
transden # 导出跃迁密度
%command # 执行一些bash命令
mv hole.cub s1_hole.cub
mv electron.cub s1_ele.cub
end
当然,这里的hole-ele、cub等需要做个定义。笔者最近conf文件顺手,就用conf来定义配置:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# 主逻辑
[main]
18
1
$logfile # 输出文件
$state # 待分析态
1
$grid # 格点精度
-default- # 定义默认值
logfile=""
state=1
grid=2
# 导出格点
[cub]
10
$choice # 1=total 2=local 3=cross
11
$choice
-default- # 定义默认值
choice=1
# 高斯平滑
[Cele]
16
# 跃迁密度
[transden]
13
...
# 退出
[quit]
0
0
0
q
现在我们需要个程序,做这些事情:
- 读到[hole-ele],去配置目录寻找hole-ele.conf,加载[main]序列,并处理变量替换;
- 读取%process内的每一行,了解需要做什么后处理;
- 看到cub,则加载hole-ele.conf里的[cub]序列,并处理变量替换;
- 看到Cele,则加载hole-ele.conf里的[Cele]序列; …
- %process处理完毕后,继续处理%command,了解需要执行什么命令
- 将mv hole.cub s1_hole.cub这种按平台写入相应脚本(Linux→bash Win→bat),并执行
如此,我们就完成了一次Multiwfn调用。conf的好处是可以存储大量操作供简单调用,也可以有注释来记忆每一步是做什么的。
This post is licensed under CC BY 4.0 by the author.