MemoryElectronicFriction.jl computes the frequency-dependent (memory) electronic friction kernel
A molecule on a metal loses energy to electron–hole pairs, which drag on the nuclei and kick back at them.
This generalised Langevin equation keeps only the nuclei
The memory kernel
This package computes
| Component | Description |
|---|---|
Adsorbate models (AndersonImpurityModels) |
Type hierarchy (1-DOF / N-DOF × wide-band / frequency-dependent hybridisation) with five ready-made models: BrandbygeAdsorbate, ErpenbeckThossAdsorbate, HGeAdsorbate, the 2-D NOAuAdsorbate, and the NQCModels-compatible POGOModel
|
Memory friction (AndersonImpurityFrictions.FrequencyLambda) |
LambdaAveraged) for two-coordinate models |
Markovian limit (AndersonImpurityFrictions.MarkovianLambda) |
widebandfriction for the instantaneous-friction baseline ( |
| I/O helpers | HDF5 + DrWatson conventions for simulation data (dict_to_data_savename, …) |
A complete feature inventory with file references lives in FEATURES.md.
Prerequisites: Julia ≥ 1.11 (download). This is a DrWatson research project rather than a registered package.
Setup:
julia> using Pkg
julia> Pkg.add("DrWatson") # once, globally — enables @quickactivate
julia> Pkg.activate("path/to/MemoryElectronicFriction.jl")
julia> Pkg.instantiate()Raw simulation data are typically not tracked in git and may need to be
regenerated with the scripts under scripts/compute/.
Most scripts begin with
using DrWatson
@quickactivate "MemoryElectronicFriction"which activates the project and makes DrWatson's local-path helpers
(datadir(), plotsdir(), …) work from anywhere in the repository.
using MemoryElectronicFriction
using Unitful, UnitfulAtomic
# Wide-band 1-DOF adsorbate (Erpenbeck–Thoss model)
m = ErpenbeckThossAdsorbate(Γ = austrip(1.0u"eV"))
# Memory friction kernel at ħω = 0.1 eV, bond length 2 Å, T = 300 K
# Memory friction kernel at ħω = 0.1 eV, bond length 2 Å, T = 300 K
Kω = FrequencyLambda.Lambda(austrip(0.1u"eV"), m, austrip(2.0u"Å"), austrip(300u"K"))
# Markovian (ω → 0) baseline
K0 = MarkovianLambda.widebandfriction(m, austrip(2.0u"Å"), austrip(300u"K"))FrequencyLambda.Lambda evaluates quadratures over matrix products; sweeping an
array of
julia -t auto your_script_calling_Kernel.jl| Path | Contents |
|---|---|
src/ |
Package modules: DistributionTools, Baths, AndersonImpurityModels, AndersonImpurityFrictions, IO |
scripts/compute/ |
Production simulations (friction kernels, CPA, MD) |
scripts/plot/ |
Publication-quality figures |
test/ |
Unit tests (Pkg.test()) |
dev/ |
Exploratory and development scripts |
docs/ |
Technical derivations and supporting material |
A reduced model for vibrationally inelastic scattering of NO from Au(111): a
two-state (neutral / charge-transfer) Newns–Anderson Hamiltonian whose ground
adiabatic surface depends on two coordinates — the N–O bond length r and the
molecule–surface distance z — propagated with Born–Oppenheimer MD.
Implementation: POGOModel
(NQCModels interface); BO-MD driver in run_md.jl;
adapted from NQCD/SurfaceScatteringMQC.
Initial NO vibration (EBK). The incoming NO is prepared in vibrational state
ν by Einstein–Brillouin–Keller (EBK) quantisation of the 1-D bond, then
phase-space sampled. The animation walks through the logic for ν = 16:
- Quantise — freeze the molecule far from the surface (
z = 10 Å) to obtain the 1-D bond binding curveV(r), and raise the energy until the EBK action∮ p dr = 2π(ν+½)ℏequals the integerν. This fixes the bond energyEν. - Sample — at fixed
Eνthe bond behaves as a 1-D oscillator; draw(r, ṙ)snapshots uniformly in time along the orbit (½μṙ² = Eν − V(r)). Classically, positions accumulate at the turning points, while kinetic energy spans0 → Eν − V_\text{min}.
Figure. EBK preparation of the NO(ν = 16) initial state.
Left: the 1-D bond binding curve and its quantised levels — the energy is raised
until the EBK action equals the integer ν, fixing Eν.
Centre: the classical orbit at Eν in phase space (r, ṙ) with sampled snapshots.
Right: the resulting distributions of bond length (top) and vibrational kinetic energy (bottom).
The final vibrational state of the scattered trajectories is read off the same
binding curve — see run_vib_state_noau.jl.
Reproduce the animation with animate_ebk_sampling.jl.
This package implements the theory of:
X. Lu, C. L. Box, N. Hertl, and R. J. Maurer, "Memory-dependent electronic friction for nonadiabatic dynamics at metal surfaces", arXiv:2608.12572 [cond-mat.mtrl-sci] (2026).
If you use MemoryElectronicFriction.jl in published work, please cite that paper
alongside this repository:
@article{Lu2026MemoryElectronicFriction,
author = {Lu, Xuexun and Box, Connor L. and Hertl, Nils and Maurer, Reinhard J.},
title = {Memory-dependent electronic friction for nonadiabatic dynamics at metal surfaces},
year = {2026},
month = aug,
eprint = {2608.12572},
archivePrefix = {arXiv},
primaryClass = {cond-mat.mtrl-sci},
doi = {10.48550/arXiv.2608.12572},
url = {https://arxiv.org/abs/2608.12572}
}
@software{MemoryElectronicFriction_jl,
author = {Lu, Xuexun},
title = {{MemoryElectronicFriction.jl}: Memory-dependent electronic friction from Anderson impurity models},
year = {2026},
url = {https://github.com/Louhokseson/MemoryElectronicFriction.jl}
}This project is licensed under the MIT License. See the full text for details.
Xuexun Lu (Hokseon)
PhD Candidate, The Maurer Computational Surface Science Group
The University of Warwick, UK