【LAMMPS翻译系列】region命令

region命令用于定义一个空间几何区域。

使用语法

region ID style args keyword arg ...
  • ID = 待定义区域的ID
  • style = delete / block / cone / cylinder / plane / prism / sphere / union / intersect
      delete = no args
      block args = xlo xhi ylo yhi zlo zhi
        xlo,xhi,ylo,yhi,zlo,zhi = 各个维度上的范围值
      cone args = dim c1 c2 radlo radhi lo hi
        dim = x or y or z = 圆锥台轴线方向
        c1,c2 = 圆锥台轴线在另外两个维度上的坐标值
        radlo,radhi = 圆锥台上下底面的半径
        lo,hi = 圆锥台轴线方向的范围值
      cylinder args = dim c1 c2 radius lo hi
        dim = x or y or z = 圆柱体轴线方向
        c1,c2 = 圆柱体轴线在两位两个维度上的坐标值
        radius = 圆柱体半径,可以使用变量
        lo,hi = 圆柱体轴线方向的范围值
      plane args = px py pz nx ny nz
        px,py,pz = 平面上一个点的坐标
        nx,ny,nz = 平面法矢坐标
      prism args = xlo xhi ylo yhi zlo zhi xy xz yz
        xlo,xhi,ylo,yhi,zlo,zhi = 平行六面体在各个维度上的范围值
        xy = y方向在x方向的倾斜值
        xz = z方向在x方向的倾斜值
        yz = z方向在y方向的倾斜值
      sphere args = x y z radius
        x,y,z = 球心坐标
        radius = 球体半径,可以使用变量
      union args = N reg-ID1 reg-ID2 ...
        N = 要进行并集操作的区域的数目,必须大于等于2
        reg-ID1,reg-ID2, ... = 要进行并集操作的区域的ID
      intersect args = N reg-ID1 reg-ID2 ...
        N = 要进行交集操作的区域的数目,必须大于等于2
        reg-ID1,reg-ID2, ... = 要进行交集操作的区域的ID
  • keyword = side or units or move or rotate
  •   side value = in or out
        in = 指定几何体内侧作为区域
        out = 指定几何体外侧作为区域
      units value = lattice or box
        lattice = 以晶格距离作为几何距离单位
        box = 以模拟盒子作为几何距离单位
      move args = v_x v_y v_z
        v_x,v_y,v_z = x, y, z 方向的位移量,equal类型的变量
      rotate args = v_theta Px Py Pz Rx Ry Rz
        v_theta = 旋转角,equal类型的变量,弧度单位
        Px,Py,Pz = 旋转操作的中心点
        Rx,Ry,Rz = 旋转轴矢量

使用举例

region 1 block -3.0 5.0 INF 10.0 INF INF
region 2 sphere 0.0 0.0 0.0 5 side out
region void cylinder y 2 3 5 -5.0 EDGE units box
region 1 prism 0 10 0 10 0 10 2 0 0
region outside union 4 side1 side2 side3 side4
region 2 sphere 0.0 0.0 0.0 5 side out move v_left v_up NULL

使用介绍

该命令用于定义一个空间几何区域。很多其他命令都会使用该命令定义的区域。举例来说,create_atoms可以在定义区域中创建原子,create_box命令可以根据定义区域定义模拟盒子,group命令可以将定义区域中包括的原子定义为一个组,delete_atoms命令可以将定义区域中的原子删掉,fix wall/region可以将定义区域的表面定义为壁面(boundary wall)。

大多数使用region命令所定义区域的命令都需要检测某个原子的位置是否在区域内。刚好在区域边界上原子被认为是属于所定义区域的。举个例子,对于一个球形区域而言,如果在定义的时候使用了关键字side in,那么球形区域表面上的原子就是该定义区域的一部分;如果使用了关键字side out,那么球形区域表面上的原子就不属于该区域的一部分。详细可以参考下面的side关键字。

