示例 02:编译安装 OpenMX 4.0 + patch 4.0.1 并验证(Build & Verify OpenMX)¶
配套教程:第2章 编译与安装(Intel / GCC / ScaLAPACK / ELPA / WSL / deb / Docker)
目的¶
- 提供 GCC 与 Intel oneAPI 两条路线的 makefile 片段(只含
MKLROOT/CC/FC/LIB,不含官方 makefile 原文); - 提供一键脚本:下载源码与补丁 → 打 patch 4.0.1 → 备份并改写 makefile →
make install+make all→ 运行-runtest; - 提供
runtest.result的自动判读脚本和运行环境设置脚本。
文件说明¶
| 文件 | 说明 |
|---|---|
makefile.gcc.example |
GCC + Open MPI + ScaLAPACK + OpenBLAS + FFTW3 的 CC/FC/LIB(Ubuntu 24.04、Debian 12–13 的库名),附各选项用途注释 |
makefile.oneapi.example |
Intel oneAPI(mpiicx/mpiifx)+ MKL + Intel MPI 的 MKLROOT/CC/FC/LIB |
build_openmx_gcc.sh |
GCC 路线一键脚本;可选 INSTALL_DEPS=1 用 apt 安装依赖;按 GCC 版本自动追加兼容选项,aarch64 自动加 -Dnosse |
build_openmx_oneapi.sh |
oneAPI 路线一键脚本;自动 source setvars.sh,AMD CPU 自动把 -xHOST 换成 -march=x86-64-v3 |
check_runtest.sh |
读取 runtest.result(或 runtestL.result),逐个检查 diff Utot、diff Force 是否小于 1e-7,输出 PASS/FAIL |
env_openmx.sh |
运行环境(source 使用):PATH、可选的 oneAPI 与 deb 运行库、线程与栈设置,以及把输入文件 DATA.PATH 改成本机路径的函数 omx_setdata |
两个构建脚本修改 makefile 的方式相同:先把原文件备份为 makefile.orig,把其中生效的 MKLROOT/CC/FC/LIB 定义(含 \ 续行)注释掉,再把新的定义插到文件开头;CC += -I$(LIBELPADIR)、FC += -I$(LIBELPADIR) 两行保持不变(内置 ELPA 需要它们)。
运行步骤¶
GCC 路线(Ubuntu 24.04 / Debian / WSL)¶
cd /path/to/DFT-Tutorials/OpenMX/examples/02-install-build
INSTALL_DEPS=1 bash build_openmx_gcc.sh # first time: also installs apt packages (sudo)
# later rebuilds:
FORCE=1 bash build_openmx_gcc.sh
# custom location, skip the test:
PREFIX=/apps/openmx RUN_TEST=0 bash build_openmx_gcc.sh
Intel oneAPI 路线(WSL 或集群)¶
source /opt/intel/oneapi/setvars.sh # or: module load intel-oneapi-...
bash build_openmx_oneapi.sh
# AMD CPU or heterogeneous cluster: choose the CPU flag yourself
ARCH_FLAG="-march=core-avx2" bash build_openmx_oneapi.sh
# Intel compilers + Open MPI + MKL (cluster):
BLACS_LIB=-lmkl_blacs_openmpi_lp64 bash build_openmx_oneapi.sh # also make sure mpiicx/mpiifx wrap your MPI
手动编译(不用脚本)¶
cd ~/software/openmx4.0/source
cp makefile makefile.orig
# edit makefile: comment out the active MKLROOT/CC/FC/LIB, paste makefile.gcc.example (or .oneapi.example)
make clean && make install && make all
验证¶
cd ~/software/openmx4.0/work
mpirun -np 1 ./openmx Methane.dat -nt 1 | tee met.std # Utot should be -8.033540953061 Ha (manual Sec. 5)
mpirun -np 4 ./openmx -runtest -nt 1
bash /path/to/DFT-Tutorials/OpenMX/examples/02-install-build/check_runtest.sh runtest.result
日常使用¶
OPENMX_ROOT=$HOME/software/openmx4.0 source env_openmx.sh # Intel build: add OMX_USE_ONEAPI=1
omx_setdata *.dat # rewrite DATA.PATH in your inputs
mpirun -np 4 openmx Methane.dat -nt 1 | tee met.std
deb 包用户:OPENMX_ROOT=/opt/openmx4.0 OMX_DEB_RUNTIME=1 source env_openmx.sh(数据库目录若不是 /opt/openmx4.0/DFT_DATA19,另设 OMX_DATA)。
预期结果 / 如何检查¶
- 构建脚本最后应打印
built: work/DosMain、built: work/bandgnu13等行,且ldd work/openmx中没有not found; $PREFIX/openmx4.0/source/make_install.log、make_all.log保存了完整编译日志,$PREFIX/openmx4.0/INSTALL_NOTES.txt记录了编译器版本与所用选项;check_runtest.sh对 14 个测试逐行给出ok/FAIL,最后一行为RESULT: PASS即安装正确(判据:diff Utot与diff Force均 < 1e-7,见手册第 6 节)。输出格式如下(示意输出,数值仅供参考):
# input time(s) diff Utot diff Force status
1 input_example/Benzene.dat 4.93 0.000000000000 0.000000000000 ok
...
tests parsed: 14 failed (>= 1e-7): 0 total elapsed time: 99.01 s
RESULT: PASS
注意事项¶
- 脚本默认安装到
$HOME/software/openmx4.0;目录已存在时会停止,需FORCE=1才会删除重建; - 不要用
make CC=... FC=... LIB=...的命令行方式覆盖变量,否则 makefile 中的CC += -I$(LIBELPADIR)会失效; - Ubuntu/Debian 的 ScaLAPACK 库名是
-lscalapack-openmpi;其他系统一般是-lscalapack,可用SCALAPACK_LIB="-L/path/lib -lscalapack"覆盖; - 编译
openmx需要十几分钟到半小时;脚本不使用并行 make(有用户报告并行编译时 ELPA 模块依赖出错); - 在 Docker 容器中以 root 运行时,Open MPI 会拒绝启动
mpirun(mpirun has detected an attempt to run as root),请改用普通用户; -xHOST与-march=native只适合编译机与计算机 CPU 相同的情况;- 脚本面向 Linux(含 WSL)编写,编写时验证了 bash 语法、makefile 改写逻辑与
check_runtest.sh的解析(用手册中的 runtest 输出格式),但无法覆盖所有发行版与编译器版本的实际编译;遇到编译错误请对照教程第2章“常见问题与报错”。仓库中的通用版本omx_build.sh提供相同功能(用法见bash omx_build.sh -h)。