多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

基于EPW与Migdal-Eliashberg方程的第一性原理超导能隙计算全流程

基于EPW与Migdal-Eliashberg方程的第一性原理超导能隙计算全流程 1. 从声子谱到超导能隙这套流程到底在算什么第一次接触EPW和Migdal-Eliashberg方程的人大概率会被那一长串物理名词劝退。但如果你把它拆开来看本质上就是一件事给定一个材料的晶格振动谱声子谱算出电子怎么被这些振动“粘”在一起形成库珀对最终得到超导能隙随温度的变化曲线。这条曲线直接告诉你这个材料在什么温度下超导、能隙有多大、属于哪一类超导体系。我最初接触这套流程是因为一个简单的问题某类层状材料在实验上测到了超导转变但密度泛函理论算出来的电子结构看起来平平无奇常规的BCS-Eliashberg估算给出的转变温度远低于实验值。这时候就需要更精细的工具——EPWElectron-Phonon coupling using Wannier functions配合Quantum ESPRESSO走一遍各向同性的Migdal-Eliashberg方程求解看看能不能从第一性原理角度解释实验现象。这套流程适合谁我认为有三类人值得花时间啃下来第一类是做超导材料计算的研究生尤其是需要从电声耦合角度解释实验的第二类是做声子谱计算、想进一步挖掘声子谱物理意义的研究者第三类是对第一性原理超导计算感兴趣、想找一个完整可复现案例的从业者。前提是你得对Quantum ESPRESSO的基本操作有了解至少跑过scf和ph.x知道什么是k点和q点网格。整个流程的核心逻辑链条是这样的DFT基态计算 → 声子谱计算 → 电声耦合矩阵元计算 → Wannier插值 → 各向同性Eliashberg方程求解 → 超导能隙与Tc。每一步都有坑每一步的参数选择都会影响最终结果。下面我按实际操作顺序把每个环节的关键细节和踩过的坑逐一拆开讲。2. 整体方案设计与工具链选型2.1 为什么选EPW而不是其他方案做电声耦合和超导计算市面上能选的工具其实不少。最原始的做法是用Quantum ESPRESSO的ph.x直接算电声耦合矩阵元然后在均匀网格上做积分。但这个方法有个致命问题要得到收敛的超导能隙k点和q点网格需要非常密计算量随网格数呈指数级增长。我试过用6×6×6的q点网格直接算一个简单体系跑了一周还没收敛完全不实用。EPW的核心优势在于Wannier函数插值。它把粗网格上的电声耦合矩阵元通过最大局域化Wannier函数MLWF插值到任意密的网格上计算量只随粗网格增大插值到密网格几乎不增加额外成本。这就好比你要画一条平滑曲线不需要在每个点都测量只需要在几个关键位置取点然后用样条插值就能还原整条曲线。EPW做的就是这件事只不过插值的对象是电声耦合矩阵元。另一个选择是直接上Eliashberg方程的各向异性求解但那个计算量和复杂度又上了一个台阶。对于大多数常规超导材料各向同性近似已经能给出足够好的Tc和能隙估计除非你要研究能隙的各向异性结构或者多带效应否则没必要一上来就搞各向异性。2.2 工具链版本与依赖关系我用的组合是Quantum ESPRESSO 7.2 EPW 5.4。这两个版本的兼容性经过实测比较稳定。EPW是作为QE的一个插件存在的编译时需要先编译QE再编译EPW最后链接到一起。如果你用conda或者apt装QE大概率不带EPW必须从源码编译。编译时的关键配置./configure --enable-parallel --with-epwyes MPIF90mpif90 F90ifort CCicc注意--with-epwyes这个选项很多预编译包默认不开。另外EPW对FFTW和HDF5有依赖编译前确保这两个库的路径正确。我踩过一次坑系统里有两个版本的FFTW编译时链接到了旧版本结果EPW运行到Wannier插值那一步直接段错误排查了半天才发现是库版本问题。提示编译完成后用epw.x -h检查是否正常输出帮助信息如果报缺少libepw.so之类的错误说明链接没做好需要检查LD_LIBRARY_PATH。2.3 计算流程的整体设计整个计算分四个大阶段每个阶段有明确的输入输出阶段主要任务关键输出耗时占比第一阶段SCF NSCF 声子谱电荷密度、声子频率约20%第二阶段EPW粗网格电声耦合epmat文件、Wannier投影约50%第三阶段Wannier插值到密网格插值后的电声耦合约10%第四阶段Eliashberg方程求解能隙函数、Tc约20%耗时占比因体系而异但EPW粗网格那一步通常是瓶颈因为它要在每个q点上算电声耦合矩阵元计算量正比于q点数乘以k点数。3. 核心细节解析与实操要点3.1 SCF和NSCF计算的参数选择SCF计算是基础但很多人在这里就埋下了隐患。最关键的是k点网格。SCF的k网格可以粗一些比如12×12×12但NSCF的k网格必须和后续EPW用的粗网格一致。我建议在SCF阶段就用一个中等密度的网格比如16×16×16然后NSCF用同样的网格。截断能的选择有个经验法则ecutwfc取赝势推荐值的1.2到1.5倍。比如赝势文件里写推荐60 Ry那你就取75到90 Ry。ecutrho对于模守恒赝势取4倍ecutwfc对于超软赝势取8到12倍。这个不能省截断能不够会导致声子频率出现虚频后面全盘皆输。control calculation scf prefix materials outdir ./tmp / system ibrav 0 nat 2 ntyp 2 ecutwfc 80 ecutrho 640 occupations smearing smearing mv degauss 0.02 / electrons conv_thr 1.0d-10 mixing_beta 0.7 / ATOMIC_SPECIES A 1.0 A.pbe.UPF B 1.0 B.pbe.UPFNSCF计算要打开nosym和noinv因为EPW需要完整的布里渊区信息不能利用对称性约化。这一步的k点网格就是后续EPW的粗网格通常取6×6×6到12×12×12。太粗了插值不准太密了EPW那一步算不动。3.2 声子谱计算的关键设置声子计算用ph.xq点网格要和NSCF的k网格匹配。如果NSCF用8×8×8那ph.x的q网格也取8×8×8。这里有个细节ph.x计算时要把ldisp设为.true.nq1 nq2 nq3设为网格数。inputph tr2_ph 1.0d-14 prefix materials outdir ./tmp ldisp .true. nq1 8, nq2 8, nq3 8 fildyn materials.dyn /声子计算完成后用q2r.x把动力学矩阵从实空间转到倒空间再用matdyn.x检查声子谱有没有虚频。如果出现明显虚频说明结构不稳定或者截断能不够这时候不要急着往下走先回去检查SCF参数。我遇到过一次某二维材料在Gamma点附近出现小的虚频一开始以为是计算误差后来发现是真空层厚度不够层间相互作用导致结构不稳定。把真空层从15 Å加到20 Å之后虚频消失。所以声子谱这一步是很好的“体检”能提前发现很多问题。3.3 EPW输入文件的核心参数EPW的输入文件是整个流程中最复杂的部分参数多且相互关联。我挑几个最容易出错的讲。nscf和mp_grid必须和前面NSCF的k网格一致。比如NSCF用了8×8×8那EPW里mp_grid 8 8 8。这个不一致的话EPW会直接报错退出。proj(1)到proj(n)定义Wannier投影的初始轨道。这是EPW最需要经验的地方。投影选得不好Wannier插值就会失败或者精度很差。对于超导计算通常选择费米面附近的轨道比如过渡金属的d轨道、主族的p轨道。如果不知道选什么可以先跑一个不含EPW的Wannier90计算看看Wannier函数能不能很好地拟合能带。inputepw prefix materials outdir ./tmp epwwrite .true. epwread .false. nbndsub 8 wannierize .true. num_iter 500 iprint 2 proj(1) A:d proj(2) B:p nk1 8, nk2 8, nk3 8 nq1 8, nq2 8, nq3 8 mp_grid 8 8 8 fsthick 0.5 eptemp 300 degaussw 0.05 dvscf_dir ./save /fsthick控制费米面附近的能量窗口单位是eV。这个值决定了哪些电子参与电声耦合。太小了会漏掉重要的态太大了计算量暴增。经验值是取0.3到0.6 eV对于Tc较高的材料可以适当放大到0.8 eV。degaussw是电声耦合计算中的展宽参数对应Smearing方法中的degauss。这个值影响电声耦合常数λ的收敛性。太小了收敛慢太大了会抹平细节。我一般从0.05 eV开始试如果λ随degaussw变化明显就说明需要更密的网格或者更小的展宽。3.4 Wannier插值的收敛判断EPW跑完粗网格后会输出Wannier插值的拟合误差。这个误差必须小于0.01 eV才算合格否则插值后的能带和电声耦合都不可信。如果误差大通常有三个原因投影选得不好、nbndsub设得太少、或者粗网格太稀。我的一般做法是先跑一个wannierize .true.的EPW计算看输出的拟合误差。如果误差大就调整投影。比如某过渡金属化合物一开始只选了d轨道误差0.05 eV后来把配体的p轨道也加进去误差降到0.005 eV。费米面附近的轨道成分一定要选全这是Wannier插值成功的关键。插值完成后EPW会输出一个epw.out文件里面有各向同性Eliashberg函数α²F(ω)和电声耦合常数λ。检查α²F(ω)是否为正、是否在声子频率范围内这是判断计算是否合理的第一道关卡。4. 实操过程与核心环节实现4.1 完整操作流程与命令序列假设你已经编译好了QEEPW赝势文件准备好了结构文件也建好了。下面是完整的命令序列。第一步SCF计算mpirun -np 16 pw.x -in scf.in scf.out检查scf.out最后是否输出convergence has been achieved以及总能量是否合理。第二步NSCF计算mpirun -np 16 pw.x -in nscf.in nscf.outNSCF的k网格要和EPW的mp_grid一致。这一步会生成波函数文件供后续ph.x和EPW使用。第三步声子计算mpirun -np 16 ph.x -in ph.in ph.out这一步耗时较长取决于q点数和体系大小。跑完后检查materials.dyn1等文件是否生成。第四步q2r和matdyn检查声子谱mpirun -np 4 q2r.x -in q2r.in q2r.out mpirun -np 4 matdyn.x -in matdyn.in matdyn.out用gnuplot或者python画出声子谱确认没有明显虚频。第五步EPW粗网格计算mpirun -np 16 epw.x -in epw1.in epw1.out这一步会生成Wannier函数和粗网格上的电声耦合矩阵元。检查epw1.out中的Wannier拟合误差。第六步EPW插值到密网格并求解Eliashberg方程mpirun -np 16 epw.x -in epw2.in epw2.out在epw2.in中设置epwread .true.wannierize .false.并指定密网格。这一步会输出α²F(ω)、λ、以及超导能隙随温度的变化。4.2 关键参数的计算与选择过程密网格的选取EPW插值后的密网格通常取粗网格的4到8倍。比如粗网格8×8×8密网格可以取32×32×32或者48×48×48。密网格越大Eliashberg方程的解越精确但计算量也越大。我的经验是先用24×24×24试跑看Tc是否收敛如果不收敛再加密。Eliashberg方程中的库仑赝势μ*这是最不确定的参数。μ通常取0.1到0.15对于常规超导材料取0.13左右。这个值对Tc影响很大μ从0.1变到0.15Tc可能变化20%到30%。如果实验上有Tc数据可以用实验Tc反推μ*这样得到的μ*再用于预测其他性质会更可靠。温度网格Eliashberg方程求解时需要指定温度范围。一般从0.1 K到超过预期Tc的温度取20到30个温度点。在Tc附近要加密因为能隙在Tc附近变化剧烈。4.3 超导能隙的提取与判读EPW输出的超导能隙文件通常叫gap.dat或者类似的名字里面包含温度、能隙值、以及收敛信息。判读时注意几点能隙在低温下应该趋于一个常数这是BCS理论的基本预言。如果低温下能隙还在变化说明温度网格不够密或者收敛没做好。能隙随温度的变化曲线应该是一个“倒U形”在Tc处降为零。如果曲线形状奇怪比如出现多个平台或者不单调可能是多带效应或者各向异性导致的这时候各向同性近似可能不够用。Tc的确定能隙降为零的温度就是Tc。实际操作中由于温度网格是离散的Tc通常通过线性外推得到。EPW也会输出一个拟合的Tc值但建议自己检查能隙曲线确认。4.4 结果验证与交叉检查算完不算完必须做几项验证第一检查λ和α²F(ω)的积分关系。λ 2∫α²F(ω)/ω dω这个积分关系必须满足否则说明输出有问题。第二检查Tc和λ、ω_log的关系。Allen-Dynes公式给出的Tc应该和Eliashberg方程的解接近。如果差很多说明μ*或者ω_log的取值有问题。第三和实验对比。如果有实验Tc直接对比。如果实验Tc和计算Tc差很多先检查μ*是否合理再检查声子谱是否有虚频最后检查Wannier插值是否收敛。5. 常见问题与排查技巧实录5.1 EPW运行报错与解决方案报错信息可能原因解决方法Cannot open file epmat粗网格计算未完成检查epw1.out是否正常结束Wannier interpolation failed投影选择不当调整proj增加nbndsubFermi level not foundNSCF的费米能不对检查NSCF是否用了正确的占据数q point not foundq网格不匹配确保ph.x和EPW的q网格一致Segmentation fault库版本冲突检查FFTW和HDF5链接5.2 声子谱虚频的处理虚频是声子计算中最常见的问题。如果虚频出现在Gamma点附近且很小小于1 THz可能是数值误差可以忽略。但如果虚频很大或者出现在其他q点说明结构不稳定。处理方法先检查截断能是否足够把ecutwfc提高20%再试。如果虚频还在检查结构优化是否收敛原子受力是否小于0.01 eV/Å。如果都没问题可能是材料本身在低温下确实不稳定需要考虑有限温度效应或者非谐效应。5.3 Wannier插值不收敛的排查Wannier插值不收敛的表现是拟合误差大、插值后的能带和DFT能带对不上。排查步骤检查nbndsub是否足够。费米面附近的能带数量要全部包含。检查投影轨道是否合理。过渡金属的d轨道、主族的s和p轨道通常都要选。检查粗网格是否太稀。8×8×8是最低要求对于复杂体系可能需要12×12×12。检查num_iter是否足够。Wannier化的迭代次数不够也会导致不收敛。5.4 Tc计算值偏离实验的可能原因如果计算Tc和实验Tc差很多按以下顺序排查μ*取值这是最大的不确定源。试试μ*0.1和μ*0.15看Tc变化范围。各向同性近似如果材料有明显的多带或者各向异性各向同性近似会失效。这时候需要各向异性Eliashberg方程。声子谱精度如果声子谱有虚频或者精度不够电声耦合矩阵元就不准。费米面拓扑如果费米面有复杂的拓扑结构比如狄拉克点或者范霍夫奇点简单的各向同性近似可能不够。提示我个人的经验是对于常规的金属性超导材料这套流程给出的Tc和实验值通常在20%到30%的误差范围内。如果误差超过50%大概率是某个环节出了问题需要回头检查。5.5 计算资源与并行效率优化EPW的计算量主要在两个地方粗网格电声耦合计算和密网格插值。粗网格那一步可以并行到几百个核但密网格插值那一步并行效率不高通常只能用到几十个核。优化建议粗网格计算用MPI并行-np设为核心数。密网格插值用OpenMP并行设置OMP_NUM_THREADS。如果内存不够减小fsthick或者降低密网格密度。用npool参数把k点分到不同的池子里提高并行效率。6. 从能隙曲线到物理图像结果解读与延伸6.1 能隙曲线的物理含义拿到超导能隙随温度的变化曲线后能读出很多信息。零温能隙Δ(0)和Tc的比值2Δ(0)/kBTc是一个关键指标。BCS理论预言这个比值是3.53如果算出来接近这个值说明是常规的弱耦合超导。如果明显大于3.53说明是强耦合超导电声耦合常数λ通常大于1。能隙曲线的形状也有讲究。如果曲线在Tc附近下降得很陡说明是常规的s波超导。如果下降得很平缓或者出现两个台阶可能有多带效应或者各向异性。6.2 α²F(ω)的解读α²F(ω)是Eliashberg函数它描述了电声耦合的谱分布。α²F(ω)的峰值位置对应声子谱中耦合最强的模式。如果峰值在低频说明低频声子对超导贡献大如果峰值在高频说明高频声子贡献大。λ的积分值直接决定了Tc的大小。λ越大Tc通常越高但也不是线性的因为还有μ*的竞争。6.3 从计算结果反推材料设计这套流程不仅能解释已有材料的超导性还能指导新材料设计。比如你想找Tc更高的材料可以找声子谱中低频模式丰富的材料因为低频声子对λ贡献大。找费米面附近态密度高的材料因为电声耦合矩阵元正比于态密度。通过掺杂或者应力调控声子谱和电子结构优化λ和ω_log。6.4 后续可以扩展的方向这套各向同性Eliashberg流程跑通之后有几个自然的扩展方向各向异性Eliashberg方程如果各向同性近似不够可以上各向异性求解得到能隙在费米面上的分布。多带Eliashberg方程对于铁基超导等多带体系需要考虑带间耦合。有限温度声子谱如果低温下声子谱变化明显需要考虑温度对声子谱的影响。超导转变温度的压力依赖通过改变晶格常数模拟压力效应计算Tc随压力的变化。我个人在实际操作中的体会是这套流程最难的不是某个具体步骤而是整个链条的连贯性和参数的一致性。任何一个环节的参数不匹配都会导致最终结果不可信。建议第一次跑的时候用一个简单的体系比如铝或者铅这些材料的实验数据齐全可以用来验证流程的正确性。等流程跑通了再上复杂的体系。最后分享一个小技巧EPW的输出文件很多建议写一个简单的python脚本自动提取λ、ω_log、Tc这些关键参数省得每次手动翻输出文件。另外把每次计算的输入文件和关键输出存档方便后续对比不同参数的影响。这个习惯在参数调优阶段特别有用。
返回列表