首页 / 资讯中心 / 文章详情

octopus TDDFT计算入门:实时传播吸收谱与激发态动力学实战

octopus TDDFT计算入门:实时传播吸收谱与激发态动力学实战 ★ FEATURED ARTICLE
简介这份资源面向量子化学与凝聚态物理方向的研究者及研究生提供第一性原理计算软件Octopus 4.1.0的完整源码包用于开展基于密度泛函理论与时间依赖密度泛函理论TDDFT的电子结构模拟。压缩包为gz格式整体约4.58MB内含软件源代码、编译脚本、官方文档、示例输入文件及预装依赖库可支撑从基态DFT预计算、TDDFT参数设置到激发态响应计算与吸收、荧光光谱分析的完整流程并借助可视化工具呈现电子密度分布与激发态动画。目前已有409人学习下载适合具备一定编程与计算背景、希望深入理解分子光学性质与动态过程的读者参考对太阳能电池材料、光催化剂等新材料设计具有实用价值。1. octopus 做 TDDFT 计算一份能跑通的入门资源到底长什么样如果你正在找一套能直接上手的 TDDFT 计算流程大概率已经被各种概念绕晕过DFT 基态、激发态、响应函数、交换关联核、Casida 方程……每个词单拎出来都认识拼在一起就不知道从哪下手。这份 octopus 的 TDDFT 模拟计算资源解决的就是这个“从哪下手”的问题——它把一套完整的含时密度泛函理论计算流程拆成了可执行的输入文件、参数说明和结果解读路径而不是只丢给你一本手册让你自己悟。它适合两类人一类是刚接触激发态计算、想用 octopus 跑通第一个 TDDFT 案例的研究生或初级研究者另一类是用过其他 DFT 代码、但想切到 octopus 做实时含时模拟的从业者。octopus 和很多主流 DFT 代码最大的区别在于它用实空间网格而不是平面波基组TDDFT 部分默认走实时传播real-time路线这意味着你不需要显式求解 Casida 矩阵而是通过时间演化波函数来提取吸收谱。这个思路对做非线性光学、强场物理、大体系激发态的人特别友好但如果你习惯了 Gaussian 或 VASP 那套输入逻辑第一次看 octopus 的 inp 文件会有点懵。这份资源的价值就在于把“懵”的阶段压缩掉。2. octopus 的 TDDFT 路线选择实时传播还是线性响应2.1 两种 TDDFT 实现方式的本质区别octopus 支持两种 TDDFT 计算模式选错了轻则算得慢重则结果对不上。第一种是实时传播time-dependent propagation从基态波函数出发施加一个外场脉冲然后让波函数在时间上一步步演化最后对偶极矩做傅里叶变换得到吸收谱。第二种是线性响应linear response在频域里求解 Casida 方程直接给出激发能和振子强度。实时传播的优势是不需要显式构造交换关联核的矩阵元对大规模体系和强场问题更自然而且一次传播就能拿到全频段光谱。缺点是时间步长和总传播时间需要仔细调否则谱峰位置会偏。线性响应的优势是激发能直接输出适合小体系精确对比但体系一大矩阵维度就爆炸。我一般建议如果你做的是吸收谱、光电子谱或者需要外加激光场走实时传播如果你只想要前几个激发能和振子强度体系又不大走线性响应。这份资源主要围绕实时传播展开因为这是 octopus 最有特色的地方也是新手最容易翻车的环节。2.2 实时传播 TDDFT 的输入文件拆解octopus 的核心输入文件叫inp放在一个独立目录里运行。下面是一个典型的实时传播 TDDFT 输入我加了逐行注释# inp —— octopus 实时 TDDFT 吸收谱计算 CalculationMode td # 指定含时计算模式 FromScratch yes # 从头算不读入之前波函数 # 体系几何这里用一个虚构的小分子坐标单位是原子单位 %Coordinates C | 0.0 | 0.0 | 0.0 O | 0.0 | 0.0 | 2.2 % # 模拟盒子实空间网格Spacing 越小越精确也越慢 BoxShape sphere Radius 8.0 Spacing 0.35 # 交换关联泛函TDDFT 常用 ALDA也可换 PBE XCFunctional lda_x lda_c_pz # 时间传播参数 TDPropagator aetrs # 近似 enforced time-reversal symmetry TDTimeStep 0.02 # 原子单位约 0.00048 fs TDMaxSteps 3000 # 总步数对应约 1.45 fs # 外场施加一个 delta 脉冲激发所有频率 TDExternalFields electric_field %TDExternalFields electric_field | 1 | 0 | 0 | 0.01 % # 输出控制每步记录偶极矩用于后续傅里叶变换 TDOutput dipole multipoles这段输入的逻辑链条是先定义分子结构和模拟盒子再选泛函然后设定时间传播参数最后加一个沿 x 方向的弱电场脉冲。TDTimeStep和TDMaxSteps的乘积决定了频率分辨率总时间越长谱越精细但计算量线性增长。Spacing是实空间网格间距0.35 原子单位对轻元素体系通常够用但如果体系里有过渡金属建议降到 0.25 甚至更低。2.3 从偶极矩到吸收谱后处理脚本怎么写octopus 跑完之后会生成td.general/multipoles文件里面是每一步的偶极矩。吸收谱正比于偶极矩对时间的傅里叶变换的虚部。下面是一个 Python 后处理脚本直接读文件出谱import numpy as np import matplotlib.pyplot as plt # 读取 octopus 输出的偶极矩文件 # 文件格式时间(a.u.) dipole_x dipole_y dipole_z data np.loadtxt(td.general/multipoles, comments#) t data[:, 0] dx data[:, 1] # 去掉基态静态偶极矩只留含时部分 dx dx - dx[0] # 傅里叶变换吸收谱正比于频率乘以偶极矩傅里叶变换的虚部 dt t[1] - t[0] n len(t) freq np.fft.rfftfreq(n, ddt) # 频率轴原子单位 spec np.fft.rfft(dx) absorption freq * np.imag(spec) # 吸收强度 # 只画 0 到 1.0 a.u. 范围约 0 到 27 eV mask freq 1.0 plt.plot(freq[mask] * 27.2114, absorption[mask]) # 转成 eV plt.xlabel(Energy (eV)) plt.ylabel(Absorption (arb. units)) plt.savefig(absorption.png, dpi150)这里有几个参数需要留意dx[0]是初始时刻的偶极矩必须减掉否则零频附近会出现巨大伪峰。频率单位是原子单位乘以 27.2114 转成电子伏特。如果你施加的脉冲不是 delta 函数而是有限宽度的还需要在频域除以脉冲的傅里叶变换做去卷积否则谱形会被脉冲包络调制。这个脚本只做了最基础的处理但足够让你看到第一个吸收峰。3. 跑通第一个 TDDFT 案例从基态到吸收谱的完整链路3.1 基态计算TDDFT 不能跳过的一步很多人以为 TDDFT 就是直接算含时其实 octopus 的实时传播必须从基态波函数出发。所以完整流程是两步先跑CalculationMode gs做基态再跑CalculationMode td做含时。基态输入文件可以复用同一个几何和泛函设置只改计算模式# inp_gs —— 基态计算 CalculationMode gs FromScratch yes %Coordinates C | 0.0 | 0.0 | 0.0 O | 0.0 | 0.0 | 2.2 % BoxShape sphere Radius 8.0 Spacing 0.35 XCFunctional lda_x lda_c_pz # 基态收敛参数 ConvRelDens 1e-6 # 密度相对收敛阈值 MaximumIter 200 # 最大自洽迭代步数跑完基态后目录里会生成restart文件夹里面是收敛的波函数和密度。然后跑含时计算时FromScratch要改成no让 octopus 从restart读取基态。这个细节如果搞错含时计算会从随机波函数开始结果完全不可信。3.2 时间步长与传播总时间的参数扫描TDTimeStep和TDMaxSteps是实时 TDDFT 最核心的两个参数。时间步长太大传播会不稳定能量不守恒太小则计算时间成倍增加。我一般会做一次快速扫描先用TDTimeStep 0.02、TDMaxSteps 1000跑一个短传播看能量随时间的变化曲线。如果能量漂移超过 1e-4 原子单位就把步长降到 0.01 再试。传播总时间决定了频率分辨率。傅里叶变换的频率间隔是1/(TDMaxSteps * TDTimeStep)。比如 3000 步、步长 0.02总时间 60 原子单位频率间隔约 0.0167 原子单位换算成 eV 约 0.45 eV。这个分辨率对宽谱够用但如果你想区分靠得很近的激发态总时间要拉到 100 原子单位以上。下面是一个批量扫描的 bash 脚本用来测试不同时间步长下的能量守恒#!/bin/bash # 扫描不同时间步长检查能量漂移 for dt in 0.01 0.02 0.04; do mkdir -p scan_dt_$dt cp inp_gs scan_dt_$dt/ cd scan_dt_$dt # 先生成基态 octopus gs.log # 修改含时输入中的时间步长 sed s/TDTimeStep .*/TDTimeStep $dt/ ../inp_td inp octopus td.log # 提取能量漂移 grep Total energy td.log | tail -5 cd .. done这个脚本的逻辑是对每个时间步长先跑基态再用sed替换含时输入里的步长跑含时最后看日志里最后几步的总能量。如果能量在传播过程中单调下降或上升说明步长偏大。常见做法是让能量漂移控制在 1e-5 原子单位以内。3.3 吸收谱的收敛性验证拿到吸收谱之后不能直接就用。至少要验证三件事第一网格间距Spacing减半后谱峰位置是否移动第二模拟盒子Radius增大后低能峰是否消失有些伪峰来自盒子边界反射第三传播总时间加倍后谱峰是否更锐利。这三项都过了谱才算可信。我一般会做一个简单的收敛表参数测试值谱峰位置变化结论Spacing0.35 / 0.25第一峰移动 0.05 eV0.35 够用Radius8.0 / 10.0低能区无新峰8.0 够用TDMaxSteps3000 / 6000峰宽变窄位置不变3000 可接受如果谱峰位置随参数明显移动说明还没收敛需要继续加密。这个表不用写进论文但自己心里要有数。4. 避坑与排查octopus TDDFT 最容易翻车的五个地方4.1 基态没收敛就跑含时现象含时计算一开始能量就剧烈振荡吸收谱全是噪声。原因基态自洽迭代没收敛波函数不是本征态。解决检查基态日志里ConvRelDens是否达到如果达到最大迭代步数还没收敛先调大MaximumIter或放宽ConvRelDens到 1e-5确认基态能量稳定后再跑含时。4.2 时间步长选得太大导致能量不守恒现象传播过程中总能量持续漂移吸收谱出现虚假低频峰。原因TDTimeStep超过了传播算法的稳定极限octopus 默认的 aetrs 传播器对步长敏感。解决把步长降到 0.01 或 0.005 原子单位重新跑短传播看能量曲线。如果能量漂移仍然大检查Spacing是否太大导致网格色散。4.3 外场强度过大引入非线性效应现象吸收谱峰位与文献对不上或者出现额外峰。原因TDExternalFields里的场强设得太大比如 0.1 原子单位以上体系响应已经非线性而线性吸收谱要求弱场极限。解决把场强降到 0.001 到 0.01 原子单位之间重新计算。如果信号太弱可以增大传播总时间而不是增大场强。4.4 偶极矩文件没减初始值现象吸收谱在零频附近有一个巨大峰掩盖了真实激发。原因后处理时没有减去基态静态偶极矩。解决在傅里叶变换前执行dx dx - dx[0]确保只处理含时部分。这个坑几乎每个新手都会踩一次。4.5 盒子半径太小导致边界反射现象吸收谱在高频区出现规则振荡。原因波函数传播到盒子边界被反射回来与真实响应叠加。解决增大Radius或者改用吸收边界条件octopus 支持AbsorbingBoundaries yes。但吸收边界会引入人为展宽对精确谱峰位置有影响建议先增大盒子验证。5. 进阶技巧用 octopus 做含时外场下的激发态动力学5.1 从吸收谱到实时动力学实时传播 TDDFT 的真正威力不在于静态吸收谱而在于你可以施加任意时间依赖的外场看电子密度怎么动。比如用一束高斯脉冲激光激发体系然后追踪偶极矩的振荡就能提取激发态寿命和退相干信息。下面是一个加高斯脉冲的输入片段TDExternalFields electric_field %TDExternalFields electric_field | 1 | 0 | 0 | 0.005 % # 高斯脉冲包络中心频率 0.2 a.u.宽度 5 a.u. TDExternalFieldsEnvelope gaussian %TDExternalFieldsEnvelope electric_field | 0.2 | 5.0 %这里0.2是中心频率原子单位对应约 5.4 eV5.0是脉冲宽度。跑完之后偶极矩的时间序列会呈现拍频模式傅里叶变换后能看到被脉冲频率选择性激发的峰。这个技巧在模拟光诱导电荷转移时特别有用。5.2 用 octopus 输出含时密度和电流除了偶极矩octopus 还能输出每一步的电子密度和顺磁电流。在输入里加TDOutput density current multipoles密度输出是.vtx格式可以用 VMD 或 ParaView 打开看电子云怎么随时间流动。电流输出对分析圆二色性和磁光效应很有帮助。但要注意每一步都输出密度会让文件体积爆炸建议每隔几十步输出一次TDOutputStep 50这个参数控制输出频率50 表示每 50 步写一次。我一般先用默认输出跑一遍看趋势确认有感兴趣的现象后再加密输出。5.3 一个我踩过的坑传播总时间不够导致谱峰劈裂有一次我算一个有机分子的吸收谱第一峰总是劈成两个小峰换了泛函、调了网格都没用。后来把TDMaxSteps从 2000 加到 8000劈裂消失了。原因是传播总时间太短傅里叶变换的频率分辨率不够一个真实峰被截断成了两个旁瓣。从那以后我每次做 TDDFT 吸收谱都强制走一遍“总时间加倍”的验证先用短时间跑再用加倍时间跑如果峰形变了就继续加时间直到谱形稳定。这个习惯帮我省掉了好几次误判。希望这份流程能帮你把 octopus 的 TDDFT 计算真正跑起来而不是停在“知道有这么个东西”的阶段。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?
咨询建站