分子动力学引擎 (md)

本模块实现了基于算符分离的分子动力学引擎。

接口定义

MD算符分离架构接口定义

本模块定义了基于刘维尔算符Trotter分解的MD架构接口。 设计思想:将复杂的MD积分分解为可组合的基础算符。

主要类: - MDComponent: MD组件基类 - Propagator: 算符传播子基类,对应exp(iL*dt) - IntegrationScheme: 积分方案基类,通过Trotter分解组合Propagator

参考文献: - Martyna et al., Mol. Phys. 87, 1117 (1996) - Tuckerman et al., J. Chem. Phys. 97, 1990 (1992)

Created: 2025-08-18

class thermoelasticsim.md.interfaces.MDComponent[源代码]

基类:object

MD组件基类

所有MD相关组件的基础抽象类,用于统一接口标准。

class thermoelasticsim.md.interfaces.Propagator[源代码]

基类:MDComponent

算符传播子基类

对应刘维尔算符exp(iL*dt)的数值实现。每个Propagator负责系统状态 在特定物理过程下的时间演化,如位置更新、速度更新、热浴演化等。

设计原则: 1. 单一职责:每个Propagator只负责一种物理过程 2. 无状态:不依赖外部状态,所有信息通过参数传递 3. 可组合性:可通过Trotter分解自由组合 4. 时间可逆:支持对称分解保证数值稳定性

典型实现: - PositionPropagator: exp(iL_r * dt) → r += v*dt - VelocityPropagator: exp(iL_v * dt) → v += F/m*dt - NoseHooverPropagator: 热浴变量演化 - BarostatPropagator: 压浴变量演化

Methods

propagate(cell, dt, **kwargs)

执行dt时间的演化

abstractmethod propagate(cell, dt, **kwargs)[源代码]

执行dt时间的演化

参数:
  • cell (Cell) -- 晶胞对象,包含原子位置、速度、力等信息

  • dt (float) -- 时间步长 (fs)

  • **kwargs (dict) -- 额外参数,如potential对象、温度、压力等

返回类型:

None

备注

该方法应当: 1. 就地修改cell中的相关属性 2. 保持算符的数学性质(线性、幺正性等) 3. 不产生副作用(如文件IO、日志输出等) 4. 在数值精度范围内保持可逆性

class thermoelasticsim.md.interfaces.IntegrationScheme[源代码]

基类:MDComponent

积分方案基类

通过Trotter分解组合多个Propagator实现完整的MD积分步骤。 负责将物理上耦合的演化过程分解为可计算的序列。

设计原则: 1. 对称性:优先使用对称分解保证时间可逆性 2. 物理正确:遵循相应系综的统计力学原理 3. 数值稳定:控制Trotter分解误差在可接受范围 4. 可扩展性:易于添加新的物理过程

常见分解模式: - NVE: exp(iL*dt) ≈ exp(iL_v*dt/2)·exp(iL_r*dt)·exp(iL_v*dt/2) - NVT: 恒温器包裹NVE核心的对称分解 - NPT: 多层嵌套的复杂对称分解

Methods

step(cell, potential, dt)

执行一个完整积分步

abstractmethod step(cell, potential, dt)[源代码]

执行一个完整积分步

参数:
  • cell (Cell) -- 晶胞对象

  • potential (Potential) -- 势函数对象,用于计算原子间相互作用

  • dt (float) -- 时间步长 (fs)

返回类型:

None

备注

该方法应当: 1. 按照特定的Trotter分解顺序调用Propagator 2. 确保分解的对称性和物理正确性 3. 处理不同物理过程间的耦合 4. 在必要时计算和更新力

class thermoelasticsim.md.interfaces.ThermostatInterface[源代码]

基类:MDComponent

恒温器接口

定义恒温器的标准接口,用于向后兼容现有实现。 新的Nose-Hoover等实现应当使用Propagator架构。

Methods

apply(cell, dt, potential)

应用恒温器控制

abstractmethod apply(cell, dt, potential)[源代码]

应用恒温器控制

参数:
  • cell (Cell) -- 晶胞对象

  • dt (float) -- 时间步长 (fs)

  • potential (Potential) -- 势函数对象

返回类型:

None

class thermoelasticsim.md.interfaces.BarostatInterface[源代码]

基类:MDComponent

恒压器接口

定义恒压器的标准接口,用于向后兼容现有实现。 新的Parrinello-Rahman等实现应当使用Propagator架构。

Methods

apply(cell, dt, potential)

应用恒压器控制

abstractmethod apply(cell, dt, potential)[源代码]

应用恒压器控制

参数:
  • cell (Cell) -- 晶胞对象

  • dt (float) -- 时间步长 (fs)

  • potential (Potential) -- 势函数对象

返回类型:

None

传播子

基础算符传播子实现

本模块实现了分子动力学中的基础传播子,每个类对应一个基本的物理过程。 这些传播子可以通过Trotter分解组合成完整的积分方案。

已实现的传播子: - PositionPropagator: 位置演化 r += v*dt - VelocityPropagator: 速度演化 v += F/m*dt - ForcePropagator: 力计算 F = -∇U(r)

设计要点: 1. 每个传播子只负责一种物理过程 2. 严格遵循Velocity-Verlet算法的分解逻辑 3. 避免重复计算力(通过ForcePropagator分离) 4. 保持数值精度和时间可逆性

Created: 2025-08-18

class thermoelasticsim.md.propagators.PositionPropagator[源代码]

基类:Propagator

位置传播子: exp(iL_r * dt)

实现位置的时间演化:r(t+dt) = r(t) + v(t)*dt 这对应于哈密顿动力学中动量项对位置的作用。

物理意义: - 在恒定速度场中的自由传播 - 保持相空间体积(辛性质) - 与势能无关的纯几何演化

注意事项: - 必须处理周期性边界条件 - 不改变速度和力 - 时间可逆:propagate(dt)后propagate(-dt)应恢复原状

Methods

propagate(cell, dt, **kwargs)

执行位置更新

propagate(cell, dt, **kwargs)[源代码]

执行位置更新

参数:
  • cell (Cell) -- 晶胞对象,将直接修改其中原子的位置

  • dt (float) -- 时间步长 (fs)

  • **kwargs (Any) -- 未使用,保持接口一致性

返回类型:

None

class thermoelasticsim.md.propagators.VelocityPropagator[源代码]

基类:Propagator

速度传播子: exp(iL_v * dt)

实现速度的时间演化:v(t+dt) = v(t) + F(t)/m*dt 这对应于哈密顿动力学中力项对动量的作用。

物理意义: - 在恒定力场中的匀加速运动 - 牛顿第二定律的直接数值实现 - 动能的改变源于势能梯度

关键设计: - 假设原子的力已经正确计算 - 不负责力的计算,只使用现有的atom.force - 这避免了在Velocity-Verlet中重复计算力的问题

Methods

propagate(cell, dt, **kwargs)

执行速度更新

propagate(cell, dt, **kwargs)[源代码]

执行速度更新

参数:
  • cell (Cell) -- 晶胞对象,将直接修改其中原子的速度

  • dt (float) -- 时间步长 (fs)

  • **kwargs (Any) -- 未使用,保持接口一致性

返回类型:

None

备注

该方法假设所有原子的力(atom.force)已经正确计算。 如果力未计算或已过期,结果将不正确。

class thermoelasticsim.md.propagators.ForcePropagator(potential)[源代码]

基类:Propagator

力计算传播子: F = -∇U(r)

负责计算系统中所有原子受到的力。严格来说这不是时间演化算符, 但将其统一到Propagator接口中有助于: 1. 明确力计算的时机 2. 避免在积分过程中重复计算 3. 保持代码的模块化和可测试性

设计要点: - 封装势函数的调用 - 确保力计算只在必要时进行 - 支持不同类型的势函数 - 处理力计算可能的异常

使用场景: - Velocity-Verlet中位置更新后的力计算 - 系统初始化时的初始力计算 - 势函数切换后的力重新计算

Methods

propagate(cell, dt, **kwargs)

计算并更新所有原子的力

__init__(potential)[源代码]

初始化力传播子

参数:

potential (Potential) -- 势函数对象,必须实现calculate_forces方法

propagate(cell, dt, **kwargs)[源代码]

计算并更新所有原子的力

参数:
  • cell (Cell) -- 晶胞对象,将更新其中所有原子的force属性

  • dt (float) -- 时间步长 (fs),在此方法中未使用,仅为接口一致性

  • **kwargs (Any) -- 额外参数,可能包含势函数参数等

返回类型:

None

备注

该方法将: 1. 调用势函数计算所有原子间相互作用 2. 更新每个原子的force属性 3. 确保力的单位和符号正确

如果势函数计算失败,将抛出相应异常。

class thermoelasticsim.md.propagators.BerendsenThermostatPropagator(target_temperature, tau=None, mode='equilibration')[源代码]

基类:Propagator

Berendsen恒温器传播子

实现Berendsen弱耦合恒温器,通过速度重新缩放维持目标温度。 这是一个后处理方法,不是真正的算符分离,但适合在现有框架中使用。

算法原理: - 计算当前系统温度 T_current - 根据目标温度计算缩放因子: λ = sqrt(1 + dt/τ * (T_target/T_current - 1)) - 对所有原子速度进行缩放: v_new = λ * v_old

优点: - 实现简单,计算开销小 - 快速收敛到目标温度 - 对系统动力学影响较小

缺点: - 不产生正确的正则系综分布 - 抑制温度涨落 - 不严格保守

