.. index:: clock .. currentmodule:: brian Clocks ====== Brian is a clock-based simulator: operations are done synchronously at each tick of a clock. Many Brian objects store a clock object, passed in the initialiser with the optional keyword ``clock``. For example, to simulate a neuron group with time step dt=1 ms:: myclock=Clock(dt=1*ms) group=NeuronGroup(100,model='dx/dt=1*mV/ms : volt',clock=myclock) If no clock is specified, the program uses the global default clock. When Brian is initially imported, this is the object :data:`defaultclock`, and it has a default time step of 0.1 ms. In a simple script, you can override this by writing (for example):: defaultclock.dt = 1*ms You may wish to use multiple clocks in your program. In this case, for each object which requires one, you have to pass a copy of its :class:`Clock` object. The network run function automatically handles objects with different clocks, updating them all at the appropriate time according to their time steps (value of :attr:`~Clock.dt`). Multiple clocks can be useful, for example, for defining a simulation that runs with a very small ``dt``, but with some computationally expensive operation running at a lower frequency. In the following example, the model is simulated with dt=0.01 ms and the variable x is recorded every ms:: simulation_clock=Clock(dt=0.01*ms) record_clock=Clock(dt=1*ms) group=NeuronGroup(100,model='dx/dt=-x/tau : volt',clock=simulation_clock) M=StateMonitor(group,'x',record='True',clock=record_clock) The current time of a clock is stored in the attribute ``t`` (``simulation_clock.t``) and the timestep is stored in the attribute ``dt``. When using multiple clocks, it can be important to specify the order in which they evaluated, which you can using the ``order`` keyword of the :class:`Clock` object, e.g.:: clock_first = Clock(dt=1*ms, order=0) clock_second = Clock(dt=5*ms, order=1) Every 5ms, these two clocks will coincide, and the order attribute means that ``clock_first`` will always be evaluated before ``clock_second``. Other clocks ------------ The default clock uses an underlying integer representation. This behaviour was changed in Brian 1.3 from earlier versions which used a float representation. To recover the earlier behaviour if it is important, you can use :class:`FloatClock` or :class:`NaiveClock`. You may want to have events that happen at regular times, but still want to use the default clock for all other objects, in which case you can use the :class:`EventClock` for a :func:`network_operation` and it will not create any clock ambiguities, e.g.:: from brian import * ... G = NeuronGroup(N, eqs, ...) ... @network_operation(clock=EventClock(dt=1*second)) def do_something(): ...