Solvents

For methods that simulate the solvent exactly using classical trajectories, we have a generic infrastructure developed that can be automatically leveraged.

API

A generic solvent is encoded in the Solvents submodule:

The Solvents submodule defines a general Solvent type and an associated PhaseSpace type.

QuantumDynamics.Solvents.SolventType

Abstract type for every solvent. Every solvent needs to implement Base.iterate, which returns the next sample of the phase-space, and a propagate_trajectory method which propagates a given phasespace point using classical mechanics.

source

Every solvent allows a phase-space point to be propagated under the internal forces that are present within the solvent and some external force (presumably coming from the system state) using

QuantumDynamics.Solvents.propagate_forced_bathFunction
propagate_forced_bath(bath::HarmonicBath, bps::HarmonicPhaseSpace,
                      f::Vector{Vector{Float64}}, dt::Real, ntimes::Integer)

Propagate the bath subject to constant force f from the system.

This assumes the Hamiltonian of the oscillator is of the form $H = \frac{p^2}{2} + \frac{\omega^2 q^2}{2} - f q.$

source
propagate_forced_bath(bath::Solvent, state::PhaseSpace,
                      f::Vector{Vector{Float64}}, dt::Real,
                      ntimes::Integer)

Propagate bath subject to constant force f from the system.

The Hamiltonian for a single bath is assumed to be of the form $H = \sum_i \frac{p_i^2}{2} + V(\{q_i\}) - f_i q_i$ where V(\{q_i\}) is the state-independent potential of the bath.

The time step of the propagation is given by dt, and the number of Verlet steps by ntimes.

source

The internal forces of the solvent itself can be calculated using