计算化学公社

标题: 如何批量生成gjf文件? [打印本页]

作者
Author:
算一算    时间: 2019-3-1 02:03
标题: 如何批量生成gjf文件?
本帖最后由 算一算 于 2019-3-1 02:16 编辑

想在Linux上生成一大批相似的gjf文件,每个文件其它部分相同,只有角坐标里的角度、chk文件名、gjf文件名不同。
期待结果:某个特定的角的角度从20°开始,每隔两度生成一个文件,直到60°。相应的%chk=20,%chk=22,...直到60。gjf文件名也是相应的从20到60。文件的其它部分都保持不变(当然,受那个角影响的其它角也会变。但是二面角不变,因为是平面三角形分子。成键的键长都不变。)
这个脚本应该怎么写?

如果嫌麻烦,可以先不考虑角度的问题,就假设角度都不变,只有chk和gjf名字从20变化到60,批量生成这样的gjf的脚本该怎么写?

P.S. 我这台机器上的python有问题,好多python脚本跑不了,所以只能用python以外的东东。

作者
Author:
一颗赛艇    时间: 2019-3-1 02:20
柔性扫描
作者
Author:
算一算    时间: 2019-3-1 02:33
一颗赛艇 发表于 2019-3-1 02:20
柔性扫描

不是,我说的是要批量生成输入文件
作者
Author:
liyuanhe211    时间: 2019-3-1 03:05
这种问题描述方式不禁让人觉得是在直接让人免费给写脚本,而自己并没有学习写脚本的意愿(或意愿很有限)。否则根据经验,通常相应提问者的问题会是更为细化的子问题。文件名该怎么命名都说好了,自己让别人写代码连Python运行的问题都不愿自己搜索解决,咋跟产品经理似的。

这种脚本并不十分容易从头写好,随便写出一个来还比较容易,但转变角度时如何让分子其他部分一同运动需要仔细思考,并且为了脚本编写的简单,最好还得给出分子结构有哪些限制(脚本的需求应该细化),可以避免处理很多边缘情况。

编程没入门的话,还是自力更生学学如何用很低级别的方法做柔性扫描,比如分子力场级别学学Amber、半经验级别学学xTB或者MOPAC,然后用这些级别极快的做一个柔性扫描,写一个脚本将上述程序中柔性扫描的结果提取出来生成Gaussian的输入文件。
作者
Author:
liyuanhe211    时间: 2019-3-1 03:13
liyuanhe211 发表于 2019-3-1 03:05
这种问题描述方式不禁让人觉得是在直接让人免费给写脚本,而自己并没有学习写脚本的意愿(或意愿很有限)。 ...

被问题描述带偏了,如果你并不是对程序本身感兴趣,了解一下gentor。

再次,如果不是对程序本身感兴趣,只是想用这个办法来实现柔性搜索,请知悉这样做柔性搜索会浪费很多CPU time(虽然在并行上有可能会节约wall time)
作者
Author:
算一算    时间: 2019-3-1 03:17
liyuanhe211 发表于 2019-3-1 03:05
这种问题描述方式不禁让人觉得是在直接让人免费给写脚本,而自己并没有学习写脚本的意愿(或意愿很有限)。 ...

python的问题真不是我能解决的,我没权动这机器上的软件。
学写脚本当然不是一下就能学会啊,如果我都会了我也不会来问了,而且我也说了可以忽略细节啊,角度那些可以先不考虑,先考虑批量生成文件和文件名的事。文件名当然得想好了啊,要不然我该怎么描述这种状况?直接说文件名难道不是更清楚吗?你也说了,需要我提供足够的细节,那我这个不是已经最清楚了吗?
我就是想知道这个任务能用那些指令完成,如果有人提供了批量生成这种文件的指令,那我就可以把这种指令套在键角上用,其它键角怎么改我自己慢慢想就得了。
至于那个扫描,这个不是我拿到的任务,我做了也没用。
作者
Author:
sobereva    时间: 2019-3-1 03:35
除非每次要改变的那个变量在内坐标下直接有对应的定义,此时通过写shell脚本可以通过循环每次修改那个变量,否则没有简单办法可以实现。如果那个变量是二面角,相对而言最简单的办法就是用molclus里的gentor,直接产生记录了不同二面角的xyz文件,然后写个脚本/程序(也就20行左右)将之转化成gjf。
作者
Author:
算一算    时间: 2019-3-1 03:52
sobereva 发表于 2019-3-1 03:35
除非每次要改变的那个变量在内坐标下直接有对应的定义,此时通过写shell脚本可以通过循环每次修改那个变量 ...

