Much of science can be explained by the movement and interaction of molecules. Molecular dynamics (MD) is a computational technique used to explore these phenomena, from noble gases to biological macromolecules. Molly.jl is a pure Julia package for MD, and for the simulation of physical systems more broadly.
At the minute the package is a proof of concept for MD in Julia. It is not production ready, though it can do some cool things and is under active development. Implemented features include:
- Non-bonded interactions - Lennard-Jones Van der Waals/repulsion force, electrostatic Coulomb potential and reaction field, gravitational potential, soft sphere potential, Mie potential.
- Bonded interactions - covalent bonds, bond angles, torsion angles.
- Interface to allow definition of new interactions, simulators, thermostats, neighbor finders, loggers etc.
- Read in OpenMM force field files and coordinate files supported by Chemfiles.jl. There is also some support for Gromacs files.
- Andersen, Berendsen and velocity rescaling thermostats.
- Velocity Verlet and Störmer-Verlet integration.
- Periodic boundary conditions in a cubic box.
- Various neighbor list implementations to speed up calculation of non-bonded forces.
- Unitful.jl compatibility so numbers have physical meaning.
- Automatic multithreading.
- GPU acceleration on CUDA-enabled devices.
- Run with Float64 or Float32.
- Some analysis functions, e.g. RDF.
- Visualise simulations as animations.
- Physical agent-based modelling.
- Differentiable molecular simulation. This is a unique feature of the package and the focus of its current development.
Features not yet implemented include:
- Simulators such as energy minimisation, Langevin dynamics and REMD.
- Other temperature or pressure coupling methods.
- Protein preparation - solvent box, add hydrogens etc.
- Quantum mechanical modelling.
- High test coverage.
- API stability.
Julia is required, with Julia v1.7 or later required to get the latest version of Molly.
Install Molly from the Julia REPL.
Enter the package mode by pressing ]
and run add Molly
.
Some examples are given here, see the documentation for more on how to use the package.
Simulation of a Lennard-Jones fluid:
using Molly
n_atoms = 100
box_size = SVector(2.0, 2.0, 2.0)u"nm"
temp = 298.0u"K"
atom_mass = 10.0u"u"
atoms = [Atom(mass=atom_mass, σ=0.3u"nm", ϵ=0.2u"kJ * mol^-1") for i in 1:n_atoms]
coords = place_atoms(n_atoms, box_size, 0.3u"nm")
velocities = [velocity(atom_mass, temp) for i in 1:n_atoms]
general_inters = (LennardJones(),)
simulator = VelocityVerlet(dt=0.002u"ps", coupling=AndersenThermostat(temp, 1.0u"ps"))
sys = System(
atoms=atoms,
general_inters=general_inters,
coords=coords,
velocities=velocities,
box_size=box_size,
loggers=Dict("temp" => TemperatureLogger(100)),
)
simulate!(sys, simulator, 10_000)
Simulation of a protein:
using Molly
sys = System(
joinpath(dirname(pathof(Molly)), "..", "data", "5XER", "gmx_coords.gro"),
joinpath(dirname(pathof(Molly)), "..", "data", "5XER", "gmx_top_ff.top");
loggers=Dict(
"temp" => TemperatureLogger(10),
"writer" => StructureWriter(10, "traj_5XER_1ps.pdb"),
),
)
temp = 298.0u"K"
random_velocities!(sys, temp)
simulator = VelocityVerlet(dt=0.0002u"ps", coupling=AndersenThermostat(temp, 1.0u"ps"))
simulate!(sys, simulator, 5_000)
The above 1 ps simulation looks something like this when you view it in VMD:
Contributions are very welcome - see the roadmap issue for more.