news 2026/10/3 12:19:19

eDMFT安装教程:在Linux上基于Intel oneAPI与WIEN2k的完整配置流程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
eDMFT安装教程:在Linux上基于Intel oneAPI与WIEN2k的完整配置流程

1. 先搞清楚 eDMFT 到底在算什么,为什么装起来这么折腾

eDMFT 是给 WIEN2k 做 DFT+DMFT 耦合计算的扩展套件,全称里那个 “E” 指的是 Embedded,也就是把动力学平均场方法嵌进全势 LAPW 框架里。它能做什么?简单说,WIEN2k 负责算电子结构,eDMFT 负责处理强关联体系里那些局域电子之间的多体相互作用,两者拼在一起,就能算关联氧化物、f 电子体系这类常规 DFT 搞不定的材料。适合谁?做材料计算的研究生、博后,尤其是已经在用 WIEN2k 但想往强关联方向走的人。

为什么说它装起来折腾?因为 eDMFT 不是那种pip install就能跑的东西。它要跟 WIEN2k 的目录结构、Intel oneAPI 的编译器链、FFTW3 和 GSL 这些数学库全部对齐。我见过太多人卡在configure.py那一步,报一堆undefined reference to cblas_dgemm或者fftw3.h not found,然后就不知道往哪查了。这篇教程就是把这些坑一个个填平,给你能直接复制的环境变量、编译参数和依赖检查命令,最后跑一个最小算例确认安装成功。

核心检索词先摆出来:eDMFT 安装、WIEN2k 耦合、Intel oneAPI 编译、FFTW3 配置、Linux 集群部署。你如果是第一次在 Linux 上搞这套东西,建议从头跟着走,别跳步。因为 eDMFT 的编译脚本对路径和编译器名字很敏感,错一个变量后面全乱。

先说清楚整体流程:先确认 WIEN2k 已经装好且WIENROOT能正常用,然后加载 Intel oneAPI 环境,接着手动编译 FFTW3 和 GSL(别指望系统自带的能跟 Intel 编译器链兼容),再改configure.py里的编译器和库路径,最后python3 setup.py编译。编译过了之后,拿一个 WIEN2k 的最小案例跑一遍 eDMFT 初始化,看能不能生成 DMFT 输入文件。整个过程在 CentOS/RHEL 系列的集群上验证过,Ubuntu 也能用,但包管理命令要换。

有一点要提前说:eDMFT 的源码目录通常放在 WIEN2k 安装路径下面,比如/public/software/wien2k/E+DMFT/eDMFT-master。这个路径后面会反复用到,你先确认自己的实际路径,别照抄我的。另外,Intel oneAPI 建议用 2023.2 或更新的版本,老版本的icc/ifort已经被icx/ifort替代了,eDMFT 的configure.py.intel模板里用的就是新名字。

2. 装 eDMFT 之前,TaoToken 能帮你省掉哪些查文档的时间

装 eDMFT 最烦的不是编译本身,是报错之后你不知道去哪查。官方文档写得比较简略,邮件列表翻起来又慢。我自己的习惯是,遇到configure阶段的报错,先把错误信息丢给模型对话让它解释一遍,然后再去翻源码里的configure.py和Makefile。这样比直接搜论坛快很多。

TaoToken 在这里的角色就是一个统一的模型调用入口。你不需要在本地装一堆 SDK,也不用折腾环境变量,拿到 API Key 之后直接调就行。对于 eDMFT 这种涉及 Fortran、C++、MPI、数学库混合编译的场景,让模型帮你分析编译日志特别有用。比如你看到mpiifort: command not found,它可以告诉你可能是setvars.sh没 source,或者 Intel MPI 没装全。

具体怎么接?先到 API Keys 页面生成一个 Key,地址是 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api_keys&utm_campaign=rewrite 。生成之后,你可以用 curl 直接测一下通不通:

curl https://taotoken.net/api/v1/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $TAOTOKEN_API_KEY" \ -d '{ "model": "claude-sonnet-4-20250514", "messages": [{"role": "user", "content": "解释一下 eDMFT 编译时 fftw3.h not found 的常见原因"}] }'

