计算化学公社

 找回密码 Forget password
 注册 Register
Views: 2066|回复 Reply: 4
打印 Print 上一主题 Last thread 下一主题 Next thread

[Material Studio] 关于MS的轨迹转化脚本运行速度的探讨

[复制链接 Copy URL]

25

帖子

0

威望

374

eV
积分
399

Level 3 能力者

快学快学,多好的东西

本帖最后由 rdcfm1223 于 2023-3-24 20:25 编辑

请问一下,我看了sob老师的博文http://sobereva.com/143 里面的给的针对粗粒化的转化脚本。
我单独做了两帧粗粒化,然后试运行了一下。导出效果可以在VMD中使用(sob老师大赞)。所以我就大胆地调用了,去读取我的全文件的轨迹。
然后,就出现了一个问题。我从昨天上午11点跑到了今天早上9.30。这个脚本还是完全么有停止的迹象。
请教下,这种情况是不是MS程序崩溃了呀。如图,他右下角的计算框一直在转啊转,而且MS的其他选项之类的不可用。左下角还提示我关掉脚本。
(MS没有崩溃,不是程序的问题)

如果不是MS程序的问题的话,我应该怎么提升这个脚本的运行速度呢。
初步的想法是这几个:
1、在外层循环的递增语句上由逐帧转化变为每隔10步转化下;
2、MS有没有限制核心调用之类的设定啊。我感觉MS在跑的时候,我其他应用没有卡顿,应该是核心没有跑满。看了一下任务管理器,MS只调用了我13%左右的cpu,内存调用甚至没有我的edge浏览器调用的多。
(发帖更改:好像有这方面的设定,但是似乎只能在运行MS内置计算时的job control子页里设置,无法在pl脚本的运行中设置?我通过copy script命令复制来一下,但是没有看到相关的cpu核数设定)
(发帖更改:对不起,我好像找到了。Tools-Scripting-Script job 里面可以设置,我再跑跑看)
(我设置了12个核心,反而比1个核心的cpu占比更低了,速度并没有快很多。又跑了一天多了)

之后还想按照论坛里hxd_yi前辈在帖子里给的语法增加一个珠子受力的语句。只有坐标就已经很慢了,再加上受力感觉是不是要跑好久

另外,新手提问。是不是其实大家做计算化学,就是要很耐着性子的等待
所以,如果速度实在是提升不了,有没有啥方法能够让我至少知道他跑到第几帧了,还大概要等待多久呢。我昨天2帧很快啊。1分钟。我就以为我这个600帧的大概也就10个小时。晚上满怀着期待的心情等了很久

如何将Material_Studio的xtd文件中原子的受力信息导出
http://bbs.keinsci.com/forum.php ... 10903&fromuid=45524
(出处: 计算化学公社)

看了一下,好像perl可以有多线程编程。有会的大佬嘛?请大佬们不吝赐教
(ps:我一开始是以为中间有delay之类的延时设定,想将这个数值减少一下,结果发现老师的脚本里面就是一个嵌套循环,没有设定延时的语句)






25

帖子

0

威望

374

eV
积分
399

Level 3 能力者

快学快学,多好的东西

2#
 楼主 Author| 发表于 Post on 2023-3-11 21:51:19 | 只看该作者 Only view this author
本帖最后由 rdcfm1223 于 2023-3-24 14:23 编辑

