Octopus是密度泛函理论(density-functional theory,DFT)和含时密度泛函理论(time-dependent density functional theory ,TDDFT)的一个免费但很专业的软件包。
Octopus以命令行方式运行,并且使用单个输入文件读取用户指令,以了解计算内容和计算方法。本文介绍如何编写该文件以及一般的格式是什么。Octopus解析器(parser)位于源代码的liboct_parser目录中,是一个基于bison和C语言编写的库。
输入文件
输入参数应该在Octopus的运行目录下一个名为inp的文件中。这是一个纯ASCII文本文件,要创建或编辑它,可以使用任何文本编辑器,如emacs,vi,jed,pico,gedit等。
在程序开始时,解析器读取输入文件,解析并生成将被Octopus读取的变量列表。有两种类型的变量:标量(字符串或数字)和块(可以将其视为矩阵)。
标量变量
标量变量可以通过以下方式定义:
var = exp
var可以包含任何字母数字加“_”,值可以是引号括起来的字符串、数字(整数、实数或复数)、变量名称或数学表达式。复数定义为{real,imag}。实数可以使用带有e或E的科学记数法(不能使用d或D),例如6.02e23。变量名称不区分大小写,并且不得重新定义先前定义的符号 – 尤其是保留变量x、y、z、r、w、t(在空间或时间相关表达式中使用,其中w是4D中的第4个空间坐标)。
数学表达式
解析器可以解释输入文件中的表达式,将结果分配给变量,或定义函数,例如species块中的势或TDFunctions块中的时间相关函数。参数可以是数字或其他变量。
算术运算符
运算符 |
说明 |
a+b |
加法 |
a-b |
减法 |
-a |
一元减号 |
a*b |
乘法 |
a/b |
除法 |
a^b |
幂 |
逻辑运算符
逻辑运算返回0表示假或返回1表示真。可以利用这一点来定义分段表达式,例如“2*(x <= 0)-3 * (x > 0)”(尽管也可以使用step函数)。比较运算符(==除外)仅使用复数的实部。
运算符 |
说明 |
a < b |
小于 |
a <= b |
小于或等于(≤) |
a > b |
大于 |
a >= b |
大于或等于(≥) |
a == b |
等于 |
a && b |
逻辑和 |
a || b |
逻辑或 |
!a |
逻辑非 |
函数
sqrt(x):x的平方根
exp(x):x的指数
log(x)或ln(x):x的自然对数
log10(x):x以10为底的对数
logb(x, b):x以b为底的对数
{x, y} 复数
arg(z):复数z的幅角,-π<arg(z)<=π
abs(z):复数z的模,|z|
abs2(z):复数z的模方,|z|2
logabs(z):复数z模的自然对数,log|z|
conjg(z):复数z的复共轭,z*=x-iy
inv(z):复数z的倒数
sin(x), cos(x),tan(x),cot(x),sec(x),csc(x):正弦、余弦、正切、余切、正割和余割
asin(x),acos(x),atan(x),acot(x),asec(x),acsc(x):反正弦、余弦、切线、余切、割线和余割
atan2(x,y):=atan(y/x)
sinh(x),cosh(x),tanh(x),coth(x),sech(x),csch(x):双曲正弦、余弦、切线、余切线、割线和余割
asinh(x),acosh(x),atanh(x),acoth(x), asech(x), acsch(x):反双曲正弦、余弦、切线、余切、割线和余割
min(x, y):x和y的最小值
max(x, y) :x和y的最大值
step(x):单位阶跃函数,可用于分段定义的函数
erf(x):误差函数
realpart(z):复数z的实部
imagpart(z):复数z的虚部
floor(x):小于实数x的最大整数
ceiling(x):大于实数x的最小整数
预定义变量
为方便起见,有一些预定义的常量:
名称 |
说明 |
pi |
3.141592653589793 |
e |
自然对数的底数 |
false |
假 |
true |
真 |
i |
虚数单位 |
angstrom |
1.8897261328856432 |
pm or picometer |
0.018897261328856432 |
nm or nanometer |
18.897261328856432 |
ry or rydberg |
0.5 |
eV or electronvolt |
0.03674932539796232 |
invcm |
4.5563353e-06 |
kelvin |
3.1668105e-06 |
kjoule_mol |
0.00038087988 |
kcal_mol |
0.0015936014 |
as or attosecond |
0.0413413737896 |
fs or femtosecond |
41.3413737896 |
ps or picosecond |
41341.3737896 |
c |
137.035999139 |
块(block)
块被定义为值的集合,以行和列格式组织。语法如下:
%var
exp | exp | exp | ...
exp | exp | exp | ...
...
%
块中的行用换行符分隔,而列用字符“|”或tab分隔。块中可以有任意数量的行和任意数量的列。另请注意,每行可以具有不同数量的列。块中的值不必属于同一类型。
包括(include)
可以将外部文件包含在输入文件中。
比如,在输入文件inp中:
CalculationMode = gs
UnitsOutput = eV_Angstrom
Radius = 3.5*angstrom
Spacing = 0.22*angstrom
include geometry.oct
几何在 geometry.oct中定义,
CH = 1.2*angstrom
%Coordinates
"C" | 0 | 0 | 0
"H" | CH/sqrt(3) | CH/sqrt(3) | CH/sqrt(3)
"H" | -CH/sqrt(3) |-CH/sqrt(3) | CH/sqrt(3)
"H" | CH/sqrt(3) |-CH/sqrt(3) | -CH/sqrt(3)
"H" | -CH/sqrt(3) | CH/sqrt(3) | -CH/sqrt(3)
%
默认值
如果Octopus尝试读取输入文件中未定义的变量,它会自动为其分配一个默认值(在某些情况下,如果Octopus找不到合理的默认值,它会报错停止)。所有读取的变量(输入文件中存在或不存在)都输出到文件exec/parser.log。未在输入文件中定义的变量将具有 -default注释。如果不确定该程序正在读取什么,请查看它。
建议将输入文件中的变量保持在最低限度:“不要编写将被分配默认值的变量”。在较新版本的Octopus中,默认值可能会更改,旧值可能会导致问题。除此之外,输入文件将变得难以阅读和理解。
文档
每个输入变量都有(或应该有)自己的文档,解释它的作用以及它可能采用的有效值。文档可以联机获取,也可以通过oct-help命令访问。
实验性功能
即使在Octopus的稳定版本中,也有许多功能正在开发中,不适合正式使用。为了防止用户无意中使用这些部件,它们被声明为“Experimental’”。
当你尝试使用其中一项实验功能时,Octopus将报错停止。如果要使用它,则需要将变量ExperimentalFeatures设置为yes。现在Octopus只会发出警告。被允许使用不完整或未经良好测试的代码部分,很可能会产生错误的结果。
良好做法
为确保与较新版本的Octopus兼容及避免出现问题,在编写输入文件时,谨记以下良好操作规则:
(1)尽管输入变量可以采用数字,但数字表示形式会使输入文件的可读性降低,并且将来可能会更改。所以“避免使用数字而不是值”。例如,应该用
UnitsOutput = ev_angstrom
代替
UnitsOutput = 3
(2)“不要包含输入文件中不需要的变量”,尤其是只取默认值的声明。这会使输入文件更长,可读性降低,并且由于默认值可能会更改,因此输入文件更有可能在较新版本的Octopus上出现问题。
(3)“避免在输入文件中重复信息”。为此使用自定义变量和数学表达式功能。例如,应该使用:
m = 0.1
c = 137.036
E = m*c^2
而不是
m = 0.1
c = 137.036
E = 1877.8865
创业项目群,学习操作 18个小项目,添加 微信:923199819 备注:小项目!
如若转载,请注明出处:https://www.zodoho.com/113010.html