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 mpiifortwhich那行必须每个都返回路径,少一个都不行。如果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 lapw1x lapw1能返回路径说明 WIEN2k 环境没问题。然后进入你的算例目录,比如Fe_bcc,先跑一遍 WIEN2k 的 SCF:
cd ~/work/Fe_bcc init_lapw -b -vxc 13 -rkmax 7 -numk 1000 run_lapw -ec 0.0001SCF 收敛之后,检查有没有生成.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 的编译产物也可以打包带走,省得每次重编。