哈!盲目地等待大神是没有结果的!
我研究了一下文件的状态:脚本一开始运行,就能够产生结果文件。但是在我2帧的试运行轨迹转化脚本运行的时候,等到脚本运行完成之后,这个结果文件才会有内存大小。我猜测了一下,sob老师的代码要一直跑,一直等到所有的数据都在MS的文本图像中写出,才会一股脑地写在创建的trj.txt里面。造成2帧用2分钟,但是600帧跑60小时不出结果的原因,大概是在首先是MS脚本运行界面缓存过多数据(我估计涉及一点写放大),其次还有时间长了笔记本降频(小小的吐槽一下我的老板让我自备生产力工具)。
带来的其他后果就是:一旦中断就前功尽弃,以及我没法知道现在跑了多少帧,还要等多久。茫然的等待让我很焦虑。
我开始尝试在脚本代码里加入一些,在图1中所示的框里显示当前帧数的命令,以便至少知道自己跑到哪一帧,需要等待多久。但是很快发现。这个命令基本无效。因为,如果不把脚本跑完!,MS是会一直显示待输出数据(如图2!),根本看不到当前帧数。
所以我做了一个很大胆的改动,我让他每一帧都生成一个文件吧。至少,我知道跑到哪里,即使运行中断可以保留之前的轨迹。还可以通过改framebegin和frameend续跑。啊哈!
改过的aha脚本实测可以每一帧都保留成单独的文件。我自己改了一点,很有成就感,所以,我也在代码里加了自己的名字。虽然今天看了一点AIMD的公式感觉自己离SOb老师还差得远,但是,留点脚印嘛。

个人总结:1、MS可以先在软件内播放,确定大致的自己需要的轨迹长度。第一次练手,我跑了30000步,50一输出傻傻等转换。
如果不要求分析的话,点击菜单栏“File”—“Export”,选择动画导出的路径。在对话框“保存类型”处选择“Movie Clip(*.avi)”可以导出动画。导出路径不能有中文,会报错。
点开.xtd文件,菜单栏“View”—“Toolbars”—“Animation”,然后就会看到轨迹按钮。
2、我改的脚本是1帧一个文件,我写帖子的时候才想到,我可以分大段跑,这样短一点。当然,一帧一帧导出,数据保存肯定最不容易前功尽弃(自我安慰)
3、接下来要做的是加一个tcl脚本,看能不能傻瓜化把txt文件的格式改成xyz,顺便给VMD加一个一键导入文件夹内部所有轨迹到一个体系的脚本。一个一个改名字,一个一个导入估计也很窒息。或者可以想办法把多帧txt合并成一个txt
4、虽然不用担心数据,可以看到跑到哪里,但是运行速度还是没法保证。不知道啥时候有空再学perl线程吧,现在多线程还看不太懂。

1678542145829.png (77.08 KB, 下载次数 Times of downloads: 31)

图一

图一

1678542165238.png (141.18 KB, 下载次数 Times of downloads: 26)

图二

图二

XTDbead2xyz_aha.pl

1.59 KB, 下载次数 Times of downloads: 4

我称之为aha

25

帖子

0

威望

374

eV
积分
399

Level 3 能力者

快学快学,多好的东西

3#
 楼主 Author| 发表于 Post on 2023-3-23 21:16:19 | 只看该作者 Only view this author
本帖最后由 rdcfm1223 于 2023-3-24 16:11 编辑

一、aha使用效果
在使用每一帧都进行单独轨迹导出的方式进行之后,我的程序运行相对良好。可以看到目前进度,并且已经跑完的数据有了较好的保存,可以通过修改脚本的起始帧数来进行续跑。
本次任务我多核1天9H跑完了所有帧。整体数据量超过我之前没有使用aha方式时试图导出的数据量,但是上一次的数据在整体读取完毕之后才会写入txt文件。4天多都没跑完。所以,如果可以的话还是建议单帧跑,单帧记录,再通过其他技术合并。

二、MS脚本运行单多核使用体感
在顶部工具栏中,使用Tool-Scripting-Script Job,可以自主设置运行脚本使用的核数。在单核的情况下,第一帧的运行时间大概是7分钟,但是第二帧的运行时间就出现了CPU降频,20分钟第二帧仍然没有跑完。但是多核虽然同样的数据因为要分配到多核心所以要慢一点,单帧要9分钟左右。但是并不会因为长时间的运行而产生降频的现象