一般来说,LAMMPS所定义的区域都是静态的,也就说所定义的几何空间范围并不会随着时间而改变。但如果使用了关键字move或rotate,如下文所要介绍的,区域就会变成动态的,也就是说所定义区域的位置和朝向会随着时间发生改变。在有些时候,这种动态区域是比较有用的,比如在使用命令compute temp/region对一个区域进行恒温,或使用fix wall/region命令将包含运动粒子的区域表面定义为壁面时。

delete类型:删除指定的区域。因为定义冗余的区域并不会占用太大的开销,所以一般不需要这样做,除非在你的输入脚本中定义了大量了区域。

block / cone / cylinder / prism类型中参数lo/hi的值可以指定为EDGE或INF。

  • EDGE是指所定义方向一直延伸到所在方向模拟盒子的边界。需要注意的是,这里所说模拟盒子的边界是指当前盒子的边界。换句话说,如果模拟盒子在模拟的过程中发生了改变,按着这种方式定义的区域并不会随着改变。
  • INF是指一个非常大的负数或正数(1.0e20),所以即便模拟盒子在模拟过程中发生改变了,使用该定义仍然能将其包括到区域中。
如果模拟盒子还没有创建,那么在使用region定义区域的时候就不能使用EDGE或INF(译注:这是显然的,因为EDGE和INF都是相对于模拟盒子来说的)。

对于prism类型的区域,如果某个倾斜因子不为0,那么它所对应的两个维度上lo/hi都不能设为INF。举例来说,如果xy倾斜因子设为非零,那么xlo/xhi和ylo/yhi都不能设为INF。

注意1:Regions in LAMMPS do not get wrapped across periodic boundaries, as specified by the boundarycommand. For example, a spherical region that is defined so that it overlaps a periodic boundary is not treated as 2 half-spheres, one on either side of the simulation box.

注意2:不论是否用dimension命令将模拟设为2d或3d,LAMMPS中所定义的区域总是三维的。所以在进行2d模拟时,你需要仔细定义区域,以使其与2d的x-y平面相交,并产生正确的交集区域。

cone类型(圆锥台):定义一个轴对称的圆锥台。除了要定义两个不同的底面半径,它的定义过程基本上与圆柱cylinder是一样的。两个底面半径都可以设置为0,但不能同时设为0.

cone和cylinder类型:参数c1、c2是轴线在另外两个维度上的坐标参数。如果dim=x,那么c1/c2分别对应y/z;如果dim=y,那么c1/c2分别对应x/z;如果dim=z,那么分别对应x/y。因此,上面第三个例子定义了一个圆柱体,其轴线沿着y方向,轴线坐标为x=2.0, z=3.0,半径为5.0,轴线范围是从-5.0到模拟盒子的上边界。

plane类型:定义一个过指定点(px,py,pz),法矢为(nx,ny,nz)的平面。所指定的法矢不需要是单位矢量。平面的内部(inside)是指法矢所指的那个半空间。

prism类型:定义平行六面体式的区域。其原点坐标为(xlo,ylo,zlo),从原点出发的三个基矢为A = (xhi-xlo,0,0); B = (xy,yhi-ylo,0); C = (xz,yz,zhi-zlo)。其中xy,xz,yz叫做倾斜因子,它们可以取0.0,正值,或负值。它们实际上是正交盒子变换为平行六面体时各个面的偏斜位移值。

如果要使用create_box命令,并以已经定义为prism类型的区域为范围定义三斜式的模拟盒子,那么倾斜因子(xy,xz,yz)不能超过各个维度上对应盒子长度的一半。举个例子,如果xlo=2, xhi=12,那么模拟盒子的长度就是10,这也就要求xy倾斜因子必须在-5到5之间。类似地,倾斜因子xz和yz必须在-(xhi-xlo)/2和+(yhi-ylo)/2之间。需要注意的是,这并不是一个限制,因为如果最大的倾斜因子应该是5,那么将其设置为-15, -5, 5, 15, 25……在几何上都是等效的。