适用场景: - 快速温度平衡 - 温度控制要求不严格的模拟 - 作为更复杂恒温器的预平衡步骤

Methods

get_statistics()

获取Berendsen恒温器详细统计信息

propagate(cell, dt, **kwargs)

执行Berendsen温度调节

reset_statistics()

重置统计信息

参数:
__init__(target_temperature, tau=None, mode='equilibration')[源代码]

初始化Berendsen恒温器

参数:
  • target_temperature (float) -- 目标温度 (K)

  • tau (float, optional) -- 时间常数τ_T (fs),控制温度耦合强度 如果为None,则根据mode自动选择: - 平衡模式: 500 fs (中等强度耦合,快速收敛) - 生产模式: 2000 fs (弱耦合,减少动力学扰动)

  • mode (str, optional) -- 运行模式,'equilibration'(平衡) 或 'production'(生产) 影响默认τ_T值的选择

备注

根据MD恒温器研究报告建议: - 平衡阶段: τ_T = 0.1-1.0 ps,快速达到目标温度 - 生产阶段: τ_T = 2.0-10.0 ps,最小化动力学扰动 - 经验法则: τ_T ≈ 50-100 × dt,确保数值稳定性

propagate(cell, dt, **kwargs)[源代码]

执行Berendsen温度调节

参数:
  • cell (Cell) -- 晶胞对象,将修改其中所有原子的速度

  • dt (float) -- 时间步长 (fs)

  • **kwargs (Any) -- 额外参数,未使用

返回类型:

None

备注

该方法实现Berendsen恒温器的标准算法: 1. 计算当前系统瞬时温度 T_inst 2. 根据温度弛豫方程计算缩放因子: λ = sqrt(1 + dt/τ_T * (T_0/T_inst - 1)) 3. 对所有原子速度进行缩放: v_new = λ * v_old 4. 应用数值稳定性限制和统计监控

根据MD恒温器研究报告的理论指导,此算法虽然不产生严格的 正则系综,但适合于平衡阶段和快速温度收敛。

get_statistics()[源代码]

获取Berendsen恒温器详细统计信息

返回:

包含统计信息的字典: - 'total_steps': 总调节步数 - 'average_scaling': 平均缩放因子 - 'max_scaling': 最大缩放因子 - 'min_scaling': 最小缩放因子 - 'target_temperature': 目标温度 (K) - 'tau': 时间常数 τ_T (fs) - 'mode': 运行模式 (equilibration/production) - 'limited_steps': 被ASE限制的步数 - 'upper_limited': 上限限制次数 - 'lower_limited': 下限限制次数 - 'limitation_rate': 限制比例 (%) - 'effective_coupling': 有效耦合强度评估

返回类型:

dict

reset_statistics()[源代码]

重置统计信息

返回类型:

None

class thermoelasticsim.md.propagators.AndersenThermostatPropagator(target_temperature, collision_frequency=None)[源代码]

基类:Propagator

Andersen随机碰撞恒温器传播子

实现Andersen恒温器,通过随机碰撞维持目标温度。 每个原子在每个时间步都有一定概率与热浴发生碰撞, 碰撞时原子速度从Maxwell分布重新采样。

算法原理: - 每个时间步,每个原子有概率 P = ν*dt 发生碰撞 - 如果发生碰撞,从Maxwell分布重新采样该原子速度 - 碰撞是独立的,不影响系统其他原子

优点: - 产生正确的正则系综分布 - 理论基础严格,符合统计力学 - 实现简单,数值稳定 - 不抑制温度涨落

缺点: - 破坏动力学连续性 - 不保持相关函数 - 随机性强,不适合某些分析

适用场景: - 需要正确正则系综的模拟 - 平衡态性质计算 - 温度涨落重要的系统

Methods

get_statistics()

获取Andersen恒温器详细统计信息

propagate(cell, dt, **kwargs)

执行Andersen随机碰撞(根据研究报告的标准算法)

reset_statistics()

重置统计信息

参数:
  • target_temperature (float)

  • collision_frequency (float)

__init__(target_temperature, collision_frequency=None)[源代码]

初始化Andersen恒温器

参数:
  • target_temperature (float) -- 目标温度 (K)

  • collision_frequency (float, optional) -- 碰撞频率 ν (fs⁻¹) 如果为None,则根据系统尺寸自动选择: - 小系统(≤50原子): 0.005 fs⁻¹ - 中系统(50-150原子): 0.03 fs⁻¹ - 大系统(>150原子): 0.08 fs⁻¹

备注

根据MD恒温器研究报告(Lines 210-221): - 碰撞概率: P_collision = ν × Δt (系统级频率) - 典型ν范围: 10^-4 到 10^-1 fs⁻¹ - Maxwell-Boltzmann采样: σ = sqrt(k_B*T/m) - 严格产生正则(NVT)系综分布

抛出:

ValueError -- 如果target_temperature或collision_frequency为非正数

参数:
  • target_temperature (float)

  • collision_frequency (float)

propagate(cell, dt, **kwargs)[源代码]

执行Andersen随机碰撞(根据研究报告的标准算法)

参数:
  • cell (Cell) -- 晶胞对象,将修改其中部分原子的速度

  • dt (float) -- 时间步长 (fs)

  • **kwargs (Any) -- 额外参数,未使用

返回类型:

None

备注

根据MD恒温器研究报告(Lines 159-187)的标准Andersen算法:

  1. 碰撞概率计算: P_collision = ν × Δt (系统级)

  2. 遵历所有原子,以概率P判断是否碰撞

  3. 如果碰撞,从麦克斯韦-玻尔兹曼分布重新采样速度

  4. Maxwell分布: σ = sqrt(k_B*T/m),每个分量独立采样

关键改进: - 修复碰撞概率计算错误(系统级而非原子级) - 根据系统尺寸适应频率选择 - 使用正确的Maxwell-Boltzmann采样 - 监控实际碰撞率与期望值的匹配

get_statistics()[源代码]

获取Andersen恒温器详细统计信息

返回:

包含统计信息的字典: - 'total_steps': 总步数 - 'total_collisions': 总碰撞次数 - 'collision_rate': 平均碰撞率 (次/步) - 'expected_rate': 理论碰撞率 (fs⁻¹) - 'target_temperature': 目标温度 (K) - 'effective_collision_frequency': 有效碰撞频率 (fs⁻¹) - 'base_collision_frequency': 用户设置或系统推荐的基础频率 (fs⁻¹) - 'recent_collisions': 最近100步的碰撞数 - 'system_size_initialized': 是否已根据系统尺寸初始化

返回类型:

dict

reset_statistics()[源代码]

重置统计信息

返回类型:

None

class thermoelasticsim.md.propagators.NoseHooverChainPropagator(target_temperature, tdamp=100.0, tchain=3, tloop=1)[源代码]

基类:Propagator

Nose-Hoover链恒温器传播子 (高精度实现)

基于ASE和Martyna等人工作的严格实现,采用M个热浴变量的链式结构 和四阶Suzuki-Yoshida分解,确保数值稳定性和正确的正则系综采样。

关键特性: - 链式结构: M个热浴变量,默认M=3,保证遍历性 - 四阶精度: Suzuki-Yoshida分解,相比二阶显著提升长期稳定性 - 对称回文: 时间可逆的算符分离序列 - 正确Q参数: τ=50-100*dt,避免过强耦合导致的数值不稳定

物理原理: 基于扩展拉格朗日量方法,引入链式热浴变量{ζ_j, p_ζ,j}: - 第一个热浴直接与物理系统耦合 - 后续热浴控制前一个热浴的涨落 - 保证正则系综的严格采样

运动方程: dv_i/dt = F_i/m_i - (p_ζ,1/Q_1) * v_i dp_ζ,1/dt = Σ(m_i*v_i²) - N_f*k_B*T₀ - (p_ζ,2/Q_2)*p_ζ,1 dp_ζ,j/dt = (p_ζ,j-1²/Q_j-1) - k_B*T₀ - (p_ζ,j+1/Q_j+1)*p_ζ,j (j=2,...,M-1) dp_ζ,M/dt = (p_ζ,M-1²/Q_M-1) - k_B*T₀

参考文献: - Martyna, Klein, Tuckerman, J. Chem. Phys. 97, 2635 (1992) - ASE implementation: ase.md.nose_hoover_chain - Yoshida, Phys. Lett. A 150, 262 (1990) - 四阶分解方案

Methods

get_conserved_energy(cell)

计算扩展哈密顿量(守恒量)

get_statistics()

获取详细统计信息

propagate(cell, dt, **kwargs)

执行Nose-Hoover链传播(四阶Suzuki-Yoshida)

reset_statistics()

重置统计信息

reset_thermostat_state()

完全重置热浴状态

参数:
__init__(target_temperature, tdamp=100.0, tchain=3, tloop=1)[源代码]

初始化Nose-Hoover链恒温器

参数:
  • target_temperature (float) -- 目标温度 (K),必须为正数

  • tdamp (float, optional) -- 特征时间常数 (fs),默认100fs 推荐值:50-100*dt,控制耦合强度 过小值(如10*dt)会导致数值不稳定

  • tchain (int, optional) -- 热浴链长度,默认3 M=3通常足够保证遍历性和稳定性

  • tloop (int, optional) -- Suzuki-Yoshida循环次数,默认1 通常1次循环已足够,增加会提升精度但增大计算量

抛出:

ValueError -- 如果参数设置不合理

