# evolution.m

Time evolution function optimised for *extended evolution periods with multiple time steps*, such as trajectory calculation and detection stages of time-domain experiments. For brief one-off evolution events (hard pulses, slices of shaped pulses) or time-dependent Liouvillians use step.m instead.

This function runs trajectory level state space analysis (https://doi.org/10.1016/j.jmr.2008.08.008), partitions the state space into the smallest possible independently evolving subspaces, and runs exponential time propagation in each subspace:

Matrix exponentials are computed explicitly. When this function detects that the dimension of the Liouvillian is too big for exponentiation, it calls krylov.m with the same parameters.

## Syntax

answer=evolution(spin_system,L,coil,rho,timestep,nsteps,output,destination)

## Arguments

Arguments for Liouville space calculations:

L - the Liouvillian to be used during evolution rho - the initial state vector or a horizontal stack thereof output - a string giving the type of evolution that is required 'final' - returns the final state vector or a horizontal stack thereof. 'trajectory' - returns the stack of state vectors giving the trajectory of the system starting from rho with the user-specified number of steps and step length. 'total' - returns the integral of the observable trace from the simulation start to infinity. This option requires the presence of relaxation. 'refocus' - evolves the first vector for zero steps, second vector for one step, third vector for two steps, etc., consistent with the second stage of evolution in the indirect dimension after a refocusing pulse. 'observable' - returns the time dynamics of an observable as a vector (if starting from a single ini- tial state) or a matrix (if starting from a stack of initial states). 'multichannel' - returns the time dynamics of several observables as rows of a matrix. Note that destination state screening may be less efficient when there are multiple destinations to screen against. coil - the detection state, used when 'observable' is specified as the output option. If 'multichannel' is selected, the coil should contain multiple columns corresponding to individual observable vectors. destination - (optional) the state to be used for destination state screening.

Arguments for Hilbert space calculations:

L - Hamiltonian matrix coil - observable operator (if any) rho - initial density matrix timestep - duration of a single time step (seconds) nsteps - number of steps to take output - a string giving the type of evolution that is required 'final' - returns the final density matrix. 'trajectory' - returns a cell array of density matrices giving the trajectory of the system star- ting from rho with the user-specified num- ber of steps and step length. 'refocus' - evolves the first matrix for zero steps, second matrix for one step, third matrix for two steps, etc., consistent with the second stage of evolution in the indirect dimension after a refocusing pulse. 'observable' - returns the time dynamics of an observable as a vector. destination - this argument is ignored.

## Outputs

answer - a vector, a matrix, or a cell array or matrices, depending on the options set during the call

## Notes

- Calculation of final states and observables in Hilbert space is parallelised (http://dx.doi.org/10.1063/1.3679656) and tested all the way to 128-core (16 nodes, 8 cores each) configuations. Parallelization of the trajectory calculation does not appear to yield any benefits due to large amount of inter-thread communication.
- One-off propagation events (e.g. a hard pulse) should be computed with step.m, which is more efficient in those cases.
- For large Liouvillians that cannot be exponentiated, use krylov.m, which avoids matrix exponentials.
- For shaped pulses, use shaped_pulse_af.m and shaped_pulse_xy.m
- GPUs are supported, add 'gpu' to sys.enable array during calculation setup.

## See also

step.m, krylov.m, reduce.m, propagator.m, shaped_pulse_af.m, shaped_pulse_xy.m

*Version 2.3, authors: Ilya Kuprov, Luke Edwards, Ohad Levinkron*