我最主要就是想知道这个大批量生成gjf文件的脚本怎么写,20行的是什么语言,awk还是bash?感觉20行有点多啊,是因为只用一种语言所以导致行数这么多吗?是不是要用到for($i=1;$i<=$#s;$i++)这种东西?
作者
Author:
liyuanhe211    时间: 2019-3-1 04:50
算一算 发表于 2019-3-1 03:52
我最主要就是想知道这个大批量生成gjf文件的脚本怎么写,20行的是什么语言,awk还是bash?感觉20行有点多 ...

20行有点多。。。牛
作者
Author:
liyuanhe211    时间: 2019-3-1 05:08
本帖最后由 liyuanhe211 于 2019-3-1 14:23 编辑
算一算 发表于 2019-3-1 03:17
python的问题真不是我能解决的,我没权动这机器上的软件。
学写脚本当然不是一下就能学会啊,如果我都会 ...

。。。还把问题改了,就想问个重命名问题扯什么键角。

这就跟问“怎么把我家房子从海南移到北京,再刷刷墙”,人家给你解释了一堆怎么把地基挖出来,怎么把公路网都重建了,又说,移动房子嫌麻烦的话可以先不考虑,就说一下怎么刷墙吧。
浪费时间。

和你上个问题一个德性,人家给你计算了半天,你来一句:忘了说了啊、是带十个正电荷的正离子。Frustrated.

作者
Author:
sobereva    时间: 2019-3-1 05:08
算一算 发表于 2019-3-1 03:52
我最主要就是想知道这个大批量生成gjf文件的脚本怎么写,20行的是什么语言,awk还是bash?感觉20行有点多 ...

shell或者Fortran都可以,其它所有语言也都可以,会什么用什么,用不着混编
作者
Author:
Mikasa    时间: 2019-3-1 05:28
你在自己的用户下也没权限?机器上的Python有问题不代表你不可以在自己的用户下安装一个只给自己用的!
你自己分析的这么明白要怎么操作,那为啥不去Google搜一下呢,关键词都你自己都提炼出来了“Bash shell 如何替换文件中某一行”!20行还嫌多?那感觉你这“大批量gjf”也可以直接手动来写了<手动滑稽>

bash shell用不了20行,一个数组、一个do循环、一个cp、一个sed -i -e替换也就能搞定了。<当然,要是这几个也嫌多不想学那是没招了,直接找个“愿意”给你写脚本的吧。>

作者
Author:
archer    时间: 2019-3-1 10:06
任何编程语言都可以啊,不一定非要python啊?fortran也方便
作者
Author:
算一算    时间: 2019-3-1 14:45
liyuanhe211 发表于 2019-3-1 05:08
。。。还把问题改了,就想问个重命名问题扯什么键角。

这就跟问“怎么把我家房子从海南移到北京,再刷 ...

不知道你说的什么意思,编辑问题怎么就不行了?我让问题的语言更妥当一点还不行?难道问题就不能修改一下,打错字都要留着?
我要做的这个任务就是让键角从20°到60°,为什么不能说?这是批量生成gjf的目的。
就事论事,这个问题和我以前的问题一点联系也没有。
作者
Author:
算一算    时间: 2019-3-1 14:46
liyuanhe211 发表于 2019-3-1 04:50
20行有点多。。。牛

如果不包含输入文件的内容的话,这个不多么
作者
Author:
算一算    时间: 2019-3-1 14:56
Mikasa 发表于 2019-3-1 05:28
你在自己的用户下也没权限?机器上的Python有问题不代表你不可以在自己的用户下安装一个只给自己用的!
你 ...

我没有动软件的权限,那个机器给我的是临时账户,我也就是给人代课用这一次。
我没google一下是因为我根本不知道要google哪些内容啊!你说的这几个点我倒是可以去搜一下,不过你能再说详细一点吗,那个数组的操作是叫什么操作?“一个cp”具体有哪些关键词可以搜?
作者
Author:
算一算    时间: 2019-3-1 14:59
sobereva 发表于 2019-3-1 05:08
shell或者Fortran都可以,其它所有语言也都可以,会什么用什么,用不着混编

如果用shell的话,有哪些关键词?我不清楚这个自动修改gjf里的数字的操作包括哪些关键词可以用
作者
Author:
算一算    时间: 2019-3-1 15:00
archer 发表于 2019-3-1 10:06
任何编程语言都可以啊,不一定非要python啊?fortran也方便

没说非要python,我是说python用不了,所以要考虑别的。Fortran我看了一下,好复杂,你能说一下那里面有哪些关键词是和我这个任务相关的吗?
作者
Author:
算一算    时间: 2019-3-1 15:08
liyuanhe211 发表于 2019-3-1 03:13
被问题描述带偏了,如果你并不是对程序本身感兴趣,了解一下gentor。

再次,如果不是对程序本身感兴趣 ...

我已经说了,你给的这个扫描的建议我无法接受,这个不是我要做的任务,我就是做了也没用,而且你也知道扫描要非很多时间。如果我有别的选择也不会来问这个问题。
我又看了一遍你的各种回复,感觉你一直就是在恶意揣测我。我就是问个问题想找到解决这个任务的方式,你至于不停地恶意揣测吗?我问题已经描述得很清楚我要做的是什么了,而且为了简化问题,已经说了简化方案了,只要愿意提供帮助的人让我知道有哪些关键指令,就跟公式一样,把键角什么的往那上面一套就行了。

作者
Author:
tjchkj    时间: 2019-3-1 16:08
20行确实够的,楼主这个想法是对的,至少说明他动了很多脑子了,我孩子就是早就用自动生成的办法做了上万个gjf了,但他是自己编的小程序,应该很短,说20行业是差不多的。
作者
Author:
算一算    时间: 2019-3-1 16:23
tjchkj 发表于 2019-3-1 16:08
20行确实够的,楼主这个想法是对的,至少说明他动了很多脑子了,我孩子就是早就用自动生成的办法做了上万个 ...

能提供几个关键指令吗?我现在完全不知道该用哪几个指令让它自动生成
作者
Author:
highlight    时间: 2019-3-1 16:28
算一算 发表于 2019-3-1 14:56
我没有动软件的权限,那个机器给我的是临时账户,我也就是给人代课用这一次。
我没google一下是因为我根 ...

任何账户都可以给自己装软件,这是显然的。不过这个和你现在的问题无关。
我可以简化一下他给你的命令,如果只是想修改文件名和chk文件名的话,我还可以给你写个bug:

1. 写一个gjf做模板,就叫 template 好了,里面有若干干行:
  1. aaa
  2. sss
  3. %chk=ddd-num.chk
  4. fff
复制代码

2. 直接输入三行命令:
  1. for i in ·seq 0 60 2·
  2. do sed -i "3s/num/$i/g" template > file-$i.gjf
  3. done
复制代码


以上过程中命令存在明显的错误
如果你想证明自己不是想找人写脚本的话,你自行搜索修复
不用 google,百度然后开菜鸟教程的链接就行

PS:大家在这儿又是python又是fortran的,纠结的是怎么直接生成角度渐变的结构,而不是如何连续生成文件。你也看到了,这真不是什么有营养的问题。关于生成结构,没必要重复造轮子,7楼社长的回复已经很好了,你可以在上面过程的基础上实现一下,我觉得可能真到不了20行。

作者
Author:
tjchkj    时间: 2019-3-1 16:54
本帖最后由 tjchkj 于 2019-3-1 16:57 编辑

这个就是角度渐变的gjf文件,每隔2.5度做一个gjf。在gaussian view中自动去按照间隔改变角度,然后自动存文件。
作者
Author:
tjchkj    时间: 2019-3-1 17:00
其实,你这个只有40度的间隔,每隔2度形成一个文件,只有20个文件就够了,还用的上编程?我们都是一个分子就73个文件,同时做几十个分子,形成几千上万个gif才需要编程。
作者
Author:
算一算    时间: 2019-3-1 18:02
highlight 发表于 2019-3-1 16:28
任何账户都可以给自己装软件,这是显然的。不过这个和你现在的问题无关。
我可以简化一下他给你的命令, ...

谢谢提供关键词,这个seq确实能够实现文件里chk名字的不断变化,以及gjf名字的变化。等了这么久,终于看到能用的关键词了。我还没有把这个套用在角坐标的值上,不过我隐约感觉是可以的,我再想想。如果你觉得还有其它的关键词也可以实现同样的任务,也欢迎说出来。我会选出一个跑起来最省时的。你PS里说的对,有人纠结的点是错的。我在问题里已经强调生成文件是主要问题。键角我的话我还得再想想另外两个相关的键角要怎么变。
作者
Author:
算一算    时间: 2019-3-1 18:09
tjchkj 发表于 2019-3-1 17:00
其实,你这个只有40度的间隔,每隔2度形成一个文件,只有20个文件就够了,还用的上编程?我们都是一个分子 ...

嗯,你们这个量确实比我的大,但是我代的这门课,我不想让本科生在gaussview上一个一个生成文件,因为太费时间了,这门实践课还有好几个事情要完成,不能把时间费在这一个项目上,再说这个项目的目的是让他们查看不同角度下分子性质的变化,我希望他们把时间花在这个上,而不是费时间生成文件。我不想拖堂。
你能提供几个关键词吗?比如22楼提供的seq就很有用,如果你能提供其他的,我都会去试试,最后找一个跑起来最快的。
作者
Author:
highlight    时间: 2019-3-1 20:30
算一算 发表于 2019-3-1 18:02
谢谢提供关键词,这个seq确实能够实现文件里chk名字的不断变化,以及gjf名字的变化。等了这么久,终于看 ...

我觉得你会错意了
真不是什么有营养的问题
指的就是“生成文件”这个问题。
相反直接生成渐变结构,虽然有重复造轮子的嫌疑,但确实看上去比较“有趣”。
如果你觉得还有其它的关键词也可以实现同样的任务,也欢迎说出来。
当然有换汤不换药的其他写法,但请你搞清楚,是我再给你留作业(代码改错),不是你给我。
我会选出一个跑起来最省时的。
我不知道你有没有去搜索,但你八成没有运行过这段代码。它运行的时间绝对比你敲键盘的快。
键角我的话我还得再想想另外两个相关的键角要怎么变
人家给你计算了半天,你来一句:忘了说了啊、是带十个正电荷的正离子。
感觉这两句看上去就很搭。

如果你的问题可以简化为7楼的第一句,真的不需要什么其他关键词了。
如果从看到我的回复开始直接干,现在估计早就解决了。

作者
Author:
Mikasa    时间: 2019-3-1 22:46
算一算 发表于 2019-3-1 14:56
我没有动软件的权限,那个机器给我的是临时账户,我也就是给人代课用这一次。
我没google一下是因为我根 ...

倒是去搜啊
最简单的就用Google搜“xxx如何用shell实现”,你肯定能找到某个能满足你要求的“关键词”
有这问关键词的功夫脚本早写完了,即使是想用Python也早搞定了
作者
Author:
vizq    时间: 2019-3-3 12:02
tjchkj 发表于 2019-3-1 16:54
这个就是角度渐变的gjf文件,每隔2.5度做一个gjf。在gaussian view中自动去按照间隔改变角度,然后自动存文 ...

请问这个操作如何在gaussview中实现?
作者
Author:
tjchkj    时间: 2019-3-5 20:05
vizq 发表于 2019-3-3 12:02
请问这个操作如何在gaussview中实现?

先定义二面角的4个原子,然后手动输入二面角的角度,然后存下gjf,这一步只能是手动了
作者
Author:
vizq    时间: 2019-3-7 12:08
tjchkj 发表于 2019-3-5 20:05
先定义二面角的4个原子,然后手动输入二面角的角度,然后存下gjf,这一步只能是手动了

手动一个一个的做我会,就是“自动去按照间隔改变角度,然后自动存文件”这两个自动不会
作者
Author:
lonemen    时间: 2019-3-20 09:17
嗯,shell好强大呀
作者
Author:
haos314    时间: 2019-3-24 18:21
算一算 发表于 2019-3-1 14:46
如果不包含输入文件的内容的话,这个不多么

OJ一道题少的三四十行,多的一百来行,20行绝对不多
如果是项目的话,2000行都只能称之为“一个很小的项目”
作者
Author:
hxd_yi    时间: 2019-4-16 21:45
不考虑角度问题的话,
for i in `seq 20 2 60`; do cp orig.gjf $i.gjf; sed -i "s/%chk.*/%chk=$i\.chk" $i.gjf; done




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