propagate(cell, dt, **kwargs)[源代码]

执行Nose-Hoover链传播(四阶Suzuki-Yoshida)

实现完整的NHC算符:exp(iL_NHC * dt) 采用三步四阶Suzuki-Yoshida分解保证高精度和长期稳定性。

算法流程:

  1. 对每个SY系数w_k:

  2. 对tloop次循环:

  3. 执行NHC_integration_loop(w_k * dt / tloop)

参数:
  • cell (Cell) -- 晶胞对象,将修改原子速度

  • dt (float) -- 传播时间步长 (fs)

  • **kwargs (Any) -- 额外参数(当前未使用,保留接口一致性)

返回类型:

None

备注

这是NHC的核心方法,必须在NVE积分的两侧各调用一次: exp(iL_NHC * dt/2) * exp(iL_NVE * dt) * exp(iL_NHC * dt/2)

get_conserved_energy(cell)[源代码]

计算扩展哈密顿量(守恒量)

NHC系统的守恒量为: H' = E_kinetic + E_potential + E_thermostat

其中热浴能量: E_thermostat = Σ(p_ζ²/2Q) + N_f*k_B*T₀*ζ[0] + k_B*T₀*Σ(ζ[1:])

返回:

扩展哈密顿量 (eV)

返回类型:

float

参数:

cell (Cell)

get_statistics()[源代码]

获取详细统计信息

返回类型:

dict

reset_statistics()[源代码]

重置统计信息

返回类型:

None

reset_thermostat_state()[源代码]

完全重置热浴状态

返回类型:

None

thermoelasticsim.md.propagators.create_nve_propagators(potential)[源代码]

创建NVE积分所需的基础传播子

参数:

potential (Potential) -- 势函数对象

返回:

包含所有NVE传播子的字典: - 'position': PositionPropagator实例 - 'velocity': VelocityPropagator实例 - 'force': ForcePropagator实例

返回类型:

dict

示例

>>> propagators = create_nve_propagators(eam_potential)
>>> pos_prop = propagators['position']
>>> vel_prop = propagators['velocity']
>>> force_prop = propagators['force']
class thermoelasticsim.md.propagators.LangevinThermostatPropagator(target_temperature, friction=1.0)[源代码]

基类:Propagator

Langevin动力学恒温器传播子

基于Brunger-Brooks-Karplus (BBK)积分算法实现Langevin动力学恒温器。 该恒温器通过在牛顿运动方程中加入摩擦阻力项和随机力项来模拟系统与热浴的相互作用。

备注

理论基础

Langevin运动方程:

\[m_i \frac{d^2\mathbf{r}_i}{dt^2} = \mathbf{F}_i(\mathbf{r}) - \gamma m_i \frac{d\mathbf{r}_i}{dt} + \mathbf{R}_i(t)\]

其中:

  • \(\mathbf{F}_i(\mathbf{r})\): 保守力

  • \(\gamma\): 摩擦系数(friction coefficient)

  • \(\mathbf{R}_i(t)\): 随机力,满足涨落-耗散定理

涨落-耗散定理保证热力学一致性:

\begin{align} \langle \mathbf{R}_i(t) \rangle &= 0 \\ \langle R_{i,\alpha}(t) R_{j,\beta}(t') \rangle &= 2m_i\gamma k_B T_0 \delta_{ij}\delta_{\alpha\beta}\delta(t-t') \end{align}

BBK积分算法步骤

  1. 计算常数: \(c_1 = \exp(-\gamma dt), \quad \sigma = \sqrt{k_B T(1-c_1^2)/m}\)

  2. 半步速度更新: \(\mathbf{v}(t+dt/2) = \mathbf{v}(t) + \frac{1}{2}\mathbf{a}(t)dt\)

  3. 位置更新: \(\mathbf{r}(t+dt) = \mathbf{r}(t) + \mathbf{v}(t+dt/2)dt\)

  4. 计算新力: \(\mathbf{a}(t+dt) = \mathbf{F}(\mathbf{r}(t+dt))/m\)

  5. 最终速度更新: \(\mathbf{v}(t+dt) = c_1 \mathbf{v}_{\text{det}} + \sigma \boldsymbol{\xi}\)

参数选择建议

  • 平衡阶段: \(\gamma \sim 1-10 \text{ ps}^{-1}\) (快速温度控制)

  • 生产阶段: \(\gamma \sim 0.1-5 \text{ ps}^{-1}\) (保持动力学真实性)

  • 过阻尼极限: \(\gamma \gg\) 系统振动频率(布朗动力学)

算法特性

  • 严格正则系综: 产生正确的正则分布

  • 物理一致性: 基于真实的系统-热浴耦合

  • 参数灵活: 摩擦系数可调节耦合强度

  • 涨落保持: 保留自然的热涨落

Methods

get_effective_parameters()

获取当前有效参数

get_statistics()

获取Langevin恒温器详细统计信息

propagate(cell, dt, **kwargs)

执行Langevin恒温器传播(BBK算法的速度更新部分)

reset_statistics()

重置所有统计信息

set_friction(new_friction)

动态调整摩擦系数

参数:
__init__(target_temperature, friction=1.0)[源代码]

初始化Langevin恒温器

参数:
  • target_temperature (float) -- 目标温度 (K),必须为正数

  • friction (float, optional) -- 摩擦系数 γ (ps⁻¹),默认值1.0 ps⁻¹ - 大值:强耦合,快速温度控制,动力学扰动大 - 小值:弱耦合,温度控制慢,动力学保持好

抛出:

ValueError -- 如果target_temperature或friction为非正数

备注

摩擦系数的物理意义: - γ描述了系统与热浴的耦合强度 - 可理解为背景溶剂的粘性效应 - 与LAMMPS参数关系:damp = 1/γ - 与阻尼时间关系:τ_damp = 1/γ

propagate(cell, dt, **kwargs)[源代码]

执行Langevin恒温器传播(BBK算法的速度更新部分)

注意:这个传播子只处理Langevin恒温器的速度更新部分, 即在标准速度-Verlet积分的基础上添加摩擦和随机力效应。

在完整的Langevin积分方案中,这个传播子应该在标准的 位置和力更新之后调用,用于最终的速度修正。

BBK算法的这一步骤: 1. 计算BBK常数:c1 = exp(-γ*dt), σ = sqrt(k_B*T*(1-c1²)/m) 2. 为每个原子生成高斯随机向量 3. 应用速度修正:v_new = c1*v_old + σ*random_vector

参数:
  • cell (Cell) -- 晶胞对象,将修改其中所有原子的速度

  • dt (float) -- 时间步长 (fs)

  • **kwargs (Any) -- 额外参数,当前版本未使用

返回类型:

None

备注

该方法实现BBK算法中的随机-摩擦速度更新:

  1. 对每个原子,计算: - c1 = exp(-γ*dt):速度衰减因子 - σ = sqrt(k_B*T*(1-c1²)/m):随机力强度

  2. 生成高斯随机力并更新速度: v(t+dt) = c1*v_det(t+dt) + σ*R

这确保了涨落-耗散定理的满足,产生正确的正则系综。

抛出:
参数:
返回类型:

None

get_statistics()[源代码]

获取Langevin恒温器详细统计信息

返回:

包含详细统计的字典: - 'total_steps': 总传播步数 - 'target_temperature': 目标温度 (K) - 'friction': 摩擦系数 (ps⁻¹) - 'damping_time': 阻尼时间 (ps) - 'coupling_strength': 耦合强度描述 - 'average_temperature': 平均温度 (K) - 'temperature_std': 温度标准差 (K) - 'temperature_error': 平均温度误差 (%) - 'average_friction_work': 平均摩擦做功 (eV) - 'average_random_work': 平均随机做功 (eV) - 'energy_balance': 摩擦做功与随机做功比值 - 'recent_temperatures': 最近100步的温度历史

返回类型:

dict

reset_statistics()[源代码]

重置所有统计信息

返回类型:

None

set_friction(new_friction)[源代码]

动态调整摩擦系数

参数:

new_friction (float) -- 新的摩擦系数 (ps⁻¹)

抛出:

ValueError -- 如果new_friction为非正数

返回类型:

None

备注

这允许在模拟过程中调整恒温器的耦合强度, 例如在平衡阶段使用大摩擦系数,在生产阶段使用小摩擦系数。

get_effective_parameters()[源代码]

获取当前有效参数

返回:

当前参数字典: - 'friction': 摩擦系数 (ps⁻¹) - 'damping_time': 阻尼时间 (ps) - 'target_temperature': 目标温度 (K) - 'coupling_description': 耦合强度描述

返回类型:

dict

thermoelasticsim.md.propagators.exprel(x)[源代码]

计算 (exp(x) - 1) / x,避免x接近0时的数值误差

参数:

x (np.ndarray) -- 输入数组

返回:

计算结果

返回类型:

np.ndarray

class thermoelasticsim.md.propagators.MTKBarostatPropagator(target_temperature, target_pressure, pdamp, pchain=3, ploop=1)[源代码]

基类:Propagator

MTK (Martyna-Tobias-Klein) 恒压器传播算符

实现基于Nose-Hoover链的各向同性恒压器,支持体积和晶格形状变化。 基于ASE实现和PRD文档的精确算符分离方法。

主要功能: 1. 压力控制的Nose-Hoover链 2. 晶格矩阵h和共轭动量P_g的演化 3. 矩阵指数精确计算 4. 对称Trotter分解确保时间可逆性

