计算化学公社

标题: 介绍两个优雅地调用Multiwfn的方法(Linux) [打印本页]

作者
Author:
pika02    时间: 2022-10-26 15:55
标题: 介绍两个优雅地调用Multiwfn的方法(Linux)
本帖最后由 pika02 于 2022-10-26 16:29 编辑

官方的安装方式推荐把一些命令丢进.bashrc,包括

  1. export OMP_STACKSIZE=200M
  2. ulimit -s unlimited
  3. export Multiwfnpath=/home/你的用户名/你的Multiwfn目录
  4. export PATH=$PATH:/home/你的用户名/你的Multiwfn目录
复制代码

(按照实际情况修改)

.bashrc是一个特殊的脚本文件,每次打开一个bash终端窗口时,便会新建一个bash shell(非登录shell)并且执行这些命令,用来初始化环境。
这几个export设置了几个环境变量,以及堆栈大小为无限

然而这样做可能会出现问题,比如在已经设置了ulimit -s unlimited的情况下,一些其他程序可能会翻车,比如winecfg
我当年就踩过这个坑,我说怎么winecfg老是报错


那么能不能只在想调用Multiwfn时才执行这些命令来初始化shell环境呢?

方法1
把上面这些语句包装成函数,也就是在.bashrc里把它们修改成:
  1. mtf(){
  2.     export OMP_STACKSIZE=200M
  3.     ulimit -s unlimited
  4.     export Multiwfnpath=/home/你的用户名/你的Multiwfn目录
  5.     export PATH=$PATH:/home/你的用户名/你的Multiwfn目录
  6. }
复制代码

这个函数名mtf是任意的,你可以改成任何你喜欢的名字,甚至改成emoji都可以,只要不跟别的命令冲突
如果你想用Multiwfn干一些活,只需要打开终端,输入mtf,你的环境就初始化好了,Multiwfn可执行文件也在你的PATH里面了,你可以跟往常一样干活。


方法2
每次打开终端后想用Multiwfn干活儿都得敲mtf,那有没有更懒的方法呢?

答案就是用一个脚本,代替Multiwfn主程序被调用。
创建一个脚本,内容如下
  1. export OMP_STACKSIZE=200M
  2. ulimit -s unlimited
  3. export Multiwfnpath=/home/你的用户名/你的Multiwfn目录
  4. /home/你的用户名/你的Multiwfn目录/Multiwfn "$@"
复制代码

调用脚本时,bash会生一个“孩子”,称为子shell,脚本前3行执行子shell的环境初始化,最后一行用绝对路径调用真正的Multiwfn可执行文件来干活,"$@"(包括双引号!)用来传递参数给Multiwfn
Linux有一个好,脚本能不能运行跟有没有后缀没关系,你可以给脚本取名叫不带后缀的Multiwfn(便于兼容已经写好的脚本),放在任何PATH目录里,然后.bashrc里面那些初始化Multiwfn环境的东西就可以删掉了,保持.bashrc的干净
如果你给脚本取名叫Multiwfn,那么你直接在终端里敲Multiwfn就能干活儿了,还能把要打开的文件名作为参数直接打开,比如Multiwfn file.xyz
整个脚本就是一个套娃,对于用户或者其他脚本而言,外面的娃看上去是一个可执行的Multiwfn,实际上外面的娃只负责创建工作环境,真正干活儿的是里面的娃
个人建议,你可以在自己的家目录里创建一个bin文件夹,然后.bashrc里面加上
  1. export PATH=$PATH:/home/你的用户名/bin
复制代码
这样把一些常用脚本或者别处下载来的二进制可执行文件扔到这个bin里,想运行谁就运行谁



作者
Author:
pika02    时间: 2022-10-26 15:58
plus
按照这样的方法,还可以轻松实现g09和g16,orca4和orca5的共存
作者
Author:
Mikasa    时间: 2022-10-26 20:39
这个。在超算交作业不都是这么搞么
作者
Author:
lonemen    时间: 2022-10-26 21:09
感觉每次手动输入Multiwfn,也没啥麻烦的样子?
作者
Author:
牧生    时间: 2022-10-26 21:12
lonemen 发表于 2022-10-26 21:09
感觉每次手动输入Multiwfn,也没啥麻烦的样子?

作为懒癌晚期的我,要拼写挺长一串,还要切换大小写,很容易错。

所以,我直接复制一个Multiwfn,命名为m,所以,直接输入m也唤起Multiwfn
作者
Author:
lonemen    时间: 2022-10-26 21:23
牧生 发表于 2022-10-26 21:12
作为懒癌晚期的我,要拼写挺长一串,还要切换大小写,很容易错。

所以,我直接复制一个Multiwfn,命名 ...

哈哈,我是把首字母改成了小写m,你这,这,这,更牛。佩服
作者
Author:
pika02    时间: 2022-10-28 20:25
牧生 发表于 2022-10-26 21:12
作为懒癌晚期的我,要拼写挺长一串,还要切换大小写,很容易错。

所以,我直接复制一个Multiwfn,命名 ...

还是阁下比较懒,鄙人甘拜下风
作者
Author:
乐平    时间: 2022-10-28 22:47
牧生 发表于 2022-10-26 21:12
作为懒癌晚期的我,要拼写挺长一串,还要切换大小写,很容易错。

所以,我直接复制一个Multiwfn,命名 ...

用 Linux 系统不会用 Tab 键的么……
作者
Author:
agent99    时间: 2022-10-29 03:39
第一眼把mtf看成了wtf,我心想你为啥对这程序有这么大意见
作者
Author:
牧生    时间: 2022-10-29 07:21
乐平 发表于 2022-10-28 22:47
用 Linux 系统不会用 Tab 键的么……

会用,但终究还是因为懒
作者
Author:
mizu-bai    时间: 2022-11-23 15:56
想隔离环境也可试试我做的 Multiwfn Docker Image。
参见 Multiwfn on macOS




欢迎光临 计算化学公社 (http://bbs.keinsci.com/) Powered by Discuz! X3.3