sphere和cylinder类型中参数radius可以设置为equal类型的变量variable。如果设置为变量,那么其形式就要求是v_name,其中name是变量名。这种情况下,每个时间步都会计算变量的值,并将得到的值设为半径。

equal类型的变量可以使用很多数学函数来定义公式,也可以使用thermo_style命令中关键字。

union类型:创建所有列举出区域的并集区域。

intersect类型:创建所有列举出区域的交集区域。

注意:union和intersect类型的区域依赖于产生它们的每一个子区域,因此在定义union或intersect类型的区域后,不能删除这些子区域。


side关键字:决定所考虑的区域是所指定几何体的内部还是外部。通过将该关键字与union和intersect类型配合使用,可以构建复杂的几何区域。举个例子,如果将两个球体的内部分别定义成了区域,并对这两个区域使用类型为union,side=out的操作,那么所定义的区域就是整个模拟盒子之内、除了两个球体之外的所有空间。

units关键字:决定前面所列举的所有用于定义区域的长度量的单位。若取值box,坐标的单位就与命令units说指定的距离单位相同,比如units设为real或metal时,其单位为Angstroms。若取值lattice,坐标是以晶格距离为单位的,但前提是必须已经使用lattice命令定义了晶格距离。具体到不同类型,在不同维度上是不同的,如下:

  • block类型:xlo/xhi是以x方向的晶格距离为单位。类似地,ylo/yhi和zlo/zhi分别是以y和z方向的晶格距离为单位。
  • cone类型:lo/hi是以dim所在方向的晶格距离为单位。c1/c2则分别以另外两个径向维度方向上的晶格距离为单位。圆锥台上下底面的半径是以与c1对应的那个方向上的晶格距离为单位。
  • cylinder类型:lo/hi是以dim所在方向的晶格距离为单位。c1/c2则分别以另外两个维度方向上的晶格距离为单位。圆柱体半径是以与c1对应的那个方向上的晶格距离为单位。
  • plane类型:px和nx是以x方向的晶格距离为单位。类似地,py/ny是以y方向的晶格距离为单位,pz/nz是以z方向的晶格距离为单位。
  • prism类型:xlo/xhi是以x方向的晶格距离为单位。类似地,ylo/yhi和zlo/zhi分别是以y和z方向的晶格距离为单位。xy和xz是以x方向的晶格距离为单位,yz是以y方向的晶格距离为单位。
  • sphere类型:球形坐标x,y,z分别是以x,y,z方向的晶格距离为单位,球半径是以x方向的晶格距离为单位。

如果使用move或rotate关键字,那么所定义的区域就变成了动态的,也就是说它的位置和朝向是会随着时间发生变化。这两个关键字不能用于union或intersect类型的区域。

Instead, the keywords should be used to make the individual sub-regions of the union or intersect region dynamic. Normally, each sub-region should be "dynamic" in the same manner (e.g. rotate around the same point), though this is not a requirement.

The move keyword allows one or more equal-style variables to be used to specify the x,y,z displacement of the region, typically as a function of time. A variable is specified as v_name, where name is the variable name. Any of the three variables can be specified as NULL, in which case no displacement is calculated in that dimension.

Note that equal-style variables can specify formulas with various mathematical functions, and include thermo_style command keywords for the simulation box parameters and timestep and elapsed time. Thus it is easy to specify a region displacement that change as a function of time or spans consecutive runs in a continuous fashion. For the latter, see the start and stop keywords of the runcommand and the elaplong keyword of thermo_style custom for details.

For example, these commands would displace a region from its initial position, in the positive x direction, effectively at a constant velocity:

variable dx equal ramp(0,10)
region 2 sphere 10.0 10.0 0.0 5 move v_dx NULL NULL
Note that the initial displacemet is 0.0, though that is not required.