参考文献: - Martyna, Tobias, Klein. J. Chem. Phys. 101, 4177 (1994) - ASE源码: ase/md/nose_hoover_chain.py MTKBarostat类 - 四阶Suzuki-Yoshida分解方法

参数:
  • target_temperature (float) -- 目标温度 (K)

  • target_pressure (float) -- 目标压力 (eV/ų) - 注意单位!0.0表示零压

  • pdamp (float) -- 压力阻尼时间 (fs),典型值为100*dt

  • pchain (int, optional) -- 恒压器链长度,默认为3

  • ploop (int, optional) -- 恒压器链积分循环次数,默认为1

Methods

get_barostat_energy()

计算恒压器贡献的能量

get_current_pressure(cell, potential)

获取当前系统压力

get_statistics()

获取恒压器统计信息

integrate_momenta(cell, potential, dt)

按MTK各向异性公式更新粒子动量(与恒压器耦合的半步)

propagate(cell, dt[, potential])

执行恒压器传播一个时间步dt

propagate_positions_and_cell(cell, dt)

使用矩阵指数精确传播粒子位置和晶格

__init__(target_temperature, target_pressure, pdamp, pchain=3, ploop=1)[源代码]
参数:
propagate(cell, dt, potential=None)[源代码]

执行恒压器传播一个时间步dt

基于对称Trotter分解的恒压器链积分,包含: 1. 恒压器链传播 (dt/2) 2. 晶格动量更新 3. 恒压器链传播 (dt/2)

参数:
  • cell (Cell) -- 晶胞对象

  • dt (float) -- 时间步长 (fs)

  • potential (Potential, optional) -- 势能对象,用于应力计算

返回类型:

None

integrate_momenta(cell, potential, dt)[源代码]

按MTK各向异性公式更新粒子动量(与恒压器耦合的半步)

在特征基下: p' = p * exp(-kappa * dt / W) + dt * F * exprel(-kappa * dt / W) 其中 kappa = lambda_i + Tr(P_g)/(3N)

备注

  • 此方法包含力贡献,因此无需外层的纯NVE速度半步。

  • 必须在调用前后配合 _update_cell_momenta(dt/2) 和位置/晶格传播。

参数:
返回类型:

None

propagate_positions_and_cell(cell, dt)[源代码]

使用矩阵指数精确传播粒子位置和晶格

这是MTK算法的核心:通过对P_g矩阵的对角化和指数积分, 实现原子位置和晶格矩阵的同步演化。

算法流程: 1. 对P_g进行特征值分解: P_g = U @ diag(λ) @ U.T 2. 在特征坐标系中精确积分: exp(λ*dt/W) 3. 变换回原坐标系

参数:
  • cell (Cell) -- 晶胞对象

  • dt (float) -- 时间步长

返回类型:

None

get_barostat_energy()[源代码]

计算恒压器贡献的能量

E_barostat = Σ(p_xi²/2R_j) + Tr(P_g.T @ P_g)/(2W) + external work

返回:

恒压器能量 (eV)

返回类型:

float

get_current_pressure(cell, potential)[源代码]

获取当前系统压力

返回:

当前压力 (eV/ų)

返回类型:

float

参数:

cell (Cell)

get_statistics()[源代码]

获取恒压器统计信息

返回类型:

dict

积分方案

积分方案实现

本模块实现了各种MD积分方案,通过Trotter分解组合基础传播子。 每个方案对应一个特定的统计力学系综。

已实现的方案: - NVEScheme: 微正则系综的Velocity-Verlet算法

设计要点: 1. 基于对称Trotter分解保证时间可逆性 2. 复用基础传播子,避免代码重复 3. 每个方案负责特定系综的物理正确性 4. 支持延迟初始化以处理循环依赖

Created: 2025-08-18

class thermoelasticsim.md.schemes.NVEScheme[源代码]

基类:IntegrationScheme

微正则系综(NVE)的Velocity-Verlet积分方案

实现经典的Velocity-Verlet算法,采用算符分离的对称分解: exp(iL*dt) ≈ exp(iL_v*dt/2)·exp(iL_r*dt)·exp(iL_v*dt/2)

其中: - iL_v: 速度传播算符 (力对动量的作用) - iL_r: 位置传播算符 (动量对位置的作用)

算法步骤: 1. v(t+dt/2) = v(t) + F(t)/m * dt/2 [半步速度更新] 2. r(t+dt) = r(t) + v(t+dt/2) * dt [整步位置更新] 3. 计算新位置的力 F(t+dt) [力重新计算] 4. v(t+dt) = v(t+dt/2) + F(t+dt)/m * dt/2 [半步速度更新]

优点: - 二阶精度 O(dt²) - 辛积分器,长期稳定 - 时间可逆 - 能量守恒精度高

适用系统: - 保守哈密顿系统 - 不含耗散或随机过程 - 粒子数N、体积V、总能量E固定

Methods

get_statistics()

获取积分统计信息

reset_statistics()

重置积分统计信息

step(cell, potential, dt)

执行一步Velocity-Verlet积分

__init__()[源代码]

初始化NVE积分方案

创建所需的传播子,使用延迟初始化处理势函数依赖。

step(cell, potential, dt)[源代码]

执行一步Velocity-Verlet积分

参数:
  • cell (Cell) -- 晶胞对象,包含所有原子信息

  • potential (Potential) -- 势函数对象,用于计算原子间相互作用力

  • dt (float) -- 时间步长 (fs)

返回类型:

None

备注

该方法严格按照Velocity-Verlet算法执行:

  1. 第一次半步速度更新:使用当前位置的力

  2. 整步位置更新:使用更新后的速度

  3. 力重新计算:在新位置处计算力

  4. 第二次半步速度更新:使用新位置的力

这确保了算法的对称性和时间可逆性。

抛出:
参数:
返回类型:

None

get_statistics()[源代码]

获取积分统计信息

返回:

包含积分统计的字典: - 'step_count': 已执行的积分步数 - 'total_time': 总积分时间 (fs) - 'average_dt': 平均时间步长 (fs)

返回类型:

dict

reset_statistics()[源代码]

重置积分统计信息

返回类型:

None

class thermoelasticsim.md.schemes.BerendsenNVTScheme(target_temperature, tau=100.0)[源代码]

基类:IntegrationScheme

Berendsen NVT积分方案

组合Velocity-Verlet积分和Berendsen恒温器,实现恒温正则系综模拟。 这是一个后处理方案:先进行标准NVE积分,然后应用温度调节。

算法步骤: 1. 执行标准Velocity-Verlet积分步骤(NVE部分) 2. 应用Berendsen恒温器调节温度(NVT部分)

特点: - 基于现有NVE传播子的模块化设计 - 快速温度收敛 - 实现简单,计算高效 - 适合温度平衡和预处理

限制: - 不产生严格的正则系综分布 - 抑制温度涨落 - 不适合精确的热力学采样

适用场景: - 系统温度平衡 - 恒温MD预处理 - 温度控制要求不严格的模拟

Methods

get_current_temperature(cell)

获取当前系统温度

get_statistics()

获取积分和恒温器统计信息

reset_statistics()

重置所有统计信息

step(cell, potential, dt)

执行一步Berendsen NVT积分

参数:
__init__(target_temperature, tau=100.0)[源代码]

初始化Berendsen NVT积分方案

参数:
  • target_temperature (float) -- 目标温度 (K)

  • tau (float, optional) -- Berendsen恒温器时间常数 (fs),默认100fs - 较小值:快速温度调节,强耦合 - 较大值:缓慢温度调节,弱耦合

抛出:

ValueError -- 如果target_temperature或tau为非正数

step(cell, potential, dt)[源代码]

执行一步Berendsen NVT积分

参数:
  • cell (Cell) -- 晶胞对象,包含所有原子信息

  • potential (Potential) -- 势函数对象,用于计算原子间相互作用力

  • dt (float) -- 时间步长 (fs)

返回类型:

None

备注

该方法执行两阶段积分:

  1. NVE阶段:标准Velocity-Verlet积分 - 速度半步更新 - 位置整步更新 - 力重新计算 - 速度再次半步更新

  2. NVT阶段:Berendsen温度调节 - 计算当前温度 - 计算速度缩放因子 - 调节所有原子速度

抛出:
参数:
返回类型:

None

get_statistics()[源代码]

获取积分和恒温器统计信息

返回:

包含完整统计的字典: - 'step_count': 已执行的积分步数 - 'total_time': 总积分时间 (fs) - 'average_dt': 平均时间步长 (fs) - 'target_temperature': 目标温度 (K) - 'tau': 恒温器时间常数 (fs) - 'thermostat_stats': 恒温器详细统计

返回类型:

dict

reset_statistics()[源代码]

重置所有统计信息

返回类型:

None

get_current_temperature(cell)[源代码]

获取当前系统温度

参数:

cell (Cell) -- 晶胞对象

返回:

当前温度 (K)

返回类型:

float

class thermoelasticsim.md.schemes.AndersenNVTScheme(target_temperature, collision_frequency=0.01)[源代码]

基类:IntegrationScheme

Andersen NVT积分方案

组合Velocity-Verlet积分和Andersen恒温器,实现随机碰撞正则系综模拟。 这是一个后处理方案:先进行标准NVE积分,然后应用随机碰撞调节。

算法步骤: 1. 执行标准Velocity-Verlet积分步骤(NVE部分) 2. 应用Andersen随机碰撞恒温器(NVT部分)

特点: - 产生正确的正则系综分布 - 理论基础严格,符合统计力学 - 温度涨落符合理论预期 - 实现简单,数值稳定