如果你更习惯在编辑器里用,可以配到 Cline 或者 Claude Code 里。以 Cline 的 MCP 配置为例,在 settings.json 里加一段:

{ "mcpServers": { "taotoken": { "command": "npx", "args": ["-y", "@taotoken/mcp-server"], "env": { "TAOTOKEN_API_KEY": "你的Key", "TAOTOKEN_BASE_URL": "https://taotoken.net/api" } } } }

这样你在写编译脚本或者改configure.py的时候,可以直接让模型读当前文件内容,帮你检查路径变量有没有写错。对于 eDMFT 这种配置文件里全是${FFTW_INSTALL}这种变量的项目,有个模型帮你盯着会踏实很多。

如果你打算长期做材料计算,经常要编译各种科学软件,可以考虑 Coding Plan,地址是 https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding_plan&utm_campaign=rewrite 。它比按量调用更适合高频查报错、改脚本的场景。接入文档在 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite ,里面有不同语言的调用示例。

注意一点:TaoToken 只是帮你查文档、分析报错的工具,它不替代你本地的编译环境。eDMFT 该装的依赖一个都不能少,该 source 的setvars.sh一次都不能漏。

3. 可复制的环境变量与 configure.py 配置片段

这一节是整篇的核心,你照着改就行。先把路径统一一下,下面这些变量你根据自己集群的实际情况改,但变量名建议保持一致,因为后面configure.py里会引用。

# WIEN2k 安装路径 export WIENROOT=/public/software/wien2k # eDMFT 根目录(通常在 WIEN2k 下面) export EDMFT_ROOT=${WIENROOT}/E+DMFT/eDMFT-master # 依赖库安装路径 export FFTW_INSTALL=${EDMFT_ROOT}/bin/fftw export GSL_INSTALL=${EDMFT_ROOT}/bin/gsl # 加载 Intel oneAPI 环境 source /public/intel/oneapi/setvars.sh # 确认编译器可用 which icx icpx ifort mpiicc mpiifort

which那行必须每个都返回路径,少一个都不行。如果mpiifort找不到,说明 Intel MPI 没装或者没 source 对。

接下来编译 FFTW3。eDMFT 需要fftw3_omp和fftw3两个库,所以--enable-openmp不能省。

cd ${EDMFT_ROOT} mkdir -p bin/fftw wget http://fftw.org/fftw-3.3.10.tar.gz tar -zxvf fftw-3.3.10.tar.gz cd fftw-3.3.10 ./configure --prefix=${FFTW_INSTALL} \ CC=icx CXX=icpx F77=ifort \ --enable-openmp --enable-shared --enable-static make -j4 && make install cd ../

编译完检查一下头文件和库是不是都在:

ls ${FFTW_INSTALL}/include/fftw3.h ls ${FFTW_INSTALL}/lib/libfftw3_omp.so

两个都存在才算过。如果libfftw3_omp.so没有,回去看configure输出里 OpenMP 那行是不是 yes。

然后编译 GSL。GSL 要链接 MKL 的 BLAS/LAPACK,所以--with-blas和--with-lapack必须写对。

cd ${EDMFT_ROOT} mkdir -p bin/gsl wget https://ftp.gnu.org/gnu/gsl/gsl-2.7.tar.gz tar -zxvf gsl-2.7.tar.gz cd gsl-2.7 ./configure --prefix=${GSL_INSTALL} \ CC=icx CXX=icpx FC=ifort \ --with-blas="-qmkl-ilp64=parallel -qmkl" \ --with-lapack="-qmkl-ilp64=parallel -qmkl" make -j4 && make install cd ../

GSL 编译完检查libgsl.so和libgslcblas.so:

ls ${GSL_INSTALL}/lib/libgsl.so ls ${GSL_INSTALL}/lib/libgslcblas.so

接下来改configure.py。eDMFT 源码里有个configure.py.intel模板,先复制成configure.py:

cd ${EDMFT_ROOT} cp configure.py.intel configure.py

然后用编辑器打开configure.py,找到编译器定义那几行,改成下面这样:

cc = "icx" cxx = "icpx" fc = "ifort" mpi_define = "-D_MPI" pcc = "mpiicc" pcxx = "mpiicpc" pfc = "mpiifort" blasname = "MKL" blaslib = "-qmkl-ilp64=parallel -qmkl" lapacklib = "" fftwlib = "-I${FFTW_INSTALL}/include -L${FFTW_INSTALL}/lib -lfftw3_omp -lfftw3" gsl = "-I${GSL_INSTALL}/include -L${GSL_INSTALL}/lib -lgsl -lgslcblas -qmkl-ilp64=parallel -qmkl"

注意fftwlib和gsl这两行里的${FFTW_INSTALL}和${GSL_INSTALL}是 shell 变量,configure.py在运行时会去读环境变量。所以你在跑setup.py之前,必须确保这两个变量已经 export 了。如果你不想依赖环境变量,也可以把路径写死,比如/public/software/wien2k/E+DMFT/eDMFT-master/bin/fftw/include,但那样换机器就得改。

改完之后,回到 eDMFT 根目录,执行:

python3 setup.py

如果一切正常,你会看到它开始编译各个子模块,最后生成bin/下面的可执行文件。如果中途弹出提示说找不到 fftw3 或 GSL,先别急着按d让它自动下载,因为自动下载的版本可能跟 Intel 编译器链不兼容。先退出来,检查上面两个库的路径和configure.py里的变量是否一致。

4. 验证安装:跑一个 WIEN2k 最小算例看 eDMFT 能不能初始化

编译过了不代表能用。你得拿一个 WIEN2k 的算例跑一遍 eDMFT 的初始化流程,看它能不能正确读取 WIEN2k 的输出并生成 DMFT 输入文件。这里用一个最简单的体心立方铁做例子,你手头如果有别的 WIEN2k 算例也可以。

先确认 WIEN2k 本身能跑:

cd ${WIENROOT} ls $WIENROOT/SRC_templates which x lapw1

x lapw1能返回路径说明 WIEN2k 环境没问题。然后进入你的算例目录,比如Fe_bcc,先跑一遍 WIEN2k 的 SCF:

cd ~/work/Fe_bcc init_lapw -b -vxc 13 -rkmax 7 -numk 1000 run_lapw -ec 0.0001

SCF 收敛之后,检查有没有生成.struct、.scf、.energy这些文件。eDMFT 需要读 WIEN2k 的case.struct和case.scf来构造 DMFT 的输入。

接下来设置 eDMFT 的环境变量,把 eDMFT 的bin目录加到PATH里:

export PATH=${EDMFT_ROOT}/bin:$PATH export WIENROOT=/public/software/wien2k export EDMFT_ROOT=${WIENROOT}/E+DMFT/eDMFT-master

然后跑 eDMFT 的初始化脚本。不同版本的 eDMFT 入口脚本名字可能不一样,常见的是edmft_init.py或者run_edmft.py。先看一下bin目录里有什么:

ls ${EDMFT_ROOT}/bin/

假设你看到edmft_init.py,就在算例目录下执行:

cd ~/work/Fe_bcc python3 ${EDMFT_ROOT}/bin/edmft_init.py -w .

如果安装成功,它会输出类似下面的信息:

Reading WIEN2k struct file: Fe_bcc.struct Reading WIEN2k scf file: Fe_bcc.scf Generating DMFT input: Fe_bcc.indmftpr Generating impurity input: Fe_bcc.imp eDMFT initialization completed.

然后检查生成的Fe_bcc.indmftpr文件:

cat Fe_bcc.indmftpr

里面应该包含原子种类、轨道数、相互作用参数这些信息。如果这个文件生成了,说明 eDMFT 已经能正确读取 WIEN2k 的输出,安装基本成功。

