A Julia-based implementation of the Strong-Field Approximation (SFA) for simulating energy-resolved angular streaking in tunneling ionization. This code models electron trajectories in intense, elliptically-polarized laser fields to study the attoclock technique in strong-field physics.
The attoclock uses elliptical laser polarization to encode tunneling time into the angular distribution of ionized electrons. This project implements:
- Quantum orbit generation via saddle-point method
- Classical trajectory propagation through laser + Coulomb fields
- Momentum distribution analysis with Coulomb corrections
The code solves the fundamental question: How does elliptical laser polarization encode tunneling time into the angular distribution of ionized electrons?
- Strong-Field Approximation (SFA): Saddle-point method to find complex tunneling times and initial conditions
- Tunneling ionization: Electrons tunnel through the barrier created by laser + Coulomb potential
- Quantum orbits: Multiple electron trajectories contribute to ionization
- Energy-resolved streaking: Tracks final electron energy and momentum distributions
- Attoclock technique: Uses rotating electric field as ultrafast "clock" to measure tunneling dynamics
Non-adiabatic-Attoclock/
├── config.toml # Simulation parameters
├── InitialConditionGenerator.jl # Core SFA initial condition generator
├── SimulationDistributed.jl # Distributed trajectory simulation
├── test_initial_conditions.jl # Validation script
├── initial_cond.ipynb # Analysis notebook
├── analysis/
│ └── analyze_results.jl # Post-processing & momentum distribution
└── doc/
└── TunnelingtimeANDlongitudinalmomentum.md # Mathematical derivations
Core SFA engine that generates initial conditions for electron trajectories.
Inputs: p_perp, p_z (transverse/longitudinal momenta), t_r (real tunneling time)
Outputs: r0, v0 (initial position/velocity), t_i (imaginary tunneling time), p_lab (lab-frame momentum), S_sub (sub-barrier action)
Algorithm:
- Solves saddle-point equations for complex tunneling time
- Computes initial position via Gaussian quadrature
- Calculates sub-barrier action
- Filters trajectories by action threshold
Runs 1 billion classical electron trajectories in parallel across 10 workers.
Workflow:
- Generates random initial conditions uniformly
- Calls
InitialConditionGeneratorfor quantum initial state - Integrates equations of motion using Tsit5 ODE solver
- Tracks action during propagation
- Filters for ionized electrons
- Outputs trajectory data
Equations of motion:
dr/dt = v
dv/dt = -∇V_Coulomb - E_field
dS/dt = -L (Lagrangian)
Post-processes trajectory data to compute final momentum distributions.
Features:
- Applies Coulomb phase corrections
- Transforms to asymptotic momentum using Runge-Lenz vector
- Bins into 3D momentum grid
- Accumulates complex amplitude:
dist[p] += exp(i·phase) - Outputs 2D momentum distribution
Edit config.toml to set simulation parameters (atomic units):
[laser]
omega = 0.058 # Angular frequency
E_peak = 0.03779 # Peak electric field
ellipticity = 0.66 # χ parameter
cep = 0.0 # Carrier-envelope phase
[pulse]
n_cycles_total = 16 # Total pulse duration
n_cycles_constant = 10 # Flat-top duration
[atom]
ionization_potential = 0.5147 # I_p (hydrogen-like)
Z_eff = 1.0 # Effective nuclear charge
[initial_conditions]
p_max = 2.0 # Momentum sampling range
action_threshold = 22.98 # Filters exp(-2·Im(S)) > 10⁻¹⁰julia test_initial_conditions.jlGenerates 100,000 test trajectories and outputs to test_initial_conditions.txt.
julia SimulationDistributed.jlRuns distributed simulation with 1 billion trajectories. Outputs worker files: sfa_phase_worker_*.txt.
julia analysis/analyze_results.jlProcesses worker outputs and generates momentum_dist_2d.npy (2D momentum distribution).
Open initial_cond.ipynb in Jupyter to analyze and visualize results.
See doc/TunnelingtimeANDlongitudinalmomentum.md for detailed derivations:
- Part I: Factorization of complex saddle-point equation
- Part II: Justification of envelope approximation
- Part III: Transformation to electric field frame
- Part IV: Compact notation
- Part V: Analytical solution algorithm
- Part VI: Back-transformation to lab frame
Key saddle-point equations:
Parallel momentum:
p_∥ = (A₀f(1-χ²)sin(2α)cosh(β)) / (2Γ)
Energy conservation (determines cosh(β)):
½(p_⊥ + χA₀f·cosh(β)/Γ)² + p_z²/2 + I_p = ½A₀²f²Γ²sinh²(β)
where α = ωt_r + φ_cep, β = ωt_i, Γ = √(cos²α + χ²sin²α).
- Julia 1.x
- DifferentialEquations.jl (ODE solver)
- Distributed.jl (parallel computing)
- FastGaussQuadrature.jl (numerical integration)
- TOML.jl (configuration)
- NPZ.jl (output format)
tr p_perp p_z r0_x r0_y r0_z v0_x v0_y v0_z rf_x rf_y rf_z vf_x vf_y vf_z S_sub_real S_sub_imag S_dyn
momentum_dist_2d.npy: Complex 2D array (p_x, p_y) integrated over p_z- Grid: 1001×1001 points, range ±1.5 a.u.
This implementation is based on the Strong-Field Approximation and saddle-point method for tunneling ionization. For theoretical background, see:
- Quantum theory of tunneling ionization in strong fields
- Attoclock technique for measuring tunneling time
- SFA with Coulomb corrections
MIT License — see LICENSE for details.
Tao Jianfei (jakiesumrain@163.com)