限制: - 破坏动力学连续性 - 不保持速度自相关函数 - 随机性较强,影响某些分析

适用场景: - 平衡态性质计算 - 需要正确温度涨落的模拟 - 热力学性质计算

Methods

get_collision_statistics()

获取碰撞统计信息的便利方法

get_current_temperature(cell)

获取当前系统温度

get_statistics()

获取积分和恒温器统计信息

reset_statistics()

重置所有统计信息

step(cell, potential, dt)

执行一步Andersen NVT积分

参数:
  • target_temperature (float)

  • collision_frequency (float)

__init__(target_temperature, collision_frequency=0.01)[源代码]

初始化Andersen NVT积分方案

参数:
  • target_temperature (float) -- 目标温度 (K)

  • collision_frequency (float, optional) -- 碰撞频率 ν (fs⁻¹),默认0.01 fs⁻¹ - 较大值:更频繁碰撞,更强温度控制 - 较小值:较少碰撞,动力学连续性更好

抛出:

ValueError -- 如果target_temperature或collision_frequency为非正数

step(cell, potential, dt)[源代码]

执行一步Andersen NVT积分

参数:
  • cell (Cell) -- 晶胞对象,包含所有原子信息

  • potential (Potential) -- 势函数对象,用于计算原子间相互作用力

  • dt (float) -- 时间步长 (fs)

返回类型:

None

备注

该方法执行两阶段积分:

  1. NVE阶段:标准Velocity-Verlet积分 - 速度半步更新 - 位置整步更新 - 力重新计算 - 速度再次半步更新

  2. NVT阶段:Andersen随机碰撞 - 为每个原子计算碰撞概率 - 随机选择碰撞原子 - 重新采样碰撞原子的Maxwell速度

抛出:
参数:
返回类型:

None

get_statistics()[源代码]

获取积分和恒温器统计信息

返回:

包含完整统计的字典: - 'step_count': 已执行的积分步数 - 'total_time': 总积分时间 (fs) - 'average_dt': 平均时间步长 (fs) - 'target_temperature': 目标温度 (K) - 'collision_frequency': 碰撞频率 (fs⁻¹) - 'thermostat_stats': 恒温器详细统计

返回类型:

dict

reset_statistics()[源代码]

重置所有统计信息

返回类型:

None

get_current_temperature(cell)[源代码]

获取当前系统温度

参数:

cell (Cell) -- 晶胞对象

返回:

当前温度 (K)

返回类型:

float

get_collision_statistics()[源代码]

获取碰撞统计信息的便利方法

返回:

碰撞统计信息

返回类型:

dict

class thermoelasticsim.md.schemes.NoseHooverNVTScheme(target_temperature, tdamp=100.0, tchain=3, tloop=1)[源代码]

基类:IntegrationScheme

Nose-Hoover NVT积分方案

实现真正的算符分离Nose-Hoover恒温器,组合Velocity-Verlet积分和Nose-Hoover算符分离。 与Berendsen和Andersen的后处理方案不同,这是严格的算符分离方法。

算法步骤(基于Suzuki-Trotter分解): 1. Nose-Hoover恒温器半步:exp(iL_NH*dt/2) 2. 标准Velocity-Verlet积分:exp(iL_v*dt/2)·exp(iL_r*dt)·exp(iL_v*dt/2) 3. Nose-Hoover恒温器半步:exp(iL_NH*dt/2)

特点: - 严格的算符分离,保持辛性质 - 产生正确的正则系综分布 - 时间可逆的确定性演化 - 热浴变量ξ的自洽演化

优点: - 理论基础严格 - 长时间数值稳定 - 动力学性质保持良好 - 温度涨落符合理论预期

缺点: - 参数调节较复杂(Q的选择) - 可能出现长周期振荡 - 对初始条件敏感

适用场景: - 需要严格正则系综的模拟 - 动力学性质计算 - 长时间平衡态模拟

Methods

get_current_temperature(cell)

获取当前系统温度

get_statistics()

获取积分和恒温器统计信息

get_thermostat_variables()

获取热浴变量状态的便利方法

reset_statistics()

重置所有统计信息

reset_thermostat_state()

重置恒温器状态(包括热浴变量ξ)

step(cell, potential, dt)

执行一步Nose-Hoover NVT积分

参数:
__init__(target_temperature, tdamp=100.0, tchain=3, tloop=1)[源代码]

初始化Nose-Hoover NVT积分方案

参数:
  • target_temperature (float) -- 目标温度 (K)

  • tdamp (float, optional) -- 特征时间常数 (fs),默认100fs 推荐值:50-100*dt,控制耦合强度

  • tchain (int, optional) -- 热浴链长度,默认3 M=3通常足够保证遍历性和稳定性

  • tloop (int, optional) -- Suzuki-Yoshida循环次数,默认1

抛出:

ValueError -- 如果target_temperature为非正数或tdamp为非正数

step(cell, potential, dt)[源代码]

执行一步Nose-Hoover NVT积分

参数:
  • cell (Cell) -- 晶胞对象,包含所有原子信息

  • potential (Potential) -- 势函数对象,用于计算原子间相互作用力

  • dt (float) -- 时间步长 (fs)

返回类型:

None

备注

该方法执行严格的算符分离积分:

  1. Nose-Hoover算符半步:处理热浴变量和速度摩擦

  2. 标准Velocity-Verlet积分: - 速度半步更新 - 位置整步更新 - 力重新计算 - 速度再次半步更新

  3. Nose-Hoover算符再次半步:完成热浴变量演化

这种分解保证算法的时间可逆性和相空间体积保持。

抛出:
参数:
返回类型:

None

get_statistics()[源代码]

获取积分和恒温器统计信息

返回:

包含完整统计的字典: - 'step_count': 已执行的积分步数 - 'total_time': 总积分时间 (fs) - 'average_dt': 平均时间步长 (fs) - 'target_temperature': 目标温度 (K) - 'tdamp': 时间常数 (fs) - 'tchain': 热浴链长度 - 'tloop': 循环次数 - 'thermostat_stats': 恒温器详细统计

返回类型:

dict

reset_statistics()[源代码]

重置所有统计信息

返回类型:

None

reset_thermostat_state()[源代码]

重置恒温器状态(包括热浴变量ξ)

返回类型:

None

get_current_temperature(cell)[源代码]

获取当前系统温度

参数:

cell (Cell) -- 晶胞对象

返回:

当前温度 (K)

返回类型:

float

get_thermostat_variables()[源代码]

获取热浴变量状态的便利方法

返回:

包含热浴变量状态: - 'p_zeta': 热浴动量数组 - 'zeta': 热浴位置数组 - 'Q': 质量参数数组 - 'tdamp': 时间常数 - 'tchain': 链长度

返回类型:

dict

class thermoelasticsim.md.schemes.LangevinNVTScheme(target_temperature, friction=1.0)[源代码]

基类:IntegrationScheme

Langevin NVT积分方案

基于Brunger-Brooks-Karplus (BBK)积分算法实现Langevin动力学恒温器。 该方案组合Velocity-Verlet积分和Langevin恒温器,提供基于物理模型的随机恒温。

算法步骤(BBK积分):

  1. 标准Velocity-Verlet积分(NVE部分):

    • v(t+dt/2) = v(t) + F(t)/m * dt/2

    • r(t+dt) = r(t) + v(t+dt/2) * dt

    • F(t+dt) = -∇U(r(t+dt))

    • v_det(t+dt) = v(t+dt/2) + F(t+dt)/m * dt/2

  2. Langevin恒温器修正(NVT部分):

    • 计算BBK常数:c1 = exp(-γ*dt), σ = sqrt(k_B*T*(1-c1²)/m)

    • 应用随机-摩擦修正:v(t+dt) = c1*v_det(t+dt) + σ*R

核心特点: - 基于涨落-耗散定理的严格恒温 - 同时包含摩擦阻力和随机力 - 数值稳定性好,无遍历性问题 - 特别适合生物分子和隐式溶剂系统

参数选择指南: - 平衡阶段:γ ~ 1-10 ps⁻¹(快速温度控制) - 生产阶段:γ ~ 0.1-5 ps⁻¹(保持动力学真实性) - 过阻尼极限:γ >> 系统振动频率(布朗动力学)

优点: - 严格的正则系综采样 - 无长周期振荡问题(vs Nose-Hoover) - 数值稳定性优秀 - 允许较大时间步长 - 物理模型清晰直观

缺点: - 随机性影响动力学性质 - 摩擦项系统性减慢运动 - 破坏速度自相关函数 - 非确定性演化

适用场景: - 生物分子模拟 - 隐式溶剂系统 - 需要鲁棒NVT采样 - 平衡和生产阶段模拟 - 高分子等弛豫时间长的体系

Methods

get_current_temperature(cell)

获取当前系统温度

get_energy_balance_info()

获取能量平衡信息

get_statistics()

获取积分和恒温器统计信息

get_thermostat_parameters()

获取恒温器参数的便利方法

reset_statistics()

重置所有统计信息

set_friction(new_friction)

动态调整摩擦系数

step(cell, potential, dt)

执行一步Langevin NVT积分(BBK算法)

参数:
__init__(target_temperature, friction=1.0)[源代码]

初始化Langevin NVT积分方案

参数:
  • target_temperature (float) -- 目标温度 (K)

  • friction (float, optional) -- 摩擦系数 γ (ps⁻¹),默认值1.0 ps⁻¹ - 大值:强耦合,快速温度控制,动力学扰动大 - 小值:弱耦合,温度控制慢,动力学保持好

