龙空技术网

从零开始学Octopus(2):输入文件

未来奇兵 46

前言:

现在各位老铁们对“c语言录入学生信息函数怎么写”大体比较关注,姐妹们都需要知道一些“c语言录入学生信息函数怎么写”的相关内容。那么小编同时在网上网罗了一些对于“c语言录入学生信息函数怎么写””的相关文章,希望各位老铁们能喜欢,小伙伴们快快来学习一下吧!

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|2logabs(z):复数z模的自然对数,log|z|conjg(z):复数z的复共轭,z*=x-iyinv(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)

块被定义为值的集合,以行和列格式组织。语法如下:

%varexp | exp | exp | ...exp | exp | exp | ......%

块中的行用换行符分隔,而列用字符“|”或tab分隔。块中可以有任意数量的行和任意数量的列。另请注意,每行可以具有不同数量的列。块中的值不必属于同一类型。

包括(include)

可以将外部文件包含在输入文件中。

比如,在输入文件inp中:

CalculationMode = gsUnitsOutput = eV_AngstromRadius = 3.5*angstromSpacing = 0.22*angstrominclude 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.1c = 137.036E = m*c^2

而不是

m = 0.1c = 137.036E = 1877.8865

标签: #c语言录入学生信息函数怎么写 #c语言输入到文件中