取整截断函数及其在PBC中的使用

类别:    标签: 数理   阅读次数:   版权: (CC) BY-NC-SA

2013-08-13 14:05:39

取整和截断相关的函数, 有着各种不同的名称, 不同的定义, 很容易让人迷惑. 它们之间根据具体情况还可以相互转换成不同的写法, 更增添了混乱. 下面整理Fortran和C中的相关函数.

取整截断函数
函数 Fortran C
向下取整⌊x⌋ floor floor
向上取整⌈x⌉ ceiling ceil
截断取整[x] int/aint int
四舍五入 nint/anint round
模/取余 mod(x,p)=x-int(x/p)*p x%p
modulo(x,p)=x-floor(x/p)*p
绝对值 |x| abs abs
符号 sign(x, y)

此外, 数学上还会使用如下去整函数

$frac(x)={x}=x-\lfloor x \rfloor=mod(x,1)$

以上这些函数组合起来, 基本能满足各种需要了.

下面是各个函数的图像, 数值可参看附表

由图像与数值可知

周期性边界条件PBC在使用时有两种情况, 设盒子长度为L, 粒子坐标为x

  1. 以左下角为坐标原点, 坐标 $x \in [0,L)$, 为使粒子处于盒内, 须 $x=x-\lfloor x \rfloor$
  2. 以中心为原点, 坐标 $x \in [-L/2,L/2)$, 常用于计算粒子之间距离, 此时又分两种情况
    • x满足 $x \in [0,L)$, 也可写为更紧凑形式: $x=x-sign(L,x), |x|>L/2$
    • x未必满足 $x \in [0,L)$, 一般情况

另外, 若想实现一定时间间隔 $\Delta t$ 取样, 本可利用 $mod(t, \Delta t)=t-\lfloor t/\Delta t \rfloor$ 实现. 但由于取整问题(前面说过), 遇到特定时间间隔时就会失效, 变通的方法是判断 $t$ 恰好能被 $\Delta t$ 整除, 即t的小数部分 ${t}$ 为零. 用 $t-nint(t/\Delta t)\Delta t$ 或 $mod(t+\Delta t/2, \Delta t)-\Delta t/2$ 可避免此问题.

参考

  1. http://en.wikipedia.org/wiki/Floor_and_ceiling_functions
  2. http://en.wikipedia.org/wiki/Periodic_boundary_conditions
取整截断函数取值表
x floor ceiling int nint int(x+0.5) int(x-0.5)
-2.00 -2 -2 -2 -2 -1 -2
-1.80 -1 -1
-1.50
-1.20 -1 0 -1
-1.00 -1
-0.90 0 0
-0.80
-0.70
-0.60
-0.50
-0.40 0 0
-0.30
-0.20
-0.10
0.00 0
0.10 1
0.20
0.30
0.40
0.50 1 1
0.60
0.70
0.80
0.90
1.00 1 1
1.10 2
1.20
1.50 2 2 1
1.80
2.00 2 2
随意赞赏

微信

支付宝
◆本文地址: , 转载请注明◆
◆评论问题: https://jerkwin.herokuapp.com/category/3/博客, 欢迎留言◆


前一篇: 球谐函数及Legendre多项式
后一篇: 八面体与截角八面体团簇的构建及代码实现

访问人次(2015年7月 9日起): | 最后更新: 2017-09-26 07:50:25 UTC | 版权所有 © 2008 - 2017 Jerkwin