Theory and Methodology of PlasMol
PlasMol is a hybrid simulation tool designed to model plasmon-molecule interactions by coupling classical Finite-Difference Time-Domain (FDTD) electromagnetics with quantum Real-Time Time-Dependent Density Functional Theory (RT-TDDFT). This document outlines the theoretical foundations and methodological workflow of PlasMol, drawing from its codebase and the provided schematic. The schematic illustrates the integration between quantum mechanical (QM) software, a handler for coupling, and classical FDTD (e.g., MEEP for electromagnetic propagation).
Introduction
PlasMol enables three simulation modes:
- Classical Only: FDTD simulation of nanoparticles (NPs) using MEEP.
- Quantum Only: RT-TDDFT simulation of molecules.
- Full PlasMol: Coupled FDTD-RT-TDDFT for NP-molecule systems.
The core innovation lies in the bidirectional coupling: the electric field from the classical simulation drives quantum propagation, while the induced molecular dipole feeds back into the classical field as a point source. This allows modeling phenomena like plasmon-enhanced spectroscopy or Surface-Enhanced Raman Scattering (SERS).
The schematic highlights:
- QM side: Time-dependent Fock matrix and integrals.
- Handler: Density matrix propagation and dipole calculation.
- MEEP side: Maxwell's equations with polarization source.
Classical Component: FDTD with MEEP
The classical part simulates electromagnetic fields around NPs using MEEP's FDTD solver. Key equations from the schematic (right side) describe field propagation:
Here, \(\tilde{\mathbf{E}}\) and \(\tilde{\mathbf{H}}\) are the electric and magnetic fields, \(\epsilon\) and \(\mu\) are permittivity and permeability, and \(\tilde{\mathbf{P}}(t)\) is the polarization (from quantum feedback in the full PlasMol mode).
Supported Features
- Sources: Continuous, Gaussian, chirped, or pulsed waves (see
src/classical/sources.py). - Geometry: Spheres (Au/Ag materials); extensible to other shapes.
- Boundaries: Perfectly Matched Layers (PML).
- Outputs: HDF5 images, GIFs, field CSVs; custom tracking (e.g., extinction spectra) via injections in
src/classical/simulation.py.
In the full PlasMol mode, the induced dipole \(\tilde{\mathbf{P}}(t)\) is injected as a custom source at the molecule's position.
Quantum Component: RT-TDDFT with PySCF
The quantum part computes molecular responses using RT-TDDFT in PySCF. The time-dependent Fock matrix (from the schematic, left side) is:
Where:
- \(T_{\mu\nu}\): Kinetic energy integral:
- \(V_{\mu\nu}\): Nuclear attraction integral:
- \(J_{\mu\nu}(t)\): Coulomb integral (time-dependent via density):
- \(K_{\mu\nu}(t)\): Exchange integral (similarly time-dependent):
The external field term \(-\sum \mu_a \tilde{E}_a(t)\) couples to the classical field.
Density Matrix Evolution
The density matrix \(\mathbf{D}(t)\) evolves under the Liouville-von Neumann equation (schematic, handler):
In practice, PlasMol propagates molecular orbitals \(\mathbf{C}(t)\) in an orthogonal basis and reconstructs \(\mathbf{D}(t)\).
Supported Propagators
PlasMol offers three methods (see Propagators for more details):
- Step (Modified Midpoint Unitary Transformation - MMUT):
- Runge-Kutta 4 (RK4):
With intermediate \(k_i\) terms computed via Fock matrix multiplications.
- 2nd-Order Magnus with Predictor-Corrector (Recommended):
Initial extrapolation:
Iterative update until convergence:
From the schematic (handler, propagation method):
This induced polarization \(\tilde{\mathbf{P}}(t)\) is fed back to MEEP.
Absorption Spectra
With the transform flag, PlasMol runs three directional simulations and applies a Fourier transform (see src/utils/fourier.py).
Coupling Mechanism: Handler
The "Handler" bridges QM and classical parts (schematic, center):
- QM to Classical: Induced dipole from RT-TDDFT is injected as a point source in MEEP.
- Classical to QM: Electric field at the molecule's position drives Fock matrix updates.
- Workflow (per time step in
src/classical/simulation.pyandsrc/quantum/propagation.py):- (Before simulation starts to loop) Generate ground state matrices using PySCF.
- Extract \(\tilde{\mathbf{E}}(t)\) from MEEP at molecule position.
- Propagate \(\mathbf{D}(t)\) using chosen method.
- Compute \(\tilde{\mathbf{P}}(t)\) via dipole contraction.
- Update MEEP source with \(\partial \tilde{\mathbf{P}} / \partial t\).
This loop enables self-consistent hybrid dynamics.
Methodology Workflow
- Input Parsing:
src/input/processes blocks for classical/quantum parameters. - Initialization:
- Classical: Build MEEP simulation (
src/classical/simulation.py). - Quantum: Build molecule and initial state (
src/quantum/molecule.py).
- Classical: Build MEEP simulation (
- Simulation Loop:
- Advance FDTD step in MEEP.
- If molecule present and field exceeds cutoff: Call RT-TDDFT propagation.
- Inject dipole back as source.
- Outputs: CSVs, plots, checkpoints via
src/utils/. - Extensions: Custom injections for tracking (e.g., SERS) in commented sections.
For code details, see API Reference.