Libxc参数查询与修改
从实际版本查询外部参数,比较按名称与数组设置,使用PBE到PBEsol的双自旋能量、势及二阶导数实例。
阅读本篇目录
Libxc编号相同,还需要确认参数。若你在自己的程序里调用Libxc,或在ORCA中使用ExtParamX、ExtParamC,本篇展示怎样查默认值、怎样修改,以及怎样用已有泛函作对照。普通VASP输入先看Libxc与VASP实操;需要完整导数能力表时看编号与各阶导数。
1. 先查看实例数据,再决定是否重算#
下载后将ZIP保存为libxc.zip:
unzip libxc.zip
cd libxc-parameters-responses-wave267
head -n 8 reference/analysis/version-parameter-inventory.csv
reference/已经有真实结果、全部参数目录和图片。若要自己运行整个流程,提交配套脚本:
sbatch job.slurm
squeue -u "$USER"
流程依次为:编译参数查询程序 → 查询三个库 → 运行参数数值对照 → 运行六个CP2K/ORCA响应条件 → 生成CSV → 画图。CPU分区按规则申请56核,短程序在分配范围内只选择4个不同物理核心;这组数据不用于核心数或速度比较。程序调用集群现有模块和各宿主自己的Libxc依赖,不修改你个人的环境文件。
运行结束后查看:
ls analysis figures
head -n 6 analysis/parameter-identity-controls.csv
已存在parameters/或cases/时,完整流程会停止,避免覆盖结果。再次运行请另外解压一份;只重新提取或画图时,使用:
source /etc/profile
module load sisl/0.16.4
python analyze.py
python plot.py
2. 查对应版本实际提供的参数#
三个库是不同宿主的独立依赖,不能仅根据某个VASP模块的Libxc版本推断CP2K或ABACUS的版本。本例使用:
| 实际库版本 | 唯一泛函编号 | 有外部参数的唯一编号 | 参数位置总数 |
|---|---|---|---|
| 6.2.2 | 657 | 441 | 3265 |
| 7.0.0 | 679 | 465 | 3421 |
| 7.1.2 | 702 | 487 | 3575 |
7.1.2还返回10个重复编号的名称入口;上表按唯一编号统计。参数位置总数是各泛函参数个数相加,同名参数在不同泛函中各计一次。完整数据在reference/analysis/functional-parameters.csv,不是只列PBE。查询示例:
python - <<'PY'
import csv
with open('reference/analysis/functional-parameters.csv') as f:
for row in csv.DictReader(f):
if row['version'] == '7.1.2' and row['id'] in ['101', '130']:
print(row['id'], row['name'], row['default'], row['description'])
PY
PBE交换101提供_kappa=0.804、_mu=0.2195149727645171。PBE相关130提供_beta=0.06672455060314922、_gamma=0.031090690869654894、_B=1;7.1.2还列出_tscale=1。参数表来自本机头文件对应的库接口实际返回值,应用时仍应查询所用版本。Libxc官方接口手册说明了参数名称、默认值与设置接口。
3. 在C程序里先查后改#
完整可编译程序是包内parameters.c。关键调用如下:
xc_func_type *p = xc_func_alloc();
xc_func_init(p, 101, XC_UNPOLARIZED);
const xc_func_info_type *info = xc_func_get_info(p);
int n = xc_func_info_get_n_ext_params(info);
for (int j = 0; j < n; ++j) {
printf("%s = %.17g\n",
xc_func_info_get_ext_params_name(info, j),
xc_func_info_get_ext_params_default_value(info, j));
}
xc_func_set_ext_params_name(p, "_mu", 10.0 / 81.0);
/* 接着调用xc_gga_exc_vxc_fxc等接口,使用修改后的泛函。 */
xc_func_end(p);
xc_func_free(p);
按名称设置适合只改少数参数。按数组设置时,必须先读取该版本的所有默认值,按接口返回顺序填入数组,再替换需要修改的位置。不能把另一个版本的固定长度数组直接传进来;也不能把未修改的位置全部写成零。
只运行三个版本的参数查询和对照:
source /etc/profile
module load oneapi/2024.2
python3 run_parameters.py
脚本用Intel oneAPI 2024.2的icx -O2 -std=c11编译,分别链接libraries.json中的实际库;6.2.2为共享库,7.0.0与7.1.2在本例使用静态库。没有重新安装Libxc。单个可执行程序不带参数时输出完整参数目录;输入101 2表示PBE交换、共线双自旋模式:
./parameters/7.1.2/parameters > parameters-query.json
./parameters/7.1.2/parameters 101 2 > pbe-spin2.csv
4. 实例:PBE参数改为PBEsol#
本例分别计算两个独立对应关系:
| 修改对象 | 修改值 | 对照的Libxc编号 |
|---|---|---|
| PBE交换101 | _mu=10/81,保留其余默认值 |
PBEsol交换116 |
| PBE相关130 | _beta=0.046,保留其余默认值 |
PBEsol相关133 |
这里将两个修改同时用于宿主才是本例的PBEsol参数组合;只改交换或只改相关,会得到不同组合。PBEsol水分子仅用于演示参数传递,不是推荐用PBEsol研究气相光谱。
实际取总密度0.05、0.2、0.8 bohr⁻³,梯度平方0.001、0.01、0.05 bohr⁻⁸;每个组合计算无自旋和共线双自旋。双自旋密度分为0.6ρ、0.4ρ,梯度项为0.36σ、0.24σ、0.16σ。三个版本合计108行参数对照:
- 默认PBE与改参PBE的结果确实不同。
- 按名称设置与按完整数组设置,在这些输入上的差值为零。
- 改参PBE与对应PBEsol编号,在能量、势及二阶导数返回分量上的差值为零。
CSV保留每个输入的能量和各分量最大差;能量为每电子Hartree,混合导数各有相应的原子单位,不能把所有导数的数值差当成同一种物理量。图中仅对比有明确统一单位的能量。

5. 哪些范围需要继续核对#
完整参数目录表示接口可查询,不代表每个参数的所有取值都具有物理意义。上述数值对应关系只针对PBE/PBEsol的两个参数和所列网格;meta-GGA、杂化、非局域项与范围分离参数要分别核对。Libxc可返回某阶导数,也不等于每个宿主都把该导数用于响应计算。
下一篇CP2K与ORCA中的响应计算直接展示宿主完整输入、前三个激发态、振子强度以及怎样检查输出。版本和混合泛函的区别见版本与泛函组合。