简介:这份资源围绕第一性原理计算软件Octopus展开,聚焦时间依赖密度泛函理论(TDDFT)模拟计算,面向具备一定量子化学与凝聚态物理基础、希望借助TDDFT研究分子或材料光学性质的科研人员与高年级学生。内容涵盖基态DFT预计算、TDDFT参数设置、激发态响应计算、吸收与荧光光谱分析以及电子密度与轨道可视化等完整流程,可帮助读者理解如何用Octopus预测分子在不同频率下的响应,进而服务于太阳能电池材料、光催化剂等方向的设计与评估。资源以gz压缩包形式提供,包体约4.58MB,文件总数暂未统计,主要包含软件源代码、编译脚本、文档与示例输入文件等,便于自行编译配置计算环境。目前已有409人学习下载,适合作为入门Octopus并实践TDDFT计算的参考起点。
1. octopus 与 TDDFT 模拟计算:从一束激光到一块材料的电子响应
如果你手头有一台跑得动第一性原理的机器,又恰好需要看电子在含时外场下的真实响应——比如强激光脉冲打上去之后电荷怎么迁移、吸收谱在哪个能量点起峰——那 octopus 加 TDDFT 这套组合大概率是你绕不开的选项。它和常见的基态 DFT 工具思路不同:基态算的是“电子待在哪”,含时密度泛函(TDDFT)算的是“电子怎么动”。octopus 用实空间网格离散波函数,天然适合做实时(real-time)TDDFT,不需要预先算一堆空带,强场、非线性、超快过程都能直接推时间演化。这篇笔记面向已经会跑基态计算、想切进含时模拟的从业者,也照顾刚接触 octopus 的新手。我会把选型理由、输入文件怎么写、参数怎么调、哪里最容易翻车,按能复现的顺序讲清楚。
2. 为什么用 octopus 做实时 TDDFT:网格、传播子和三种激发模式
2.1 实空间网格离散和平面波基组的本质差别
主流基态 DFT 代码大多用平面波基组,靠截断能控制收敛,周期性体系很顺手。但做实时 TDDFT 时,平面波要展开含时波函数,每个时间步都得处理大量空带,代价随传播步数线性甚至更高地涨。octopus 换了个思路:把波函数直接放在实空间网格上,网格间距 Δx 决定空间分辨率,波函数值就是格点上的数。含时演化只需要对波函数做一次算符作用,不需要空带展开,所以强场下的非线性响应能算得比较自然。
代价是网格数量随体系体积和 Δx 三次方增长。一个 20 Å 边长的盒子,Δx 取 0.3 Å,单维约 67 个点,三维就是三十万格点量级,还能接受;但如果你把 Δx 压到 0.15 Å,格点数直接翻八倍,内存和耗时都会顶上来。所以 octopus 的典型适用区间是中小体系、需要强场或宽谱响应的场景,不是拿来算大块晶体能带的。
2.2 三种含时模式:实时、微扰、谱学
octopus 做 TDDFT 有三条路,选错模式是新手最常见的翻车点。
| 模式 | 输入关键词 | 适用场景 | 代价 |
|---|---|---|---|
| 实时演化 | TDPropagator | 强激光、非线性、电荷迁移 | 高,随传播时间线性涨 |
| 含时微扰 | TDPerturbation | 弱场吸收谱、激发能 | 中,一次线性响应 |
| 谱学模式 | TDSpectrum | 光学吸收谱、ECD | 中,需先实时跑一段 |
实时演化是 octopus 的看家本领,外场直接写进TDExternalFields,时间步进用指数传播子或 Crank-Nicolson。含时微扰适合弱场极限,本质是算线性响应函数,吸收谱直接从极化率虚部拿。谱学模式则是先做一段实时演化,再对偶极矩做傅里叶变换得到谱。如果你只是想要一个吸收谱,用微扰模式往往比实时模式省一半时间;但如果你要看强场下的谐波产生,实时模式是唯一选择。
2.3 最小可跑通的输入文件结构
octopus 的输入是一个.inp文件,分块用%包裹。下面是一个氦原子在弱激光下的实时 TDDFT 最小例子,能跑通并输出偶极矩随时间的变化。
# 文件名:he_tddft.inp # 基态 + 实时 TDDFT 最小示例 CalculationMode = gs # 先算基态 FromScratch = yes %Coordinates "He" | 0 | 0 | 0 % BoxShape = sphere Radius = 8.0 # 盒子半径,单位 Bohr Spacing = 0.35 # 网格间距,单位 Bohr %Species "He" | species_user_defined | potential_formula | "1/2*r^2" | valence | 2 % # 基态收敛参数 ConvRelDens = 1e-6 MaximumIter = 200 # 含时部分 CalculationMode = td TDPropagator = aetrs # 指数传播子,带近似 TDTimeStep = 0.02 # 时间步,单位 hbar/eV TDMaxSteps = 2000 # 总步数,对应约 40 fs %TDExternalFields laser | z | 0.01 | 0.0 | 0.0 | 0.0 | 0.0 % %TDOutput dipole energy multipoles %逻辑说明:CalculationMode = gs先跑基态,octopus 会把基态波函数存下来,切到td时自动读入作为初始态。TDPropagator = aetrs是近似指数传播子,对大多数含时问题够用且比精确指数快。TDTimeStep取 0.02 是保守值,对应最大可分辨能量约 50 eV,覆盖可见到紫外。TDExternalFields里laser | z | 0.01表示沿 z 方向、振幅 0.01 原子单位的连续波,后四个零是频率、相位等参数,这里用默认。TDOutput里的dipole会输出偶极矩时间序列,是后面做谱的原料。
参数说明:Spacing是最关键的一个数。0.35 Bohr 对氦这种紧束缚体系够用,但如果你算的是有机分子,价电子云更弥散,建议 0.25 到 0.30。Radius要保证波函数在边界衰减到可忽略,太小会导致电子撞到盒子壁反射,谱上出现假峰。TDMaxSteps乘TDTimeStep是总传播时间,做吸收谱一般要跑到 20 到 50 fs,对应 1000 到 2500 步。
3. 从基态到含时:输入文件逐块拆解与参数标定
3.1 基态收敛没做好,含时全是噪声
很多人急着跑 TDDFT,基态只收敛到 1e-4 就切含时,结果偶极矩振荡里混着基态残余误差,谱线毛刺多得没法看。基态收敛要压到ConvRelDens = 1e-6甚至 1e-8,MaximumIter给足。如果基态跑不动,先检查Spacing是不是太小、Radius是不是太大,这两个参数直接决定矩阵维度。
基态跑完后,octopus 会在目录下生成restart文件夹,里面是gs的波函数。切到td时,FromScratch要设成no,否则它会重新从原子轨道猜一个初始态,含时结果就完全不对了。这个坑我踩过不止一次:输入文件里FromScratch = yes忘了改,跑了一晚上发现偶极矩从一开始就是乱的。
3.2 时间步、传播子和总步数的三角关系
TDTimeStep、TDPropagator、TDMaxSteps三个参数互相牵制。时间步太大,传播子不稳定,能量会漂移;太小,同样总时长要更多步,耗时线性涨。经验值是:aetrs传播子下,TDTimeStep取 0.02 到 0.05 原子单位比较稳;如果换成etrs(精确指数),可以放宽到 0.1,但每步更贵。
总步数由你要看的物理过程决定。做吸收谱,谱分辨率 ΔE 和时间长度 T 满足 ΔE ≈ 2π/T。想要 0.1 eV 分辨率,T 要跑到约 40 fs,对应TDTimeStep = 0.02时 2000 步左右。如果只想看强场下前几个光周期的响应,500 步也够。判断步数够不够,看dipole输出末尾偶极矩有没有衰减到接近零——如果还在振荡,说明谱还没采完,加步数。
3.3 外场怎么写:连续波、脉冲和自定义包络
TDExternalFields支持几种外场。连续波最简单:
%TDExternalFields laser | z | 0.01 | 0.057 | 0.0 | 0.0 | 0.0 %第三个参数是振幅,第四个是频率(原子单位,0.057 对应 1.55 eV,约 800 nm)。但连续波没有时间包络,实际物理里更常用脉冲。octopus 支持用envelope关键字加高斯包络:
%TDExternalFields laser | z | 0.01 | 0.057 | 0.0 | 0.0 | 0.0 | envelope_gaussian | 0.5 %最后的 0.5 是包络宽度(原子单位时间)。高斯脉冲的频谱宽度和包络宽度成反比,0.5 对应约 3.6 eV 带宽,够覆盖大多数价电子激发。如果你要模拟更复杂的脉冲序列,可以用TDExternalFields里的user_defined配合自定义函数,但那需要改源码或写外部文件,新手先用内置包络。
3.4 输出怎么读:偶极矩、能量和谱的转换
跑完之后,td.general/目录下会有dipole和energy文件。dipole每行是时间、x、y、z 三个方向的偶极矩。吸收谱的做法是对偶极矩做傅里叶变换,取虚部。octopus 自带oct-propagation_spectrum工具,直接读dipole文件输出谱:
oct-propagation_spectrum -i td.general/dipole -o spectrum.dat输出的spectrum.dat第一列是能量(eV),后面是各方向振子强度。如果你要的是总吸收谱,把三个方向加起来。注意oct-propagation_spectrum默认会做阻尼处理,-d参数控制阻尼宽度,太大峰会变矮变宽,太小谱线毛刺多。一般取 0.1 到 0.2 eV 比较平衡。
4. 避坑与排查:octopus 跑 TDDFT 最常见的五类翻车
4.1 电子撞盒子壁:谱上出现等间距假峰
现象:吸收谱在高能区出现一串等间距的尖峰,间距和盒子尺寸相关。原因:Radius太小,含时演化中波函数扩散到边界被反射,反射波和原波干涉形成驻波。解决:把Radius加到波函数在基态下衰减到 1e-6 以外的距离。判断方法:跑基态后看static/info里各轨道的空间延展,或者直接把Radius加 2 Bohr 再跑一遍,假峰消失就说明之前太小。
4.2 时间步太大导致能量漂移
现象:energy文件里总能量随时间单调上升或下降,偶极矩振荡幅度异常。原因:TDTimeStep超过了传播子稳定极限,数值积分发散。解决:把TDTimeStep减半,或者换etrs传播子。aetrs的稳定极限大约在 0.05 原子单位,超过就容易出问题。一个快速判断:跑 100 步后看能量变化,如果相对变化超过 1e-6,时间步就偏大。
4.3 基态没收敛就切含时
现象:偶极矩从一开始就乱跳,谱线完全没有物理意义。原因:FromScratch没设成no,或者基态ConvRelDens太松。解决:确认基态跑完后restart目录存在,输入文件里FromScratch = no,并且基态收敛到 1e-6 以下。如果基态本身难收敛,先解决基态问题,别硬切含时。
4.4 外场振幅单位搞混
现象:强场模拟里电子直接电离,或者弱场模拟里响应小到看不见。原因:TDExternalFields的振幅单位是原子单位(Hartree/e·Bohr),不是 V/Å 或 W/cm²。1 原子单位场强约 5.14×10^11 V/m,对应激光强度约 3.5×10^16 W/cm²。如果你习惯用 W/cm²,要先换算。弱场线性响应一般取 1e-4 到 1e-3 原子单位,强场电离取 0.01 以上。
4.5 谱分辨率不够:峰挤在一起分不开
现象:两个相邻激发态在谱上合成一个宽包。原因:总传播时间太短,傅里叶变换的频率分辨率不够。解决:加TDMaxSteps,让总时间至少到 40 fs。如果体系激发态寿命短,本身就有展宽,那加时间也没用,这时候要接受物理展宽,或者用含时微扰模式直接算激发能。
5. 进阶:用 octopus 做含时微扰谱和强场谐波
5.1 含时微扰模式:更省时间的线性吸收谱
如果你只想要线性吸收谱,不需要看强场非线性,含时微扰模式比实时模式省时间。做法是基态跑完后,设CalculationMode = em_resp或td配合TDPerturbation。octopus 会施加一个弱微扰场,直接算极化率。输入里加:
CalculationMode = em_resp EMFreqs = 0.0 | 0.5 | 0.01 # 起始、终止、步长,原子单位这会扫描 0 到 0.5 原子单位(约 13.6 eV)的激发能,步长 0.01。输出在em_resp目录下,直接给振子强度。代价比实时模式低,但只能在线性响应区间用,强场下不适用。
5.2 强场谐波:实时模式看高次谐波产生
强场下电子被拉出再回撞,会辐射高次谐波。octopus 实时模式能直接看这个。把外场振幅调到 0.05 原子单位以上,频率取 0.057(800 nm),跑 2000 步。输出偶极矩做傅里叶变换后,谱上会出现基频的奇次谐波,一直延伸到平台区。判断谐波是否物理:看截止能量是否满足 Ip + 3.17Up,Ip 是电离能,Up 是有质动力能。如果截止位置对不上,检查外场振幅和频率单位。
5.3 一个我常用的验证习惯
每次跑完 TDDFT,我会先做三件事:一看energy文件能量是否守恒(相对变化小于 1e-6),二看dipole末尾是否衰减到接近零,三把Radius加 2 Bohr 重跑一遍看谱有没有变化。这三步能挡掉八成以上的假结果。octopus 的 TDDFT 不是黑匣子,但它的参数耦合比基态计算紧得多,一个参数没设对,结果就可能是玄学。希望帮到你。
本文还有配套的精品资源,点击获取