抛出:

ValueError -- 如果target_temperature或friction为非正数

step(cell, potential, dt)[源代码]

执行一步Langevin NVT积分(BBK算法)

参数:
  • cell (Cell) -- 晶胞对象,包含所有原子信息

  • potential (Potential) -- 势函数对象,用于计算原子间相互作用力

  • dt (float) -- 时间步长 (fs)

返回类型:

None

备注

该方法执行完整的BBK积分算法:

  1. NVE阶段:标准Velocity-Verlet积分 - 半步速度更新(仅保守力) - 整步位置更新 - 力重新计算 - 半步速度更新(仅保守力)

  2. NVT阶段:Langevin恒温器修正 - 计算BBK参数:c1, σ - 应用随机-摩擦速度修正 - 满足涨落-耗散定理

与其他恒温器的区别: - Berendsen: 速度缩放,不产生正确涨落 - Andersen: 随机重置,破坏动力学连续性更强 - Nose-Hoover: 确定性,但可能有长周期振荡 - Langevin: 连续随机修正,涨落-耗散平衡

抛出:
参数:
返回类型:

None

get_statistics()[源代码]

获取积分和恒温器统计信息

返回:

包含完整统计的字典: - 'step_count': 已执行的积分步数 - 'total_time': 总积分时间 (fs) - 'average_dt': 平均时间步长 (fs) - 'target_temperature': 目标温度 (K) - 'friction': 摩擦系数 (ps⁻¹) - 'damping_time': 阻尼时间 (ps) - 'thermostat_stats': 恒温器详细统计

返回类型:

dict

reset_statistics()[源代码]

重置所有统计信息

返回类型:

None

get_current_temperature(cell)[源代码]

获取当前系统温度

参数:

cell (Cell) -- 晶胞对象

返回:

当前温度 (K)

返回类型:

float

set_friction(new_friction)[源代码]

动态调整摩擦系数

参数:

new_friction (float) -- 新的摩擦系数 (ps⁻¹)

抛出:

ValueError -- 如果new_friction为非正数

返回类型:

None

备注

这允许在模拟过程中调整恒温器的耦合强度。 典型用法: - 平衡阶段:使用大摩擦系数快速达到目标温度 - 生产阶段:使用小摩擦系数保持动力学真实性

get_thermostat_parameters()[源代码]

获取恒温器参数的便利方法

返回:

恒温器参数信息

返回类型:

dict

get_energy_balance_info()[源代码]

获取能量平衡信息

返回:

能量平衡统计信息,包含摩擦做功和随机做功

返回类型:

dict

thermoelasticsim.md.schemes.create_nose_hoover_nvt_scheme(target_temperature, tdamp=100.0, tchain=3, tloop=1)[源代码]

创建标准的Nose-Hoover NVT积分方案

参数:
  • target_temperature (float) -- 目标温度 (K)

  • tdamp (float, optional) -- 特征时间常数 (fs),默认100fs

  • tchain (int, optional) -- 热浴链长度,默认3

  • tloop (int, optional) -- Suzuki-Yoshida循环次数,默认1

返回:

配置好的Nose-Hoover NVT积分方案实例

返回类型:

NoseHooverNVTScheme

示例

>>> scheme = create_nose_hoover_nvt_scheme(300.0, tdamp=50.0)
>>> for step in range(10000):
...     scheme.step(cell, potential, dt=0.5)
>>> stats = scheme.get_statistics()
>>> nhc_vars = scheme.get_thermostat_variables()
>>> print(f"热浴动量: {nhc_vars['p_zeta']}")
thermoelasticsim.md.schemes.create_andersen_nvt_scheme(target_temperature, collision_frequency=0.01)[源代码]

创建标准的Andersen NVT积分方案

参数:
  • target_temperature (float) -- 目标温度 (K)

  • collision_frequency (float, optional) -- 碰撞频率 ν (fs⁻¹),默认0.01 fs⁻¹

返回:

配置好的Andersen NVT积分方案实例

返回类型:

AndersenNVTScheme

示例

>>> scheme = create_andersen_nvt_scheme(300.0, collision_frequency=0.02)
>>> for step in range(10000):
...     scheme.step(cell, potential, dt=0.5)
>>> stats = scheme.get_statistics()
>>> collision_stats = scheme.get_collision_statistics()
>>> print(f"总碰撞次数: {collision_stats['total_collisions']}")
thermoelasticsim.md.schemes.create_berendsen_nvt_scheme(target_temperature, tau=100.0)[源代码]

创建标准的Berendsen NVT积分方案

参数:
  • target_temperature (float) -- 目标温度 (K)

  • tau (float, optional) -- 恒温器时间常数 (fs),默认100fs

返回:

配置好的Berendsen NVT积分方案实例

返回类型:

BerendsenNVTScheme

示例

>>> scheme = create_berendsen_nvt_scheme(300.0, tau=50.0)
>>> for step in range(10000):
...     scheme.step(cell, potential, dt=0.5)
>>> stats = scheme.get_statistics()
>>> print(f"平均温度调节: {stats['thermostat_stats']['average_scaling']:.3f}")
thermoelasticsim.md.schemes.create_langevin_nvt_scheme(target_temperature, friction=1.0)[源代码]

创建标准的Langevin NVT积分方案

基于BBK积分算法,提供基于物理模型的随机恒温。 结合摩擦阻力和随机力,通过涨落-耗散定理确保严格的正则系综采样。

参数:
  • target_temperature (float) -- 目标温度 (K),必须为正数

  • friction (float, optional) -- 摩擦系数 γ (ps⁻¹),默认值1.0 ps⁻¹ - 平衡阶段推荐:1-10 ps⁻¹(快速温度控制) - 生产阶段推荐:0.1-5 ps⁻¹(保持动力学真实性) - 过阻尼极限:>10 ps⁻¹(布朗动力学)

返回:

配置好的Langevin NVT积分方案实例

返回类型:

LangevinNVTScheme

示例

平衡阶段使用强耦合快速达到目标温度:

>>> # 强耦合快速平衡
>>> scheme = create_langevin_nvt_scheme(300.0, friction=5.0)  # 强耦合
>>> for step in range(5000):  # 快速平衡
...     scheme.step(cell, potential, dt=1.0)

生产阶段使用弱耦合保持动力学真实性:

>>> # 弱耦合生产模拟
>>> scheme.set_friction(0.5)  # 切换到弱耦合
>>> for step in range(100000):  # 长时间生产
...     scheme.step(cell, potential, dt=1.0)
>>> stats = scheme.get_statistics()
>>> print(f"平均温度: {stats['thermostat_stats']['average_temperature']:.1f} K")
>>> print(f"能量平衡: {stats['thermostat_stats']['energy_balance']:.3f}")

备注

Langevin恒温器的优势:

  • 严格正则系综: 基于涨落-耗散定理,确保正确的统计力学采样

  • 数值稳定: 无Nose-Hoover的遍历性问题和长周期振荡

  • 物理清晰: 明确的摩擦和随机力物理模型

  • 参数灵活: 可动态调节耦合强度,适应不同模拟阶段

  • 广泛适用: 特别适合生物分子和隐式溶剂系统

与其他恒温器的比较:

  • vs Berendsen: 产生正确涨落,不只是平均温度控制

  • vs Andersen: 连续随机修正,不是突然重置

  • vs Nose-Hoover: 随机而非确定性,避免长周期问题

参数选择建议:

  • 快速平衡: γ = 5-10 ps⁻¹,快速达到热平衡

  • 动力学研究: γ = 0.1-1 ps⁻¹,最小化对真实动力学的扰动

  • 构象采样: γ = 1-5 ps⁻¹,平衡采样效率和动力学保真度

  • 布朗动力学: γ > 10 ps⁻¹,主要由扩散控制

thermoelasticsim.md.schemes.create_nve_scheme()[源代码]

创建标准的NVE积分方案

返回:

配置好的NVE积分方案实例

返回类型:

NVEScheme

示例

>>> scheme = create_nve_scheme()
>>> for step in range(1000):
...     scheme.step(cell, potential, dt=0.5)
class thermoelasticsim.md.schemes.MTKNPTScheme(target_temperature, target_pressure, tdamp, pdamp, tchain=3, pchain=3, tloop=1, ploop=1)[源代码]

基类:IntegrationScheme

MTK-NPT (等温等压)积分方案

实现基于Nose-Hoover链恒温器和MTK恒压器的完整NPT系综, 支持同时控制温度和压力,允许体积和晶格形状变化。

理论基础: 基于Martyna-Tobias-Klein扩展系统方法,将Nose-Hoover链恒温器 与各向同性恒压器相结合,确保产生正确的NPT系综分布。

算法实现: 采用对称Trotter分解,将复杂的耦合运动方程分解为:

exp(iL*dt) ≈

exp(iL_baro*dt/2) · # 恒压器链传播 exp(iL_thermo*dt/2) · # 恒温器链传播 exp(iL_p_cell*dt/2) · # 晶格动量更新 exp(iL_p*dt/2) · # 粒子动量更新 exp(iL_q*dt) · # 粒子和晶格位置更新 exp(iL_p*dt/2) · # 粒子动量更新 exp(iL_p_cell*dt/2) · # 晶格动量更新 exp(iL_thermo*dt/2) · # 恒温器链传播 exp(iL_baro*dt/2) # 恒压器链传播