再进一步,你可以试着跑一个单次 DMFT 迭代,看杂质求解器能不能启动。这一步会调用 CTQMC 或者 Hubbard-I 求解器,时间可能比较长,但只要能启动并输出迭代信息,就说明整个链路是通的:

python3 ${EDMFT_ROOT}/bin/edmft_run.py -w . -s 1

-s 1表示只跑一步。如果看到类似CTQMC solver started或者Hubbard-I solver converged的输出,那就没问题了。如果报错说找不到某个.so文件,大概率是LD_LIBRARY_PATH没包含 FFTW 和 GSL 的lib目录,补上:

export LD_LIBRARY_PATH=${FFTW_INSTALL}/lib:${GSL_INSTALL}/lib:$LD_LIBRARY_PATH

这个变量建议写进你的~/.bashrc或者作业脚本里,不然每次开新终端都要重新 export。

5. 编译和运行时的常见报错排查

这一节列几个我实际踩过的报错,你对照着看。

报错一:mpiifort: command not found

这个最常见。原因是 Intel oneAPI 的环境没加载。解决方法是每次编译前先 source:

source /public/intel/oneapi/setvars.sh

如果你在作业脚本里编译,记得把这一行写在module load之后、编译命令之前。另外确认 Intel MPI 的bin目录在PATH里:

echo $PATH | grep mpi

如果没有,手动加:

export PATH=/public/intel/oneapi/mpi/latest/bin:$PATH

报错二:fftw3.h: No such file or directory

说明configure.py里的fftwlib变量没写对,或者FFTW_INSTALL没 export。先检查:

echo $FFTW_INSTALL ls $FFTW_INSTALL/include/fftw3.h

如果文件在但编译还是找不到,那就是configure.py里的-I路径写错了。注意configure.py里用的是${FFTW_INSTALL},这个变量在 Python 脚本里不会自动展开,它依赖 shell 环境变量。所以你必须先export FFTW_INSTALL=...,再跑python3 setup.py。

报错三:undefined reference to cblas_dgemm

这是 GSL 链接 MKL 时出的问题。检查configure.py里gsl那行有没有加-qmkl-ilp64=parallel -qmkl。另外确认 GSL 编译时--with-blas和--with-lapack写的是 MKL 的选项,不是-lblas -llapack。如果你系统里同时有 GNU 的 BLAS,链接器可能会优先找到它,导致符号不匹配。解决办法是在gsl变量里把 MKL 的路径显式加上:

gsl = "-I${GSL_INSTALL}/include -L${GSL_INSTALL}/lib -lgsl -lgslcblas -L${MKLROOT}/lib/intel64 -qmkl-ilp64=parallel -qmkl"

MKLROOT是 oneAPI 自带的变量,sourcesetvars.sh之后就有。

报错四:local proxy failed或401 Unauthorized

这个不是 eDMFT 本身的报错,是你用 TaoToken 查文档时可能遇到的。401一般是 API Key 没设对,检查TAOTOKEN_API_KEY环境变量:

echo $TAOTOKEN_API_KEY

如果为空,重新 export 或者写进~/.bashrc。local proxy failed通常是你本地网络配置的问题,跟 eDMFT 编译无关,先确认curl https://taotoken.net/api能不能通。

报错五:reading choices相关错误

如果你在跑edmft_init.py时看到reading choices或者Error reading case.scf,说明 WIEN2k 的 SCF 输出格式跟 eDMFT 预期的不一致。检查case.scf里有没有:ENE和:FER这些行。如果没有,可能是 WIEN2k 版本太老,或者 SCF 没跑完。重新跑一遍run_lapw,确保收敛。

报错六:OAuth 或认证失败

这个一般出现在你用 Claude Code 或者 Cline 接 TaoToken 的时候。检查settings.json里的TAOTOKEN_BASE_URL是不是https://taotoken.net/api,不要加多余的路径。Key 的权限也要确认,有些 Key 可能只开了模型对话权限,没开 MCP 权限。

排查的时候记住一个原则:先确认环境变量,再确认路径,最后看编译器选项。eDMFT 的报错信息有时候很模糊,但九成问题都出在这三样上。