Either of these varaibles would "wiggle" the region back and forth in the y direction:

variable dy equal swiggle(0,5,100)
variable dysame equal 5*sin(2*PI*elaplong*dt/100)
region 2 sphere 10.0 10.0 0.0 5 move NULL v_dy NULL
The rotate keyword rotates the region around a rotation axis R = (Rx,Ry,Rz) that goes thru a point P = (Px,Py,Pz). The rotation angle is calculated, presumably as a function of time, by a variable specified as v_theta, where theta is the variable name. The variable should generate its result in radians. The direction of rotation for the region around the rotation axis is consistent with the right-hand rule: if your right-hand thumb points along R, then your fingers wrap around the axis in the direction of rotation.

The move and rotate keywords can be used together. In this case, the displacement specified by the move keyword is applied to the P point of the rotate keyword.

使用限制

prism类型的区域在任何方向上都不能是0厚度。对于2d模拟而言,在z方向上可以定义一个很小的厚度,而xz和yz必须是0。

相关命令

lattice, create_atoms, delete_atoms, group

默认设置

side=in, units=lattice, 无移动或旋转。

标签: lammps, lammps翻译

相关文章推荐

添加新评论 (无需注册,可直接评论)

已有 16 条评论

  1. 托卡马克

    ID是不是随意设置的

  2. MikeWu

    博主您好,我想问问您是否知道在lammps中如何判定在一个区域内是否有原子的坐标重合。因为我想在一个区域内随机添加原子看观察其变化,当然需要保证随机产生的原子的坐标不会与原来的原子坐标重合。

    1. 忘了是哪个命令了,lammps是有一个命令,会判断原子是否重合。

  3. xgy

    请问博主有没有关于variable命令的翻译?为什么这个页面的链接打不开呢?谢谢博主了

    1. 这个命令还没有翻译。

  4. chy

    你好,请教一下,我虽然知道什么是离位域能,但是我知道离位域能和迁移能不一样,到底它们有什么区别?

  5. 朱雪刚

    很赞滴文章,必看英语的爽多了,虽然还得看英语,但是有了这里的基础那就容易多了。多谢楼主,已在楼主的lammps网站注册。期待更多命令的翻译,等手头帮忙了,我也尝试着翻译试试。利人利己。祝楼主天天开心

    1. 我爱搜集网博主

      很好啊。欢迎加入翻译lammps的行列。:)

  6. 宇笑

    找了一圈没看见注册在哪,仔细看了看,原来这个是你的网站啊。刚考上研究生,在学习lammps,一头雾水,向你学习,非常高兴看到你写的东西,赞一个。
    Q :849060425
    盼回复!

    1. 我爱搜集网博主

      你好!欢迎写邮件与我交流。:) xianbao.d # gmail.com (#替换为@)

      1. chy

        你好,我想请教一个问题,最近在学习计算离位阈能,我想计算原子沿着特定方向上移动的离位阈能,比如说沿着[110]方向,但是查了许多还是不知道如何设置速度的方向。

        1. 我爱搜集网博主

          抱歉,我没有听说过“离位阈能”。你是指原子迁移能吗?如果是,那么你可以看看NEB计算。

          1. chy

            谢谢楼主,不过应该不是迁移能。处于正常位置的点阵原子被撞击,并接受到某一数值的能量而离开自己的初始阵点位置,这种现象称作原子离位,而这个离开了自己的点阵位置的原子叫做离位原子。当原子接受到的能量等于或大于某一数值的最低能量时,它才可以变成离位原子。原子离位时,所需要的这个最低能量值定义为原子的离位阈能值

            1. 单相

              请问离位阈能用lammps怎么计算?最近才学,而且还没找到计算离位阈能的相关文件

            2. 我爱搜集网博主

              受教了!

              1. chy

                我也是不知道的,是这几天要做这方面的计算,查文献才知道的