zoukankan      html  css  js  c++  java
  • neighbor和neigh_modify(转载)

    (转载:http://blog.sina.com.cn/s/blog_b48a7ac30102w4mg.html###)

    以下取自:http://simulation.haotui.com/viewthread.php?tid=11368&jdfwkey=cnypw3

    收集1:neighbor选取的大小对实际的计算结果影响很小,但对计算速度应该会有一定影响。
    neighbor  2 bin 意思是每个原子在所取对势(即pair style)的截断半径以外,计算机还会在2 bin的额外范围每一时间步检测其原子间的相互作用力。而bin是与N/P线性变化(N原子总数,P是cup数)。总之,这个设定的大小并不是十分重要。

    收集2:由于neighbor-list的计算比较耗时,多数MD代码都是在一次build之后的接下来若干步之内都使用这个neighbor-list,而不是每一步都更新。因此,在build是选取的实际截断半径是r_cut+skin,只要在若干步之内原子位移小于skin/2就是安全的(lammps可以检查这个,Dangerous builds就是指在某次build时发现此时刻原子相对上一次build时的位移超过了skin/2)。build的频率需要和skin大小结合起来使用,这样达到最佳的运行速度(不同系统需要自己试,但很显然的道理是较小的skin需要较高的更新频率)。 理论上,skin的大小对最终的结果是没有影响的,但对计算速度有。
    neighbor  10 .0 bin 没必要取这么大,这样neighbors太多,内存占用增大和速度下降。甚至超出lammps预定的极限就会溢出。unit real情况下,skin一般2-3,配合使用 neigh_modify delay  5就可以了。 如果使用neigh_modify delay  3 还有很高比例的Dangerous builds,应该是你的积分步长太大,应适当减小积分步长。

    以下取自:http://www.360doc.com/content/12/0106/01/8275160_177586409.shtml

    收集3:用来设定计算邻位列表的频率。

          Delay: never build a new list until at least N steps after the previous build 在建立一次邻位列表后,至少要经过N steps才能建立下一次的邻位列表。

          Every:在delay经过之后,每经过M步建立一次邻位列表。个人感觉lammps中这点写的有点混乱。个人理解:每建立一次列表后,经过N+M才能建立下一次列表。如果N不为零,必须为M的倍数,否则没有什么意义了。这里为什么非要这种设置呢,如果设置频率的话只需要一个参数就够了啊?http://simulation.5d6d.scom/viewthread.php?tid=8245&page=1#pid52602

          Check:如果值为no,则只需要满足以上两者的设定后就可以重新建立邻位列表了。如果值为yes,则只有当某个原子的位移大于皮肤半径的一半才重新建立列表。

          Exclude:用来取消某些原子之间的相互作用。对于以下几种情况很重要:裂纹模拟;冰冻处理;原子被设定为刚体时;这中处理方式可以节约计算时间。这个只影响原子间非键结的相互作用。

          Page and one:关于邻位列表的存储问题。

          恩,仔细看了下你写的分析过程,结合原始程序,基本上明白了这两个参数的作用。其实,建立邻位列表的频率是由delay every check三个参数共同确定的。
      if (ago >= delay && ago % every == 0)//这是最基本的条件
    {
        if (dist_check == 0) return 1;//当dist_check==0的时候,邻位列表定期更新
        else return check_distance();//当dist_check!=0的时候,就是标签更新,只有当列表中某个原子的位移大于skin的一半的时候才建立
      }
    else return 0;
        其实首先要明白,更新列表有两种方式,一种是定期更新,另外一种是标签更新。
        因此,如果delay为零,则不管dist_check如何取值,只要当时间步是every的倍数就可以更新列表
        如果delay不为零,every==1,并且dist_check==0,则更新列表的频率与every没有什么关系,只要距离上次更新列表的时间步达到delay就更新。
        而如果delay不为零,every不为1时,手册中有要求,“如果delay不为零,他的值必须是every的倍数”。因此,如果 dist_check==0,则时间步达到delay+every,则列表就开始更新。而如果dist_check不为零,则只有当时间步为 delay+N*every(N=0,1,2……)的时候,邻位列表才更新。

        结论:由于neighbor-list的计算比较耗时,多数MD代码都是在一次build之后的接下来若干步之内都使用这个neighbor-list,而不是每一步都更新。因此,在build是选取的实际截断半径是r_cut+skin,只要在若干步之内原子位移小于skin/2就是安全的(lammps可以检查这个,Dangerous builds就是指在某次build时发现此时刻原子相对上一次build时的位移超过了skin/2)。build的频率需要和skin大小结合起来使用,这样达到最佳的运行速度(不同系统需要自己试,但很显然的道理是较小的skin需要较高的更新频率)。 理论上,skin的大小对最终的结果是没有影响的,但对计算速度有。
    neighbor取系统默认值即可。neigh_modify取 delay 0 every 5 check yes

  • 相关阅读:
    安卓监听帧动画结束
    零基础学python-13.4 文件上使用列表解析与列表解析扩展
    零基础学python-13.3 列表解析简介与步骤分解
    零基础学python-13.2 手动迭代:iter和next
    零基础学python-13.1 迭代器简介与文件迭代器
    零基础学python-12.6 使用for和zip来并行使用多个序列
    零基础学python-12.5 修改列表的误区以及使用for和range修改列表
    零基础学python-12.4 while、for与range联合使用
    零基础学python-12.3 for循环
    零基础学python-12.2 关键字pass,else,break,continue
  • 原文地址:https://www.cnblogs.com/sysu/p/10809003.html
Copyright © 2011-2022 走看看