主要功能: 1. 温度控制: 保持系统平均动能对应目标温度 2. 压力控制: 调节体积使内部压力等于外压 3. 晶格变化: 支持各向同性体积和形状变化 4. 守恒量: 监控扩展哈密顿量的守恒性

适用场景: - 需要同时控制温度和压力的模拟 - 研究相变和密度变化 - 制备有限温平衡态结构 - 消除残余应力的系统弛豫

注意事项: - 比NVE和NVT积分需要更多计算时间 - 压力控制参数需要仔细调节 - 适中的时间步长确保数值稳定性

参数:
  • target_temperature (float) -- 目标温度 (K)

  • target_pressure (float) -- 目标压力 (GPa) - 自动转换为内部单位

  • tdamp (float) -- 温度阻尼时间 (fs),典型值50-100*dt

  • pdamp (float) -- 压力阻尼时间 (fs),典型值100-1000*dt

  • tchain (int, optional) -- 恒温器链长度,默认为3

  • pchain (int, optional) -- 恒压器链长度,默认为3

  • tloop (int, optional) -- 恒温器积分循环次数,默认为1

  • ploop (int, optional) -- 恒压器积分循环次数,默认为1

示例

>>> # 300K, 0.1GPa的NPT模拟
>>> scheme = MTKNPTScheme(
...     target_temperature=300.0,
...     target_pressure=0.1,  # GPa
...     tdamp=50.0,  # fs
...     pdamp=500.0  # fs
... )
>>>
>>> # 运行10ps的NPT弛豫
>>> dt = 1.0  # fs
>>> for step in range(10000):
...     scheme.step(cell, potential, dt)
...
...     if step % 1000 == 0:
...         stats = scheme.get_statistics()
...         print(f"T={stats['temperature']:.1f}K, "
...               f"P={stats['pressure']:.3f}GPa")

Methods

get_current_state(cell, potential)

获取当前瞬时状态

get_statistics()

获取系统统计信息

step(cell, potential, dt)

执行一个完整的MTK-NPT积分步

__init__(target_temperature, target_pressure, tdamp, pdamp, tchain=3, pchain=3, tloop=1, ploop=1)[源代码]
参数:
step(cell, potential, dt)[源代码]

执行一个完整的MTK-NPT积分步

采用对称Trotter分解确保时间可逆性和数值稳定性。

参数:
  • cell (Cell) -- 晶胞对象

  • potential (Potential) -- 势能对象

  • dt (float) -- 时间步长 (fs)

返回类型:

None

get_statistics()[源代码]

获取系统统计信息

返回类型:

dict

get_current_state(cell, potential)[源代码]

获取当前瞬时状态

参数:

cell (Cell)

返回类型:

dict

thermoelasticsim.md.schemes.create_mtk_npt_scheme(target_temperature, target_pressure, tdamp, pdamp, tchain=3, pchain=3)[源代码]

创建MTK-NPT积分方案

参数:
  • target_temperature (float) -- 目标温度 (K)

  • target_pressure (float) -- 目标压力 (GPa)

  • tdamp (float) -- 温度阻尼时间 (fs)

  • pdamp (float) -- 压力阻尼时间 (fs)

  • tchain (int, optional) -- 恒温器链长度,默认3

  • pchain (int, optional) -- 恒压器链长度,默认3

返回:

配置好的MTK-NPT积分方案

返回类型:

MTKNPTScheme

示例

>>> # 300K, 大气压的NPT系综
>>> scheme = create_mtk_npt_scheme(
...     target_temperature=300.0,
...     target_pressure=0.0001,  # ~大气压
...     tdamp=50.0,
...     pdamp=500.0
... )
>>>
>>> # 高压高温条件
>>> scheme_hp = create_mtk_npt_scheme(
...     target_temperature=1000.0,
...     target_pressure=10.0,  # 10 GPa
...     tdamp=100.0,
...     pdamp=1000.0
... )

恒温器

class thermoelasticsim.md.thermostats.Thermostat(target_temperature)[源代码]

基类:object

恒温器基类,定义恒温器的接口和通用属性

参数:

target_temperature (float) -- 目标温度,单位K

Methods

apply(atoms, dt)

应用恒温器,更新原子速度

get_kinetic_energy(atoms)

计算系统动能

get_temperature(atoms)

计算当前系统温度,扣除质心运动

record_state(atoms, time)

记录系统状态用于后续分析

remove_com_motion(atoms)

移除系统质心运动

__init__(target_temperature)[源代码]
参数:

target_temperature (float)

apply(atoms, dt)[源代码]

应用恒温器,更新原子速度

参数:
  • atoms (list) -- 原子列表

  • dt (float) -- 时间步长

返回类型:

None

get_kinetic_energy(atoms)[源代码]

计算系统动能

参数:

atoms (list) -- 原子列表

返回:

系统总动能

返回类型:

float

get_temperature(atoms)[源代码]

计算当前系统温度,扣除质心运动

参数:

atoms (list) -- 原子列表

返回:

当前温度,单位K

返回类型:

float

remove_com_motion(atoms)[源代码]

移除系统质心运动

参数:

atoms (list) -- 原子列表

返回类型:

None

record_state(atoms, time)[源代码]

记录系统状态用于后续分析

参数:
返回类型:

None

class thermoelasticsim.md.thermostats.BerendsenThermostat(target_temperature, tau)[源代码]

基类:Thermostat

Berendsen 恒温器

通过速度缩放实现温度控制,使系统快速达到目标温度。 该方法不产生严格的正则系综,但具有良好的数值稳定性。

参数:
  • target_temperature (float) -- 目标温度,单位为开尔文 (K)。

  • tau (float) -- 耦合时间常数,控制温度达到目标值的速率。 较小的 \tau 值表示更快的温度响应,但可能导致数值不稳定; 较大的 \tau 值则响应较慢,温度调整更加平缓。

Methods

apply(cell, dt, potential)

应用 Berendsen 恒温器以控制系统温度。

get_kinetic_energy(atoms)

计算系统动能

get_temperature(atoms)

计算当前系统温度,扣除质心运动

record_state(atoms, time)

记录系统状态用于后续分析

remove_com_motion(atoms)

移除系统质心运动

__init__(target_temperature, tau)[源代码]
参数:
apply(cell, dt, potential)[源代码]

应用 Berendsen 恒温器以控制系统温度。

该恒温器通过以下缩放因子 \lambda 来调整原子速度:

\[\begin{split}\\lambda = \\sqrt{1 + \\frac{\\Delta t}{\\tau} \\left(\\frac{T_{\\text{target}}}{T_{\\text{current}}} - 1\\right)}\end{split}\]

其中: - \Delta t 为时间步长 dt, - T_{\text{target}} 为目标温度 target_temperature, - T_{\text{current}} 为当前系统温度。

然后通过 \lambda 缩放原子速度,以达到近似的温度控制。

参数:
  • atoms (list) -- 原子对象的列表。

  • dt (float) -- 时间步长。

返回类型:

None

class thermoelasticsim.md.thermostats.AndersenThermostat(target_temperature, collision_frequency)[源代码]

基类:Thermostat

Andersen 恒温器

通过随机碰撞来控制温度,实现符合正则系综的采样。 该方法适合平衡态采样,但由于速度随机化,动力学轨迹会被打断。

参数:
  • target_temperature (float) -- 目标温度,单位为开尔文 (K)。

  • collision_frequency (float) -- 碰撞频率,单位为 \text{fs}^{-1}。 较高的碰撞频率会更频繁地随机分配速度,导致温度波动较大; 较低的碰撞频率则速度随机化较少,温度控制更稳定。

Methods

apply(cell, dt, potential)

应用 Andersen 恒温器以控制系统温度。

get_kinetic_energy(atoms)

计算系统动能

get_temperature(atoms)

计算当前系统温度,扣除质心运动

record_state(atoms, time)

记录系统状态用于后续分析

remove_com_motion(atoms)

移除系统质心运动

__init__(target_temperature, collision_frequency)[源代码]
参数:
  • target_temperature (float)

  • collision_frequency (float)

apply(cell, dt, potential)[源代码]

应用 Andersen 恒温器以控制系统温度。

在每个时间步,针对每个原子,发生碰撞的概率为 p

\[\begin{split}p = \\text{collision\\_frequency} \\times \\Delta t\end{split}\]

若发生碰撞,则根据目标温度 T_{\text{target}} 的 Maxwell-Boltzmann 分布重新分配原子的速度:

\[\begin{split}v_i = \\mathcal{N}(0, \\sigma)\end{split}\]

其中 \sigma 为速度分布的标准差,定义为:

\[\begin{split}\\sigma = \\sqrt{\\frac{k_B \\times T_{\\text{target}}}{m}}\end{split}\]

其中 k_B 为玻尔兹曼常数,m 为原子质量。

参数:
  • atoms (list) -- 原子对象的列表。

  • dt (float) -- 时间步长。

返回类型:

None

class thermoelasticsim.md.thermostats.NoseHooverThermostat(target_temperature, time_constant, Q=None)[源代码]

基类:Thermostat

Nose-Hoover 恒温器 (Python直接实现版本)

使用Velocity-Verlet + Nose-Hoover对称分解的方式: 1. 半步更新xi 2. 半步速度缩放 3. 半步力更新速度 4. 更新位置 5. 调用potential.calculate_forces(cell)以更新力 6. 半步力更新速度 7. 半步速度缩放 8. 半步更新xi

Methods

apply(cell, dt, potential)

