matlab mat文件变成图片_Lammps使用经验谈之MATLAB后处理接口

    在lammps使用过程中,经过计算可以得到每一步原子坐标、速度等信息。该信息可以使用dump命令输出到*.lammpstrj中。接下下可使用ovito或vmd等进行表征等工作。而对于一些物理量计算的工作,还需要使用者学会使用一门编程语言。得益于本文作者自动化专业出身及数学建模经验,在使用过程中,作者摸索出一套matlab处理*.lammpstrj文件的方法。在此与广大网友分享。因作者数学计算的思路,所有处理都是将数据理解成为了一个大的矩阵。每次输出则产生一个新的矩阵,矩阵行数为体系(或输出组群)的原子数,列数为dump命令设置所得。一、matlab读取*.lammpstrj文件     *.lammpstrj文件的生成可使用lammps中dump命令。需要注意的是要知道输出内容,也就是输出了几列数据。比如我的程序是:dump        11 water custom 100 water.lammpstrj id type x y z vx vy vz    则表示每100步在water.lammpstrj文件中生成8列新的数据,数据行数就是我的water组群的原子数。    国内很多用户都是在ubuntu操作系统下使用lammps。这里我也安装的是linux版本matlab。具体安装方法可查阅官方说明或csdn相关介绍。这里简单介绍一下启动方法。A  窗口方式在terminal中输matlab即可打开窗口 5034b7934ea5f67ed239991b53ed4dde.pngB  命令行方式在terminal中输入matlab –nodesktop–nosplash i     0011386d40fb51e84dfc05db266ca4ba.png    无论以上哪种方式,注意修改工作路径。最好的方法就是在*.lammpstrj文件所在文件夹中打开terminal。接下来进入matlab工作。读*.lammpstrj文件前需要先写一个新的函数。将以下程序段保存成*.m文件即可: bc517a1b460004aa90580c0ddab624c1.png 注意:使用前修改*.lammpstrj的文件名,和Ncol的数值。 我这里的文件名是water.lammpstrj,数值列数为8。 我这里将程序保存成impact_readdump.m文件了。    以读取lammps第1次到第10次输出为例,在matlab命令窗口中输入impact_readdump(1,10),则程序运行。这里1为数据读取的开始步数,10为结束步数。也可以理解为拍电影时的“帧”。 df6ed219e83342f06541ab6f777e85cd.png    运行结果如上图。每读一次数据则在command window中显示所用时长。对结果没有质疑的情况可将上述程序中的tictoc 删去。程序运行后会在硬盘文件夹中生成一个新的文件夹./res,其中生成了一些新的文件data*.mat。可以在matlab/current folder当中查看,也可以在文件窗口中查看。该文件为matlab独有数据文件格式。“*”为数据的步数(帧数)。双击一个*.mat文件,在右侧workspace中出现data,再双击,可以看到: b43c09ac6b10ca68769ced8da8ddc0a0.png    再比对water.lammpstrj文件,可以看到所有数据都读到了matlab中,并且数据与water.lammpstrj中的完全一致(上图左与右)。二、使用matlab对数据进行选取等操作    上一步实现了matlab对*.lammpstrj文件中原子信息的读操作。而科学计算的目的是要用这些原子信息再加工推导出更深的理论。因此对*.mat文件的操作就显得更重要。    由于每位使用者的计算目的不同,计算的任务不同,所使用的计算公式、算法均不同本文不能把所有情况列举。涉及具体工作同学可以根据具体问题查找具体公式、设计算法,或者参考具体文献。还有一种方法,在非计算机类专业同学中我发现并不流行,就是使用github。具体方法并非本文重点,不做介绍。在此只介绍几个最基本的数据操作。1.  载入数据    current_data =load(strcat('./res/data',num2str(i),'.mat'));该命令将./res/data*.mat读入workspace。这里i为作者设置的for...end循环的层数,也即要处理的数据的帧数。由于我的数据保存名为data,在下面的操作中,涉及原始数据的地方都要用current_data.data的格式。这里的“.”相当于结构体。有兴趣的读者可参阅matlab教材。2.  查找某个条件并对其操作 6266fabbdd7d58e86d1c6ab58fc194d1.png    一般的非计算机类专业同学都习惯使用双层循环或判断进行数据查找等工作,这样做在实际操作中比较浪费内存。    以上的程序我实现的是先将z方向坐标小于等于2的原子的行数都查找出来,放入setdata矩阵(实际上setdata是列向量)中,相当于生成了一个数学上的子集。再判断出符合该条件的原子个数(注意setdata初始为空集,程序并不知道符合上述条件的原子个数是多少,所以用size计算一下)。最后把这些原子相对于(0,0)的x,y方向距离分别放到了distanceX和distanceY两个列向量中。    这段程序仅为举例。作者工作中也并没有使用这个功能。真正的科研工作可能还需要大家广泛阅读文献。欢迎各位老师同学联系作者交流合作! 源代码由吉林化工学院钱有程老师及华北电力大学王一峰同学共同参与完成 本文由吉林大学刘润老师原创,有兴趣的同学和老师可以直接联系刘老师liurun@jlu.edu.cn 学习更多MD知识 欢迎各位扫码关注

7ab3e26985007a5fb93bfb06c50c1402.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值