2016年6月5日星期日

Linux 命令行下的计算器

1. bc
 支持简单变量(simple variable)和数组(array), 支持算数运算, 赋值, 关系运算, 逻辑运算, 支持函数和控制结构。
 bc内建了四个特殊变量:
        scale, 精确到小数点后面多少位;
        ibase, 输入数据的进制;
        obase, 输出数据的进制;
        last, 最近打印的变量值.
 调用bc时添加-l选项, 会载入数学函数库, 提供一下函数:
       s (x)  The sine of x, x is in radians.
       c (x)  The cosine of x, x is in radians.
       a (x)  The arctangent of x, arctangent returns radians.
       l (x)  The natural logarithm of x.    
       e (x)  The exponential function of raising e to the value x.
        j (n,x)  The Bessel function of integer order n of x.
示例:
$  #进制转换
$  echo 'obase=16; 255' | bc
$  FF
$  #数学函学运算
$  echo 'scale=10; 4*a(1)' | bc -l
$  3.1415926532

2. Awk
 Awk本是专门用来处理文本的, 但它同时提供了一些基础的数值函数, 如:
    atan2(y, x)  返回y/x的正切值;
    int(x)  返回x的整数部分;
    srand(x)  设置虚拟随机产生器的种子;
    rand()  返回平均分布的虚拟随机数r, 0<=r<1;
    sin(x), cos(x), exp(x), log(x), sqrt(x).
 Awk支持标量变量, 数组变量, 赋值, 算数运算, 逻辑运算, 函数和控制结构, 可构造复杂的运算过程.
示例:
$  #计算阶乘
$  awk  'function fact(n) {\
                  if(n<=1) return 1;\
                  return(n*fact(n-1));\
              }\
              BEGIN { print fact(3); }'
$  6

3. Perl
 Perl是一门高级的脚本语言, 他内建了一些基本的数学函数, 如果对运算有更高要求的话, 可以引入相应模块:
     Math::BigInt - 大整数和大浮点数运算
     Math::Complex - 复数运算
     Math::BigFloat - 大浮点数运算
     Math::BigInt::Calc - Pure Perl module to support Math::BigInt
     Math::BigInt::CalcEmu - Emulate low-level math with BigInt code
     Math::BigInt::FastCalc - Math::BigInt::Calc with some XS for more speed
     Math::Trig - 三角函数
     Math::BigRat - 大有理数运算
 示例:
$  #打印PI
$  perl -w -e 'use Math::Trig; print(pi, "\n")'
$  3.14159265358979

4. Ruby
 Ruby是一门高级的面向对象的脚本语言, 她的Math模块定义了常量PI和E、一些三角函数和对数函数的方法及一些杂类方法。Math的方法都是“模块方法”, 它们可以通过Math这个命名空间来调用, 或者被其它类包含后像全局函数一样使用. Ruby标准库中的一些其它类也能帮助您完成一些复杂的任务:
   BigDecimal类: 用于代替Float, 当进行金融运算时, 可避免二进制浮点运算所带来的舍入误差;
   Complex类: 可以表示和操作一个复数;
   Rational类: 可以表示一个实数, 它定义了实数的算数运算操作符;
   Matrix和Vector类: 向量和矩阵运算;
   全局函数Kernel.rand: 产生随机数;
   Time类: 表示日期和时间.
 示例:
$ #打印PI和E
$  ruby -e 'printf( "Pi= %f, e= %f\n", Math::PI,Math::E)'
$  Pi= 3.141593, e= 2.718282

5. Python
 Python也是一门高级的面向对象的脚本语言. Python内置了一些基本的数学函数, 可以直接调用:
     abs(x): 返回x的绝对值;
     complex([real[, imag]]): 创建值为 real+imag*j的复数;
     divmod(a, b): 作除法;
     pow(x, y[, z]): 返回x**y, 或x**y%z;
     round(x[, n]): 根据给定精度进行四舍五入;
     sum(sequence[, start]): 对序列sequence求和, 如果存在参数start, 则再加上start.
 同时, Python标准库中也提供了大量的数值运算模块:
     numbers模块: 数值基本类;
     math模块: 数值运算;
     cmath模块: 复数运算;
     decimal模块: 定点和浮点函数运算;
     fractions模块: 有理数运算;
     random模块: 生成伪随机数.
示例:
$  #计算乘方
$  python -c 'print(pow(2, 3))'
$  8

VASP 计算功函数

VASPINCAR文件中,指定LVTOT=.TRUE. ,并且在计算时超晶胞大小选取有足够的真空区域,以保证势能函数收敛到真空能级。指定LVTOT=.TRUE.后,VASP的运行结果会多出一个叫LOCPOT的文件,里面包含的信息是计算中的electrostatic potential在真空区域的electrostatic potential即为真空能级。一个典型的LOCPOT文件有如下的格式
  (8,0) Carbon Nanotube
  1.
  40.000000 0.000000 0.000000
  0.000000 40.000000 0.000000
  0.000000 0.000000 4.320000
  16
  Direct
  0.414696 0.375000 0.000000
  0.403069 0.403069 0.833333
  0.403069 0.403069 0.500000
  0.375000 0.414696 0.333333
  0.375000 0.414696 0.000000
  0.346931 0.403069 0.833333
  ……..
(省略N行)(省略更多行)最前面的几行是header部分,主要包括了晶胞大小,原子坐标等信息。注意,计算中的晶胞大小要远超过体系的实际大小,以保证足够的真空区域。从420 420 48这一行开始,说明沿着晶胞的x,y,z方向,分别等分成420,420,48个格点,每个格点上记录该点的electrostatic potential。我们实际上需要的是真空区域的值。为此,我们可以有如下的matlab script来完成类似工作读入header部分
  for k=1:z
方向格点数

  for j=1:y方向格点数
  for i=1:x方向格点数
  v(i,j,k)=fscanf(fid,'%g',1);
  end
  end
  end
然后,根据你的真空区域在哪里,你可以对v这个矩阵的一部分做一个平均操作,得到真空能级。像上图的势能图,就可以沿着纳米管的轴,在每个点上对于纳米管 的横截面上的electrostatic potential做平均,即可得到如上的势能图。真空能级减去费米能级即为该体系的功函数。

  420 420 48
  0.18314769822E+00 0.18314676614E+00 0.18315439435E+00 0.18315348730E+00 0.18316167121E+00
  0.18316060822E+00 0.18316911573E+00 0.18316765858E+00 0.18317566050E+00 0.18317363579E+00
  0.18318169699E+00 0.18317919383E+00 0.18318714885E+00 0.18318423496E+00 0.18319188157E+00
  0.18318824402E+00 0.18319610760E+00 0.18319209212E+00 0.18319995835E+00 0.18319590197E+00
  ……..
 有用的处理LOCPOT的程序下载:https://github.com/WMD-group/workfunction