- Updates are made for AtomsBase.jl 0.4. AtomsBase is no longer re-exported.
- Compatibility bounds are updated for various packages.
- A bug in boundary gradient calculation is fixed.
- Observable functions for
GeneralObservableLogger
now need to accept arbitrary keyword arguments, for example by addingkwargs...
to the function call. This allows the logging changes described below.
- Support for Julia versions before 1.9 is dropped. A package extension, rather than Requires.jl, is used to provide
visualize
when GLMakie.jl is imported.
ASECalculator
is added, allowing Python ASE calculators to be used in Molly. The code is in a package extension available when PythonCall.jl is imported. It is the user's responsibility to have the required Python packages installed. Examples of using MACE and psi4 are given.current_forces
andcurrent_potential_energy
can be used in logging functions to reuse properties calculated in the simulation step. They default tonothing
when the properties are not available.- Interaction types are allowed to be different for each replica in a
ReplicaSystem
.
PotentialEnergyLogger
,TotalEnergyLogger
andForceLogger
avoid recomputation when the relevant properties are calculated in the simulation step.
MollyCalculator
now works in two dimensions and for other floating point types.
apply_constraints!
andSHAKE
are removed as part of the changes to constraints.- The
System
constructor for AtomsBase.jl systems is changed to takeforce_units
andenergy_units
as keyword arguments rather than positional arguments. The defaults are consistent with the rest of Molly. velocity_autocorr
is removed sinceAutoCorrelationLogger
provides a more general version of this functionality.
- Support for constraints is improved and documented with
SHAKE_RATTLE
allowing the SHAKE and RATTLE algorithms to be applied as appropriate to most simulators.DistanceConstraint
,disable_constrained_interactions!
,apply_position_constraints!
,apply_velocity_constraints!
,check_position_constraints
andcheck_velocity_constraints
are all added. Constraints are not currently compatible with GPU simulation. - Gradients with respect to the boundary can now be calculated in some contexts.
- A logo is added to the project.
- A bug in
FENEBond
potential energy calculation is fixed.
- General interactions are changed to use the AtomsCalculators.jl interface, allowing simulations to be run with calculators from other packages. A tuple of interactions compatible with the AtomsCalculators.jl interface should be given to
general_inters
when constructing aSystem
.ImplicitSolventOBC
,ImplicitSolventGBN2
andMullerBrown
are changed to be calculators. - The type parameters of
System
andReplicaSystem
are changed.
forces
,accelerations
,potential_energy
,total_energy
,virial
andpressure
now calculate the neighbors by default when called without neighbors. If they are being reused, neighbors should be pre-computed as before for performance.System
andReplicaSystem
now have adata
field, set with thedata
keyword argument to the constructors, that can be used to store arbitrary data. This data can be accessed inside simulators.LennardJonesSoftCore
,CoulombSoftCore
and custom atom types are now compatible with gradients.
- A bug that prevented system setup on Julia 1.7 is fixed.
- A type preservation bug in the
rdf
function is fixed.
- Compatibility with AtomsCalculators.jl is added via
MollyCalculator
. - The documentation on setting up systems from structure files is improved.
- A list of relevant publications is added to the documentation.
- The Contributor Covenant Code of Conduct is added to the project.
- A bug in the
NoseHoover
simulator when not using units is fixed.
- The
vector
function for calculating the displacement between coordinates accounting for periodic boundary conditions is made faster, improving simulation performance on CPU and GPU.
- Simulation of overdamped Langevin dynamics is added as
OverdampedLangevin
.
- The performance of force calculation without a neighbor list on the GPU is significantly improved.
- A bug in compatibility with SimpleCrystals.jl is fixed.
- Molar units are made more consistent throughout the package. If force and energy units are molar then the atomic masses should have a molar dimension, e.g.
u"g/mol"
rather thanu"u"
. The default Boltzmann constantk
is chosen based on theenergy_units
given to aSystem
.
- A constructor for
System
is added to convert from an AtomsBase.jlAbstractSystem
. - During
System
setup, checks are made for a consistent unit system and appropriate errors are thrown. - Calculation of the hydrodynamic radius is added as
hydrodynamic_radius
. - The
charges
function is added to give the partial charges of the atoms in a system.
- Issues with AtomsBase.jl integration are fixed.
run_loggers
is no longer available as a keyword argument toSteepestDescentMinimizer
andlog_states
is no longer available as a keyword argument when callingsimulate!
withMetropolisMonteCarlo
. Insteadrun_loggers
can be given as a keyword argument tosimulate!
as described below.
- The Monte Carlo anisotropic barostat is added as
MonteCarloAnisotropicBarostat
, allowing separate pressure coupling in each dimension. - The Monte Carlo membrane barostat is added as
MonteCarloMembraneBarostat
, allowing pressure coupling for systems involving a membrane. - A
System
constructor is added to create systems from a SimpleCrystals.jlCrystal
struct. - A convenience constructor is added for
System
allowing an existingSystem
to be copied with given properties changed. run_loggers
can be given as a keyword argument tosimulate!
to determine whether the loggers are run. The options aretrue
,false
or:skipzero
, in which case the loggers are not run before the first step.run_loggers
istrue
by default except forSteepestDescentMinimizer
, where it isfalse
.run_loggers!
now has a fourth argument which determines whether the loggers are run, defaulttrue
.- The scale factor given to
scale_coords!
can now be aSVector
corresponding to the scaling factor for each axis in addition to a single number. - General interactions can now implement a method for
virial
.
- A bug in force calculation with more than two interactions on the GPU is fixed.
- A bug allowing multiple 1-4 scaling values to be read from an OpenMM force field XML file is fixed.
apply_coupling!
now returns whether the coupling has invalidated the currently stored forces, for example by changing the coordinates.find_neighbors
now takes another optional argument which determines whether the neighbor list should be forced to recompute, regardless of the step number.- The type parameters of
System
,ReplicaSystem
,AtomType
andLangevin
are changed.
- The Monte Carlo barostat is added as
MonteCarloBarostat
, allowing pressure coupling during simulations. - The virial and pressure can be calculated for systems where only the pairwise interactions contribute to the virial using
virial
andpressure
. Corresponding loggers are added asVirialLogger
andPressureLogger
. - The
scale_boundary
,scale_coords!
andmolecule_centers
functions are added. - The
topology
keyword argument forSystem
can provide information about which atoms are in the same molecule, with this information stored as aMolecularTopology
when reading aSystem
from a file. The corresponding keyword argumentstopology
andreplica_topology
are added toReplicaSystem
. - Multiple couplers can be given to the
coupling
argument of compatible simulators as aTuple
or aNamedTuple
.Langevin
is now compatible with couplers. - Warnings are given for skipped incompatible fields when reading OpenMM XML force field files. Using atom charges from residue templates is no longer required.
- The
use_cell_list
keyword argument is added to theSystem
constructor from files. Unitful.ustrip
is now defined forCubicBoundary
andRectangularBoundary
.
The core of the package is rewritten to use CUDA.jl kernels on the GPU path for increased performance and GPU memory usage. Enzyme.jl is used along with Zygote.jl to differentiate through simulations on CPU and GPU for increased performance.
- The
nl_only
field of pairwise interactions is replaced with ause_neighbors
function, which accesses ause_neighbors
field of the struct for built-in interactions. Custom pairwise interactions can define a method for this function, which returnsfalse
by default. - The
weight_14
field of pairwise interactions has been renamed toweight_special
and theweight_14
argument toforce
has been renamed tospecial
. Thenb_matrix
andmatrix_14
fields of neighbor finders have been renamed toeligible
andspecial
respectively. OpenMMForceField
,OpenMMResidueType
andOpenMMAtomType
are renamed toMolecularForceField
,ResidueType
andAtomType
respectively.- The penultimate argument to
InteractionList1Atoms
etc., the interaction type names, is now an optional final argument that defaults to a vector of empty strings. The type parameters are also changed. velocity
is renamed torandom_velocity
andrand_coord
is renamed torandom_coord
.DistanceVecNeighborFinder
andNeighborListVec
are removed sinceDistanceNeighborFinder
andNeighborList
now work on the GPU and with automatic differentiation.- The
gpu_diff_safe
argument is no longer available when setting up aSystem
since the CPU path is now differentiable.is_gpu_diff_safe
is removed. - The type parameters of
System
,ReplicaSystem
,DistanceNeighborFinder
andNeighborList
are changed. - The
@fastmath
macro is no longer used in the package.
DistanceNeighborFinder
andTreeNeighborFinder
now return lists of neighboring pairs in ascending order of index.
- The Nosé-Hoover simulator is added as
NoseHoover
. potential_energy
andtotal_energy
are now compatible with automatic differentiation on CPU and GPU. They can also now be run in parallel using then_threads
keyword argument, with this being the default behaviour.CubicBoundary
andRectangularBoundary
can take a single value as an argument, indicating the same size in all dimensions. They must take positive side lengths.- The
remove_CM_motion
argument to simulators can be set to an integer, in which case the center of mass motion is removed every given number of steps. The default remains to remove the center of mass motion every step. - The
kappa
andrename_terminal_res
keyword arguments are available as arguments when constructing aSystem
from a file and a force field. - Differentiable simulation now works with any combination of built-in or custom interactions.
- Differentiable simulation now works with multithreading on the CPU.
- The number of GPU threads used for the CUDA.jl kernels can be tuned with the environmental variables
MOLLY_GPUNTHREADS_PAIRWISE
,MOLLY_GPUNTHREADS_SPECIFIC
,MOLLY_GPUNTHREADS_DISTANCENF
andMOLLY_GPUNTHREADS_IMPLICIT
. - A section on development is added to the documentation and other areas of the documentation are expanded.
- Force calculation, energy calculation, simulation and implicit solvent force/energy calculation are all made faster on CPU and GPU.
- GPU memory usage is reduced significantly, allowing the simulation of larger systems.
- Differentiable simulation is made faster on CPU and GPU.
- Bugs in boundary and system indexing are fixed.
- A bug in implicit solvent automatic differentiation is fixed.
- A bug allowing incorrect units to be used in general interactions is fixed.
- A bug introduced by a new version of ForwardDiff.jl is fixed.
- The Müller-Brown potential is added as
MullerBrown
.
- The Buckingham potential is added as
Buckingham
. - Polymer melt and density functional theory examples are added to the documentation.
- A bug introduced by a new version of AtomsBase.jl is fixed. In addition, atoms in systems without
atoms_data
defined now return:unknown
fromAtomsBase.atomic_symbol
. - A bug in the export of
OpenMMResidueType
is fixed.
- The type parameters and fields of
System
,ReplicaSystem
,ImplicitSolventOBC
andImplicitSolventGBN2
are changed. - The type parameters of
TemperatureREMD
are changed.
- The
mass
function falls back to accessing themass
field, making it easier to define custom atom types.
- A Monte Carlo simulator that uses the Metropolis algorithm is added as
MetropolisMonteCarlo
.MonteCarloLogger
is added to record acceptance information.random_uniform_translation!
andrandom_normal_translation!
are added to generate trial moves. HamiltonianREMD
is added to allow REMD with different interactions for each replica.remd_exchange!
andsimulate_remd!
are added to allow custom REMD simulators to be defined by giving the exchange function.replica_pairwise_inters
,replica_specific_inter_lists
andreplica_general_inters
can now be given when constructing aReplicaSystem
to allow different interactions for each replica.- Soft core versions of the Lennard-Jones and Coulomb interactions are added as
LennardJonesSoftCore
andCoulombSoftCore
. - Preliminary support for bonded constraints using the SHAKE algorithm is added via
SHAKE
andapply_constraints!
.constraints
can be used to define the constraints when constructing aSystem
, with corresponding arguments for aReplicaSystem
. This feature is still under development and is not fully documented yet. - Additional keyword arguments can now be used in
log_property!
, making the logging of properties in custom simulators easier. - A section on related software is added to the documentation.
- Implicit solvent force and energy calculation are made faster and more memory efficient.
- A bug when constructing the
Mie
potential with certain parameters is fixed.
- The minimum distance argument to
place_atoms
andplace_diatomics
is now the keyword argumentmin_dist
with a default value of no distance.place_diatomics
now places the molecules facing random directions, with the old behaviour available by settingaligned=true
.place_diatomics
now checks for sensible inputs and terminates after a certain number of failed attempts likeplace_atoms
. - The argument order in
apply_coupling!
is switched fromapply_coupling!(system, simulator, coupling)
toapply_coupling!(system, coupling, simulator)
. - The default mass of an
Atom
is changed from0.0u"u"
to1.0u"u"
. - The
AbstractNeighborFinder
abstract type is removed. - The
centre_coords
keyword argument when constructing aSystem
from files is renamed tocenter_coords
. - Center of mass motion is now removed before loggers are run at step zero of a simulation, matching the behaviour during the simulation steps.
visualize
shows the boundary as lines by default and has theshow_boundary
,boundary_linewidth
andboundary_color
keyword arguments added.
- Temperature replica exchange MD (REMD) can now be run in parallel. The
ReplicaSystem
struct is added to act as a container for multipleSystem
s. TheTemperatureREMD
simulator andReplicaExchangeLogger
are added to set up and run replica exchange simulations. TriclinicBoundary
is added and can be used to simulate periodic boundary conditions in a triclinic box. ATriclinicBoundary
can be constructed from either 3 basis vectors or 3 basis vector lengths and angles α/β/γ. Thebox_center
function is added.
- Coordinates are now moved back inside the boundary before the first step of the simulation.
- Updates are made to support the latest Zygote.jl and UnitfulChainRules.jl versions.
- A bug in implicit solvent gradient setup is fixed.
- The
parallel
keyword argument is renamed ton_threads
throughout, allowing an exact number of threads to be specified with the default remainingThreads.nthreads()
. - Arguments for bonded interactions are made more consistent:
HarmonicBond
haskb
renamed tok
andb0
tor0
,HarmonicAngle
hascth
renamed tok
andth0
toθ0
, andMorseBond
hasα
renamed toa
. - An additional type parameter is added to
System
that records whether it is on the GPU. Theis_on_gpu
function is added to access this property. - The
Interaction
abstract type is removed. - The
HarmonicPositionRestraint
interaction for restraining atomic positions, commonly used during equilibration of biomolecular systems, is added.InteractionList1Atoms
andSpecificForce1Atoms
are added to allow the definition of interactions that apply a force to one atom. Theadd_position_restraints
function is added to apply position restraints to aSystem
, along with the atom selector functionsis_any_atom
andis_heavy_atom
. - The
CosineAngle
interaction for the cosine bond angle between three atoms is added. - The
FENEBond
interaction for the finitely extensible non-linear elastic (FENE) bond between two atoms is added. - The
masses
function to access the mass of each atom in aSystem
is added. AndersenThermostat
is made differentiable.DistanceNeighborFinder
andTreeNeighborFinder
now use FLoops.jl and show improved performance on multiple threads.- Inconsistent
System
setup now throws an error. - Equations are added to some docstrings.
box_size
is renamed toboundary
throughout. Boundaries of the formSVector(1.0, 2.0, 3.0)
should be replaced byCubicBoundary(1.0, 2.0, 3.0)
, allowing non-cubic boundaries to be added in future. Setting one or more values toInf
gives no boundary in that dimension.RectangularBoundary
should be used for 2D simulations.float_type
,box_volume
andAtomsBase.n_dimensions
are defined for boundaries.- The recorded values in loggers are now accessed with
Base.values
. Loggers are now given to theSystem
as a named tuple rather than as aDict
for performance reasons. wrap_coords_vec
is renamed towrap_coords
,wrap_coords
is renamed towrap_coord_1D
,vector1D
is renamed tovector_1D
, thecutoff
argument to the implicit solvent models is renamed todist_cutoff
, and thenl_dist
argument toSystem
is renamed todist_neighbors
.- The general
LangevinSplitting
simulator is added to allow a variety of integrators to be defined such as velocity Verlet (splitting"BAB"
), the Langevin implementation inLangevin
("BAOA"
), and symplectic Euler integrators ("AB"
and"BA"
). GeneralObservableLogger
is added to periodically record a given observable throughout the simulation. Most existing loggers are changed to be cases ofGeneralObservableLogger
.AverageObservableLogger
is also added and records a running average rather than storing observations.TimeCorrelationLogger
is added to calculate correlations between observables.AutoCorrelationLogger
corresponds to the case when the two observables are the same.- The keyword argument
k
toSystem
,velocity
andmaxwell_boltzmann
allows a custom Boltzmann constant to be used. - More of the package is made differentiable due to the use of UnitfulChainRules.jl.
- Visualisation is updated to use GLMakie.jl v0.6.
place_atoms
now checks for sensible inputs and terminates after a certain number of failed attempts.- A bug in precompilation is fixed.
ForceLogger
is added.- The
parallel
keyword argument is now available in thelog_property!
function. - More examples are added to the documentation.
- A bug in the
Mie
potential energy is fixed.
- A bug in the
Gravity
force and potential energy is fixed.
- Loggers now also run before the first simulation step, i.e. at step 0, allowing the starting state to be recorded.
inject_gradients
now returns general interactions in addition to atoms, pairwise interactions and specific interaction lists.- Steepest descent energy minimization is added via
SteepestDescentMinimizer
. - GPU support is added for
potential_energy
. - The
radius_gyration
function is added. - A kappa value for ionic screening may be given to
ImplicitSolventOBC
andImplicitSolventGBN2
. - Improvements are made to simulation setup such as allowing multiple macromolecular chains.
- A random number generator can now be passed to
Langevin
, allowing reproducible simulations. - Gradients through the GB-Neck2 interaction are made to work on the GPU.
- Bugs in
StormerVerlet
are fixed. - The possibility of a NaN value for the
HarmonicAngle
force when the angle is π is fixed. - A bug causing
random_velocities
to run slowly is fixed.
- The arguments to
forces
andaccelerations
are made consistent across implementations. - Centre of mass motion is removed by default during simulation using
remove_CM_motion!
. - Coordinates are centred in the simulation box by default during setup.
- The
Langevin
integrator andVerlet
integrator are added. - The
MorseBond
potential is added. - The GB-Neck2 implicit solvent model is added via
ImplicitSolventGBN2
. - The
CubicSplineCutoff
is added. - The
rmsd
function is added. - The AtomsBase.jl interface is made more complete.
- The progress bar is removed from simulations.
- The out-of-place neighbor list type
NeighborListVec
is changed.
- General interactions are renamed to pairwise interactions throughout to better reflect their nature. The abstract type is now
PairwiseInteraction
and the keyword argument toSystem
is nowpairwise_inters
. General interaction now refers to a new type of interaction that takes in the whole system and returns forces for all atoms, allowing interactions such as neural network potentials acting on the whole system. This is available via the keyword argumentgeneral_inters
toSystem
. - Implicit solvent models are added via the
ImplicitSolventOBC
general interaction type and theimplicit_solvent
keyword argument when setting up aSystem
from a file. The Onufriev-Bashford-Case GBSA model with parameter sets I and II is provided. charge
is added to access the partial charge of anAtom
.- The
box_size
keyword argument may be given when setting up aSystem
from a file. - A bug in
KineticEnergyLogger
is fixed.
- The
force
andpotential_energy
functions for general interactions now take the vector between atom i and atom j as an argument in order to save on computation. - Differentiable simulations are made faster and more memory-efficient.
- The AtomsBase.jl interface is updated to v0.2 of AtomsBase.jl.
extract_parameters
andinject_gradients
are added to assist in taking gradients through simulations.bond_angle
andtorsion_angle
are added.random_velocities
is added.- A
solute
field is added toAtom
allowing solute-solvent weighting in interactions. This is added to theLennardJones
interaction. - A
proper
field is added toPeriodicTorsion
. - The float type is added as a type parameter to
System
.float_type
andis_gpu_diff_safe
are added to access the type parameters of aSystem
. - A
types
field is added to types such asInteractionList2Atoms
to record interaction types. find_neighbors
can now be given just the system as an argument.- Visualisation is updated to use GLMakie.jl v0.5.
- Bugs in velocity generation and temperature calculation with no units are fixed.
- Differentiable simulation works with Zygote reverse and forward mode AD on both CPU and GPU. General and specific interactions are supported along with neighbor lists. It does not currently work with units, user-defined types and some components of the package.
- Significant API changes are made including a number of functions being renamed, thermostats being renamed to couplers and the removal of some types.
Simulation
is renamed toSystem
and the time step and coupling are passed to the simulator, which is passed to thesimulate!
function.System
is a sub-type ofAbstractSystem
from AtomsBase.jl and the relevant interface is implemented, allowing interoperability with the wider ecosystem.- Specific interactions are changed to store indices and parameters as part of types such as
InteractionList2Atoms
. Specific interaction force functions now return types such asSpecificForce4Atoms
. Specific interactions can now run on the GPU. - Some abstract types are removed.
NeighborFinder
is renamed toAbstractNeighborFinder
. - The
potential_energy
function arguments match theforce
function arguments. - File reader setup functions are called using
System
and return aSystem
directly. find_neighbors!
is renamed tofind_neighbors
and returns the neighbors, which are no longer stored as part of the simulation.VelocityFreeVerlet
is renamed toStormerVerlet
.RescaleThermostat
andBerendsenThermostat
are added.random_velocities!
andvelocity_autocorr
are added.VelocityLogger
,KineticEnergyLogger
andPotentialEnergyLogger
are added.DistanceVecNeighborFinder
is added for use on the GPU.- Atomic charges are now dimensionless, i.e 1.0 is an atomic charge of +1.
HarmonicAngle
now works in 2D.- Support for Julia versions before 1.7 is dropped.
- Readers are added for OpenMM XML force field files and coordinate files supported by Chemfiles.jl. Forces, energies and the results of a short simulation exactly match the OpenMM reference implementation for a standard protein in the a99SB-ILDN force field.
- A cell neighbor list is added using CellListMap.jl.
CoulombReactionField
is added to calculate long-range electrostatic interactions.- The
PeriodicTorsion
interaction is added and the previous Ryckaert-BellemansTorsion
is renamed toRBTorsion
. - Support for weighting non-bonded interactions between atoms in a 1-4 interaction is added.
- The box size is changed from one value to three, allowing a larger variety of periodic box shapes.
- Support for different mixing rules is added for the Lennard-Jones interaction, with the default being Lorentz-Bertelot mixing.
- A simple
DistanceCutoff
is added. - Excluded residue names can now be defined for a
StructureWriter
. - The
placediatomics
andustripvec
functions are added. - The
AtomMin
type is removed, withAtom
now being a bits type andAtomData
used to store atom data. - Visualisation now uses GLMakie.jl.
adjust_bounds
is renamed towrapcoords
.
- Unitful.jl support is added and recommended for use, meaning numbers have physical meaning and many errors are caught. More type parameters have been added to various types to allow this. It is still possible to run simulations without units by specifying the
force_unit
andenergy_unit
arguments toSimulation
. - Interaction constructors with keyword arguments are added or improved.
- The maximum force for non-bonded interactions is removed.
- The spelling of "neighbour" is changed to "neighbor" throughout the package. This affects
NoNeighborFinder
,DistanceNeighborFinder
,TreeNeighborFinder
,find_neighbors!
and theneighbor_finder
argument toSimulation
. - Torsion angle force calculation is improved.
- A bug in force calculation for specific interactions is fixed.
- Support for Julia versions before 1.6 is dropped.
- The
TreeNeighbourFinder
is added for faster distance neighbour finding using NearestNeighbors.jl.
- Documentation is added for cutoffs.
- Compatibility bounds are updated for various packages, including requiring CUDA.jl version 2.
- Support for Julia versions before 1.5 is dropped.
- Shifted potential and shifted force cutoff approaches for non-bonded interactions are introduced.
- An
EnergyLogger
is added and the potential energy for existing interactions defined. - Simulations can now be run with the
CuArray
type from CUDA.jl, allowing GPU acceleration. - The in-place
force!
functions are changed to out-of-placeforce
functions with different arguments. - The i-i self-interaction is no longer computed for
force
functions. - The Mie potential is added.
- The list of neighbours is now stored in the
Simulation
type. - Documentation is added for experimental differentiable molecular simulation.
- Optimisations are implemented throughout the package.
- Support for Julia versions before 1.3 is dropped.
Initial release of Molly.jl, a Julia package for molecular simulation.
Features:
- Interface to allow definition of new forces, simulators, thermostats, neighbour finders, loggers etc.
- Read in pre-computed Gromacs topology and coordinate files with the OPLS-AA forcefield and run MD on proteins with given parameters. In theory it can do this for any regular protein, but in practice this is untested.
- Non-bonded interactions - Lennard-Jones Van der Waals/repulsion force, electrostatic Coulomb potential, gravitational potential, soft sphere potential.
- Bonded interactions - covalent bonds, bond angles, torsion angles.
- Andersen thermostat.
- Velocity Verlet and velocity-free Verlet integration.
- Explicit solvent.
- Periodic boundary conditions in a cubic box.
- Neighbour list to speed up calculation of non-bonded forces.
- Automatic multithreading.
- Some analysis functions, e.g. RDF.
- Run with Float64 or Float32.
- Physical agent-based modelling.
- Visualise simulations as animations.