三、合并多帧txt的外载手段:调用dos命令:type
另外,在CMD控制台中,通过linux命令进入当前项目文件夹。可以通过type *.txt >>D:\merge.txt类似的命令来调用。将多个txt合并为一个完整的txt,完整TXT名字为merge,出现在D盘的根目录里。如果不在输出文件名之前加载D:\的话,就会出现在当前目录下。同时,经过尝试,.txt文件后缀并不是唯一的。我们可以在type命令中直接整合为.xyz文件,即使用type *.txt >>D:\merge.xyz。我也尝试在perl脚本里直接创建.xyz文件,但是不成功。所以,还是不可避免的有一个转换文件的步骤。dos命令type也可以将.xyz文件合并和转化格式。

四、type命令执行顺序问题:需要注意的是type命令会按照首字母排序。按照我缩写的程序,每一帧的文件名为1-201.则在type命令下。他会按照大概1、10、100、101~199、2、20、200、201、21、22……的顺序来排列。所以通常899(可谓非常严谨)帧以内,只看最后合并的txt,会以为是只合并了1-99的文件。
解决办法有两个:
1、每100个合成一次。比如1-99.100-199这样多次合并后,再将结果文件执行二次合并。
2、我们可以将1命名为001.这个可以通过在脚本里分别提取帧数的百位、十位、个位来命名文件或者进行高位补零,以避免忽略百位和十位上的“0”。


五、type排序问题的解决尝试
1、尝试通过类似print的手段,将New出来的txt名字用%i%i%i来代替。分别通过floor()和%来求取百、十、个位的数字。然后用New(“%i%i%i.txt”,$hundred,$ten,$one)的命令。哈哈哈,报错了,New只能跟一个参数。
2、因为perl语言的一些问题或者学艺不精,将整形数字$frame通过$name=(“%04d”,$frame);$name=("%04s","frame");等手段转换为高位补零的字符串name,再将name作为新建文件的名字,即New("$name.txt");不太可行。第一帧生成的文件名始终为1.txt
3、最终解决办法是,通过$name="$frame";来将frame数字转化为字符串。然后调用length()命令来判断$name的长度。然后通过$name="00".$name;和$name="0".$name;两个语句对个位数和十位数的字符串进行补长。狗血的事情发生了。perl不内置switch语句!如果是常规系统可以使用cpan来增加这个模块。但是,MS里面应该咋加?不知道。只能很丑陋的:if(length($name)==1){}。虽然最后成功了就是了。


六、友情提示
建议应该将这些txt拷贝到单独的盘的根文件夹,不然按照MS的运行逻辑,要进入很多个名字很长很复杂的文件夹,要不停的cd。很痛苦不妨在磁盘根目录下建立一个专用文件夹,比如我在D:下建立一个名为combine的文件夹。









1679644858849.jpg (11.02 KB, 下载次数 Times of downloads: 30)

1679644858849.jpg

Xtd2XyzWith001_aha.pl

2.58 KB, 下载次数 Times of downloads: 5

嗯,也是很aha

25

帖子

0

威望

374

eV
积分
399

Level 3 能力者

快学快学,多好的东西

4#
 楼主 Author| 发表于 Post on 2023-3-27 16:57:35 | 只看该作者 Only view this author
很痛苦。在学Sob老师的分子动力学教程。看到tcl语言里面有这样的命令:
$sel writexyz "[format %05d $num].xyz"
直接完成00000.xyz文件的命名。。我仿照语句在perl里试了一下。不行。

2

帖子

0

威望

11

eV
积分
13

Level 1 能力者

5#
发表于 Post on 2024-4-3 09:17:45 | 只看该作者 Only view this author
请问楼主解决了计算速度吗?我用脚本计算选择32核但是cpu只占用6,望回复!谢谢

本版积分规则 Credits rule

手机版 Mobile version|北京科音自然科学研究中心 Beijing Kein Research Center for Natural Sciences|京公网安备 11010502035419号|计算化学公社 — 北京科音旗下高水平计算化学交流论坛 ( 京ICP备14038949号-1 )|网站地图

GMT+8, 2026-2-26 00:10 , Processed in 0.266219 second(s), 29 queries , Gzip On.

快速回复 返回顶部 返回列表 Return to list