A C++ implementation of Variational Monte Carlo (VMC) for simulating quantum many-body systems, specifically designed for atoms with up to six electrons. This project was developed as part of Computational Physics coursework in 2014/2015.
This code implements the Variational Monte Carlo method to study quantum mechanical systems using importance sampling and the Metropolis algorithm. The simulation focuses on calculating ground state energies and wave functions for multi-electron atoms in harmonic oscillator potentials.
- Variational Monte Carlo implementation with importance sampling
- Parallel computation using OpenMP for efficient Monte Carlo sampling
- Quantum many-body systems with up to 6 electrons
- Importance sampling using quantum forces for improved convergence
- Trial wave functions including Jastrow factors and Slater determinants
- Numerical differentiation for local energy calculations
- Harmonic oscillator potential with configurable frequency
The code solves the Schrödinger equation for N-electron systems using:
- Trial wave function: Ψ_T = Jastrow factor × Unperturbed wave function
- Jastrow factor: Accounts for electron-electron correlations
- Slater determinants: For antisymmetrization of fermionic wave functions
- Importance sampling: Uses quantum forces to guide Monte Carlo sampling
The code implements the Variational Monte Carlo method to solve the Schrödinger equation:
The system Hamiltonian for N electrons in a harmonic oscillator potential:
H = T + V = -½Σ∇²_i + ½ω²Σr_i² + Σ_{i<j} 1/|r_i - r_j|
The trial wave function combines a Jastrow correlation factor with Slater determinants:
Ψ_T(r₁, r₂, ..., r_N) = exp(Σ_{i<j} a_{ij}r_{ij}/(1 + βr_{ij})) × det[φ_k(r_i)]
Where:
r_{ij} = |r_i - r_j|is the electron-electron distancea_{ij} = 1/3for parallel spins,a_{ij} = 1for antiparallel spinsφ_k(r_i)are single-particle orbitals using Hermite polynomials
The single-particle wave functions use harmonic oscillator eigenstates:
φ_{n_x,n_y}(r) = exp(-½αωr²) × H_{n_x}(√(αω)x) × H_{n_y}(√(αω)y)
Where H_{n} are Hermite polynomials:
H₀(x) = 1H₁(x) = 2xH₂(x) = 4x² - 2
The local energy is calculated using numerical differentiation:
E_L(r) = HΨ_T(r)/Ψ_T(r) = [ -½Σ∇²Ψ_T/Ψ_T + V ]
α: Controls the width of the single-particle orbitalsβ: Controls the strength of electron-electron correlations in the Jastrow factorω: Harmonic oscillator frequency
- C++ compiler with C++11 support
- Armadillo linear algebra library
- BLAS and LAPACK libraries
- OpenMP for parallel computation
makeThis will compile the code and produce the main.out executable.
./main.outThe simulation will:
- Perform Monte Carlo sampling with 100,000 cycles
- Test variational parameters α and β
- Calculate ground state energies and wave functions
- Output results to
vmc.dat
- α (alpha): Variational parameter controlling wave function width
- β (beta): Variational parameter for Jastrow factor strength
- ω (omega): Harmonic oscillator frequency (default: 1.0)
- Number of particles: Configurable up to 6 electrons
- Dimensionality: 2D or 3D systems
The program generates vmc.dat containing:
- Variational parameters (α, β)
- Ground state energy estimates
- Kinetic and potential energy components
- Statistical variance and error estimates
src/main.cpp: Main program with Monte Carlo samplingsrc/manybody.h/cpp: Many-body wave function implementationssrc/singleparticle.h/cpp: Single particle wave functionssrc/Random.h/cpp: Random number generationsrc/lib.h/cpp: Utility functions
- Metropolis Algorithm: For Monte Carlo sampling
- Importance Sampling: Using quantum forces for efficient sampling
- Numerical Differentiation: For calculating local energies
- Slater Determinants: For fermionic antisymmetrization
- Jastrow Factors: For electron correlation effects
- Parallel computation with OpenMP
- Efficient matrix operations using Armadillo
- Optimized numerical algorithms for wave function evaluation