Bmad is an object oriented, open source, subroutine library for relativistic charged-particle dynamics simulations in accelerators and storage rings. Bmad has been developed at Cornell University's Laboratory for Elementary Particle Physics and has been in use since the mid 1990's. The Bmad subroutines were developed to:

Bmad has a wide range of routines to do many things. Bmad can be used to study both single and multi--particle beam dynamics. It has routines to track both particles and macroparticles. Bmad has various tracking algorithms including Runge--Kutta and symplectic (Lie algebraic) integration. Wakefields, and radiation excitation and damping can be simulated. Bmad has routines for calculating transfer matrices, emittances, Twiss parameters, dispersion, coupling, etc. The elements that Bmad knows about include quadrupoles, RF cavities (both storage ring and LINAC accelerating types), solenoids, dipole bends, etc. In addition, elements can be defined to control the attributes of other elements. This can be used to simulate the ``girders'' which physically support components in the accelerator or to easily simulate the action of control room ``knobs'' that gang together, say, the current going through a set of quadrupoles. Bmad, by interfacing with Etienne Forest's (Patrice Nishikawa) PTC code, Bmad can, for example, compute Taylor maps to arbitrary order and do normal form analysis.

Currently a major upgrade project for Bmad is the development of X-Ray tracking capability. The idea is to be able to do a "complete" simulation of accelerated charged-particle beams and the x-ray beams they create. Ultimately a complete framework for simulations from a Gun cathode (including space-charge) to x-ray generation, to x-ray tracking through to the experimental end-stations is envisioned. The ability to define multiple X-Ray beam lines and the ability to do tracking with mirror, crystal, and capillary elements has already been implemented.

To be able to extend Bmad easily, Bmad has been developed in a modular, object oriented, fashion to maximize flexibility. As just one example, each individual element can be assigned a particular tracking method in order to maximize speed or accuracy and the tracking methods can be assigned via the lattice file or at run time in a program.