
1. 先搞清楚 eDMFT 到底在算什么为什么装起来这么折腾eDMFT 是给 WIEN2k 做 DFTDMFT 耦合计算的扩展套件全称里那个 “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/EDMFT/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_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite 。生成之后你可以用 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_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite 。它比按量调用更适合高频查报错、改脚本的场景。接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 里面有不同语言的调用示例。注意一点TaoToken 只是帮你查文档、分析报错的工具它不替代你本地的编译环境。eDMFT 该装的依赖一个都不能少该 source 的setvars.sh一次都不能漏。3. 可复制的环境变量与 configure.py 配置片段这一节是整篇的核心你照着改就行。先把路径统一一下下面这些变量你根据自己集群的实际情况改但变量名建议保持一致因为后面configure.py里会引用。# WIEN2k 安装路径 export WIENROOT/public/software/wien2k # eDMFT 根目录通常在 WIEN2k 下面 export EDMFT_ROOT${WIENROOT}/EDMFT/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} \ CCicx CXXicpx F77ifort \ --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} \ CCicx CXXicpx FCifort \ --with-blas-qmkl-ilp64parallel -qmkl \ --with-lapack-qmkl-ilp64parallel -qmkl make -j4 make install cd ../GSL 编译完检查libgsl.so和libgslcblas.sols ${GSL_INSTALL}/lib/libgsl.so ls ${GSL_INSTALL}/lib/libgslcblas.so接下来改configure.py。eDMFT 源码里有个configure.py.intel模板先复制成configure.pycd ${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-ilp64parallel -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-ilp64parallel -qmkl注意fftwlib和gsl这两行里的${FFTW_INSTALL}和${GSL_INSTALL}是 shell 变量configure.py在运行时会去读环境变量。所以你在跑setup.py之前必须确保这两个变量已经 export 了。如果你不想依赖环境变量也可以把路径写死比如/public/software/wien2k/EDMFT/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 的 SCFcd ~/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}/EDMFT/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 的环境没加载。解决方法是每次编译前先 sourcesource /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-ilp64parallel -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-ilp64parallel -qmklMKLROOT是 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 nodes1:ppn16 #PBS -l walltime24:00:00 source /public/intel/oneapi/setvars.sh export WIENROOT/public/software/wien2k export EDMFT_ROOT${WIENROOT}/EDMFT/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_sourcetaotoken_aicg_blog_endutm_contentchatutm_campaignrewrite 。它对于解释 Fortran 编译错误和 MPI 链接问题挺有帮助的。接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 里面有完整的 API 调用说明。最后提醒一句eDMFT 的编译对环境很敏感换一台机器或者换一个 oneAPI 版本可能就要重新调configure.py。建议你把改好的configure.py和编译脚本一起存到 Git 里下次换环境直接拉下来改路径就行。FFTW3 和 GSL 的编译产物也可以打包带走省得每次重编。