ie传递给系统调用的数据区域太小_lammps 调用python 和 shell

 之前用lammps做模拟的时候,弄过一些比较麻烦的操作,虽然可能这些用处不大,现在也分享分享。  比如有一个情况:我想在模拟的中途,选定一个区域中的原子,或者在一个位置插入一个原子,但是这个区域不是很固定,我们必须分析lammps输出的文件才能确定这个区域或者位置。   那么我们可以想到lammps中的两个命令 python 和 shell,这两个命令可以调用外部程序。 python命令相当于是调用一个外部的python函数,有传出参数也有返回值的。python可以直接处理数据,也可以进行系统调用(也就是python再调用shell,这样你写的任何能跑的代码都可跑),当然将代码弄成一个python库文件(函数)也是可以的,比如Fortran生成一个python库有现成的工具f2py; 至于shell命令,想调用啥都可以,shell脚本、你写的任何程序等等,但是lammps的shell命令可以传出值没有返回值,但是我们可以用shell + include 这两个命令生成并调用我们想要的任何的lammps命令语句(骚操作)。       下面我们介绍它们的用法:一、lammps调用python   想调用python,必须在编译的时候将python接口编译进去,lammps目前支持python2和python3。   我们假设系统已经安装了python,并在环境中生效。我们进入lammps源代码包中src目录,执行make yes-python,然后执行make -j 6 mpi,于是产生了一个可用python命令的lammps执行文件lmp_mpi。     现在我们可以在lammps 脚本中使用python命令了,他的基本语法是这样的:
python func keyword args ...
      其中 func是你要调用的python函数,这个函数必须与你在独立的py文件或者在lammps输入文件中定义。        那么 keyword 则可以是 invoke(如果调用外部的py文件,必须invoke一遍); keword 也可以是 input 定义向python 函数传输的数据; return 则定义从python函数中返回的数据 举两个具体的例子    其一:
variable f python pForcepython pForce input 2 v_x 20.0 return v_f format fff  file force.pypython pForce invoke
    这里调用了一个名为pForce的函数,那么这个函数要在force.py这个文件里有函数实体。input后接的2,表示这个pForce函数应该有两个输入参数,即v_x 和 20.0。另外还有一个返回参数(只能有一个),还指定了其格式为三位浮点数。于是在 force.py里边应该有 def pForce(a,b) 然后还要return c 。    其二:
variable fac python factorialpython factorial input 1 myN return v_fac format ii here """def factorial(n):  if n == 1: return n  return n * factorial(n-1) """
     这个例子就直接将python函数写在input脚本里,用三对引号包起来。    以上我们简单介绍了一下python函数的调用,然而实际使用的时候,python函数在哪里被调用呢?在我的实际使用中,我发现只有在后续脚本中调用python命令那一行中涉及的变量试,这个python函数就会被执行一遍,比如"print ${fac}"      至于将lammps编译成python的lib,可以实现更多的操作,这个以后有机会再和大家一道学习。二、系统调用(shell + include)      上述讲的python使用起来感觉还是有些麻烦,我们最初只是想从输出的构型文件分析出一些数据,然后再决定下一步lammps该运行什么参数。实际上我们直接用shell命令进行系统调用,然后生成一段lammps的命令,然后再在当前运行的lammps脚本文件include 这个用shell(或其调用的程序)生成的这段lammps脚本。实例:
shell bash ./test.shinclude in.test
我们通过系统调用了bash这个解释器,去解释执行test.sh,而test.sh是一个shell脚本文件。那么这个test.sh可以包含各种系统带的命令,也可以执行用户自己编译的c或者Fortran程序。在这个例子中,test.sh 运行后必须生成一个包含正确lammps命令的in.test文件。      当然lammps中的shell命令后边接的内容,其实就如同是在Linux终端中执行的命令一样,比如我编译了一个叫做my_setup的程序,那么我们可以这样:
variable n equal 10variable foo string file2shell my_setup file1 $n ${foo}
   其中$n ${foo}会在执行的时候被“翻译”成其变量值,进而传递到my_setup中,可见lammps中shell命令可以向外传递参数,但是不能返回参数,我们只能用in.clude的方式曲线救国了。    与python调用不一样的是,shell调用是当前行就执行的,即这一行给了条shell命令,它就在这一行运行一次,不存在其他命令调用shell命令的参数一说。如果需要模拟多少步就执行一次,可以和lammps的run every命令一起服用。~~~内容到此为止~~~喜欢可以点在看~~~送上科研小福利:https://github.com/rougier/matplotlib-cheatsheet ee30730fe020528797d30a3a53e4c4a0.png还有:https://github.com/Pjer-zhang/matlabPlotCheatsheethttp://home.ustc.edu.cn/~pjer1316/matlabplot/ 70dfb404b779295bd4569e71c91393b8.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值