6. 装完之后怎么用:把 eDMFT 接进你的日常计算流程

安装只是第一步,真正要用起来还得把它接进你的 WIEN2k 工作流。我自己的做法是写一个包装脚本,把 WIEN2k 的 SCF 和 eDMFT 的 DMFT 迭代串起来。这样你改一个参数,整个流程能自动跑完。

先建一个run_edmft.sh:

#!/bin/bash #PBS -N edmft_Fe #PBS -l nodes=1:ppn=16 #PBS -l walltime=24:00:00 source /public/intel/oneapi/setvars.sh export WIENROOT=/public/software/wien2k export EDMFT_ROOT=${WIENROOT}/E+DMFT/eDMFT-master export FFTW_INSTALL=${EDMFT_ROOT}/bin/fftw export GSL_INSTALL=${EDMFT_ROOT}/bin/gsl export LD_LIBRARY_PATH=${FFTW_INSTALL}/lib:${GSL_INSTALL}/lib:$LD_LIBRARY_PATH export PATH=${EDMFT_ROOT}/bin:$PATH cd $PBS_O_WORKDIR # 第一步:WIEN2k SCF run_lapw -ec 0.0001 # 第二步:eDMFT 初始化 python3 ${EDMFT_ROOT}/bin/edmft_init.py -w . # 第三步:DMFT 自洽迭代 python3 ${EDMFT_ROOT}/bin/edmft_run.py -w . -s 20

这个脚本里-s 20表示跑 20 步 DMFT 迭代,你可以根据体系复杂度调整。如果是强关联比较强的体系,可能需要 50 步以上。

跑完之后,结果一般在case.indmftpr和case.imp里,还有DMFT目录下的输出文件。你可以用 Python 读这些文件画谱函数或者自能。如果只是想快速看结果,eDMFT 自带了一些分析脚本,在${EDMFT_ROOT}/bin/下面找edmft_plot.py之类的。

另外,如果你在编译或者运行过程中遇到不确定的报错,可以把错误信息贴到模型对话里,地址是 https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_content=chat&utm_campaign=rewrite 。它对于解释 Fortran 编译错误和 MPI 链接问题挺有帮助的。接入文档在 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite ,里面有完整的 API 调用说明。

最后提醒一句:eDMFT 的编译对环境很敏感,换一台机器或者换一个 oneAPI 版本,可能就要重新调configure.py。建议你把改好的configure.py和编译脚本一起存到 Git 里,下次换环境直接拉下来改路径就行。FFTW3 和 GSL 的编译产物也可以打包带走,省得每次重编。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/3 12:18:03

FreeRTOS静态与动态内存分配:从PC思维到MCU实战的全面解析

做嵌入式开发的人,十有八九都纠结过一个问题:任务栈到底该用静态还是动态?尤其是当你从 PC 端的开发思维切到 FreeRTOS 上,会发现两边对"内存"这两个字的理解完全不是一回事。我最初在 PC 上用惯了 malloc,转…

作者头像 李华
网站建设 2026/10/3 12:17:53

Codex CLI 配置 Azure OpenAI GPT-5-codex 指南:config.toml 与 AGENTS.md 实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/3 12:17:34

T527解锁玄铁RISC-V核心:从U-Boot启动到裸机固件实战

如果你手里有一块Allwinner T527的开发板,又恰好对RISC-V架构感兴趣,那你大概率会盯着芯片手册里那个“XuanTie”核心发呆——明明硬件就在那儿,Linux跑起来却完全看不到它的影子,确实让人心痒。这篇文章就是针对这个问题的第一次…

作者头像 李华
网站建设 2026/10/3 12:17:18

专用线缆组件设计与选型:从信号完整性到工业拖链耐久性

朋友厂里一条自动化产线,设备一开机就报编码器通讯故障,电气工程师查了两天,换了三个PLC通讯模块都没解决。最后把拖链里那根编码器线缆组件整段抽出来,剥开护套才发现:内部的屏蔽层已经磨成粉末,其中两芯导…

作者头像 李华