应用 Nose-Hoover 恒温器 (Velocity-Verlet 对称分解实现)

get_kinetic_energy(atoms)

计算系统动能

get_temperature(atoms)

计算当前系统温度,扣除质心运动

record_state(atoms, time)

记录系统状态用于后续分析

remove_com_motion(atoms)

移除系统质心运动

参数:
__init__(target_temperature, time_constant, Q=None)[源代码]
参数:
apply(cell, dt, potential)[源代码]

应用 Nose-Hoover 恒温器 (Velocity-Verlet 对称分解实现)

参数:
  • cell (Cell) -- 包含原子信息的Cell对象,可以通过cell.atoms访问原子列表

  • dt (float) -- 时间步长

  • potential (Potential) -- 用于计算力场的对象,必须实现 potential.calculate_forces(cell)

返回类型:

None

class thermoelasticsim.md.thermostats.NoseHooverChainThermostat(target_temperature, time_constant, chain_length=3, Q=None)[源代码]

基类:Thermostat

Nose-Hoover 链恒温器

通过多个热浴形成链来改善遍历性,适合复杂系统。 采用C++后端实现核心积分步骤。

参数:
  • target_temperature (float) -- 目标温度,单位K

  • time_constant (float) -- 时间常数,控制热浴耦合强度。 较大的time_constant意味着热浴链的响应较慢,温度调整更加平缓。 较小的time_constant则响应较快,但可能导致温度波动。

  • chain_length (int, optional) -- 链的长度,默认为3。 链长度增加可以改善相空间的遍历性,但会增加计算复杂度。

  • Q (numpy.ndarray, optional) -- 热浴质量参数数组,长度应等于 chain_length。 如果未提供,将根据默认方式初始化。

Methods

apply(atoms, dt)

应用 Nose-Hoover 链恒温器

get_chain_state()

获取热浴链的当前状态

get_kinetic_energy(atoms)

计算系统动能

get_temperature(atoms)

计算当前系统温度,扣除质心运动

record_state(atoms, time)

记录系统状态用于后续分析

remove_com_motion(atoms)

移除系统质心运动

__init__(target_temperature, time_constant, chain_length=3, Q=None)[源代码]
参数:
apply(atoms, dt)[源代码]

应用 Nose-Hoover 链恒温器

参数:
  • atoms (list) -- 原子列表

  • dt (float) -- 时间步长

返回类型:

None

get_chain_state()[源代码]

获取热浴链的当前状态

返回类型:

dict

恒压器

class thermoelasticsim.md.barostats.Barostat(target_pressure)[源代码]

基类:object

恒压器基类,定义恒压器的接口

Methods

apply(cell, potential, dt)

应用恒压器,更新晶胞参数

calculate_internal_pressure(stress_tensor)

根据应力张量计算内部压力

record_state(pressure, volume, stress_tensor)

记录系统状态

参数:

target_pressure (ndarray)

__init__(target_pressure)[源代码]
参数:

target_pressure (ndarray)

apply(cell, potential, dt)[源代码]

应用恒压器,更新晶胞参数

参数:
  • cell (Cell) -- 包含原子的晶胞对象

  • potential (Potential) -- 势能对象,用于计算应力

  • dt (float) -- 时间步长

calculate_internal_pressure(stress_tensor)[源代码]

根据应力张量计算内部压力

参数:

stress_tensor (np.ndarray) -- 应力张量 (9,)

返回:

内部压力

返回类型:

float

record_state(pressure, volume, stress_tensor)[源代码]

记录系统状态

参数:
class thermoelasticsim.md.barostats.ParrinelloRahmanHooverBarostat(target_pressure, time_constant, compressibility=4.57e-05, W=None, Q=None, stress_calculator=None)[源代码]

基类:Barostat

Parrinello-Rahman-Hoover 恒压器实现

参数:
  • target_pressure (np.ndarray) -- 目标压力张量 (3x3)

  • time_constant (float) -- 压力耦合时间常数,控制恒压器对压力波动的响应速度。较小的时间常数会使系统更快地达到目标压力,但可能导致数值不稳定。

  • compressibility (float, optional) -- 等温压缩系数,表示材料在恒温下的压缩程度。默认值为4.57e-5。较大的压缩系数会使系统更容易压缩。

  • W (float, optional) -- 晶胞质量参数,用于控制晶胞的动力学行为。默认为自动计算。调整此参数可以改变晶胞响应外界压力变化的惯性。

  • Q (np.ndarray, optional) -- 热浴质量参数数组 (9,),默认为 ones(9) * (time_constant^2)。调整此参数可以改变恒压器对不同方向应力的响应。

  • stress_calculator (StressCalculator) -- 应力张量计算器实例

Methods

apply(cell, potential, dt)

应用 Parrinello-Rahman-Hoover 恒压器,更新晶胞参数和原子速度

calculate_internal_pressure(stress_tensor)

根据应力张量计算内部压力

record_state(pressure, volume, stress_tensor)

记录系统状态

__init__(target_pressure, time_constant, compressibility=4.57e-05, W=None, Q=None, stress_calculator=None)[源代码]
参数:
apply(cell, potential, dt)[源代码]

应用 Parrinello-Rahman-Hoover 恒压器,更新晶胞参数和原子速度

参数:
  • cell (Cell) -- 包含原子的晶胞对象

  • potential (Potential) -- 势能对象,用于计算应力

  • dt (float) -- 时间步长

calculate_internal_pressure(stress_tensor)[源代码]

根据应力张量计算内部压力

参数:

stress_tensor (np.ndarray) -- 应力张量 (9,)

返回:

内部压力

返回类型:

float

class thermoelasticsim.md.barostats.BerendsenBarostat(target_pressure, tau_p, compressibility=4.57e-05)[源代码]

基类:Barostat

Berendsen 恒压器实现

参数:
  • target_pressure (float) -- 目标压力 (不是GPa) 调整方法:设置为所需的系统压力。例如,1.0 表示 1 ev... 的目标压力。

  • tau_p (float) -- 压力耦合时间常数 调整方法:控制恒压器对压力变化的响应速度。较小的时间常数使系统更快达到目标压力,但可能导致数值不稳定。典型值在 0.1 到 1.0 ps 之间。

  • compressibility (float) -- 等温压缩系数 调整方法:表示材料在恒温下的压缩程度。较大的压缩系数会使系统更容易压缩。默认值为 4.57e-5,可以根据材料特性进行调整。

Methods

apply(cell, dt, potential)

应用 Berendsen 恒压器

calculate_internal_pressure(stress_tensor)

根据应力张量计算内部压力

record_state(pressure, volume, stress_tensor)

记录系统状态

__init__(target_pressure, tau_p, compressibility=4.57e-05)[源代码]
参数:
apply(cell, dt, potential)[源代码]

应用 Berendsen 恒压器

参数:

dt (float)

class thermoelasticsim.md.barostats.AndersenBarostat(target_pressure, mass, temperature)[源代码]

基类:Barostat

Andersen 恒压器实现

参数:
  • target_pressure (float) -- 目标压力 (不是GPa) 调整方法:设置为所需的系统压力。例如,0.0 表示在无外部压力下模拟。

  • mass (float) -- 活塞质量参数 调整方法:控制体积变化的惯性。较大的质量参数会使体积变化更加缓慢和稳定,但响应速度较慢。

  • temperature (float) -- 系统温度 (K) 调整方法:设定系统的温度,以便与恒温恒压模拟结合使用。

Methods

apply(cell, dt, potential)

应用 Andersen 恒压器

calculate_internal_pressure(stress_tensor)

根据应力张量计算内部压力

record_state(pressure, volume, stress_tensor)

记录系统状态

__init__(target_pressure, mass, temperature)[源代码]
参数:
apply(cell, dt, potential)[源代码]

应用 Andersen 恒压器

参数:

dt (float)

MD模拟器

class thermoelasticsim.md.md_simulator.MDSimulator(cell, potential, integrator, ensemble='NVE', thermostat=None, barostat=None)[源代码]

基类:object

分子动力学模拟器,支持NVE、NVT和NPT系综

参数:
  • cell (Cell) -- 包含原子的晶胞对象

  • potential (Potential) -- 势能对象

  • integrator (Integrator) -- 积分器对象

  • ensemble (str) -- 系综类型: 'NVE', 'NVT', 或 'NPT'

  • thermostat (Optional[Dict] or Thermostat) -- 恒温器配置或对象

  • barostat (Optional[Barostat]) -- 恒压器对象

Methods

calculate_total_energy()

计算系统总能量

plot_pressure()

绘制压力演化图

plot_temperature()

绘制温度演化图

run(steps, dt)

运行分子动力学模拟

run_npt(steps, dt)

运行NPT系综模拟

run_nve(steps, dt)

运行NVE系综模拟

run_nvt(steps, dt)

运行NVT系综模拟

__init__(cell, potential, integrator, ensemble='NVE', thermostat=None, barostat=None)[源代码]
run_nve(steps, dt)[源代码]

运行NVE系综模拟

run_nvt(steps, dt)[源代码]

运行NVT系综模拟

run_npt(steps, dt)[源代码]

运行NPT系综模拟

run(steps, dt)[源代码]

运行分子动力学模拟

参数:
  • steps (int) -- 模拟步数

  • dt (float) -- 时间步长

calculate_total_energy()[源代码]

计算系统总能量

返回类型:

float

plot_temperature()[源代码]

绘制温度演化图

plot_pressure()[源代码]

绘制压力演化图