Programme flow: signals and data caches¶
The design goals of modularity and scriptability of HAL’s MD package lead us
to a data-driven programme flow, which shares similarities with functional
programming. For instance, the sampling of an observable requires information
about the system state (particle positions, velocities, forces, …) at the given
time. This triggers the integrator, and reading the forces causes a
recomputation of all force contributions defined. To avoid unnecessary
recalculation of the same quantity, data caches and cache observes are used
(see class halmd::utility::cache
). Such strict dependencies are implemented
in the C++ layer.
Second, the dependencies between modules are realised using signal/slot
relations, which are set up in the Lua layer of each module. These connections
are usually not explicit in the simulation script, but can be manipulated by
advanced users. Upon emission of a signal, a number of previously connected
slot functions is invoked. Slot functions are typically of signature void ()
.
A typical molecular dynamics simulation using one velocity Verlet integrator
and one truncated pair force is depicted below. Signals are shown as rectangles
within the emitting module, methods are shown as ellipses; dashed lines are
hard-coded dependencies across modules. Observables would connect to the
signal sample
and have been omitted for clarity.