Post

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.
Total hits!