.. _EnzoInternalUnits:
Enzo Internal Unit System
=========================
The units of the physical quantities used in Enzo depend on the problem being
run. For most test problems there is no physical length or time specified, so
the units can be be simply scaled. For cosmology, there are a set of units
designed to make most quantities of order unity so that single precision
floating-point variables can be used. These units are defined in
:ref:`EnzoOutputFormats`. Additionally, discussion of how particle masses are
stored in Enzo can be found at :ref:`EnzoParticleMass`. However, with the
broader use of Enzo for non-cosmological astrophysics applications, it has
become necessary to add a new set of units into the code. This page describes
how to set these units.
In order to have a self-consistent set of units, the user has to set
appropriate length, time, and mass OR density scales. Simulations that include
gravity also need to have a self-consistent gravitational constant that is
scaled to the other variables. The four parameters that the user can set are
``LengthUnits``, ``TimeUnits``, ``DensityUnits``, and ``MassUnits``. Only one of ``DensityUnits``
or ``MassUnits`` needs to be set, since ``MassUnits`` = ``DensityUnits`` * ``LengthUnits``
:sup:`3` . Additionally, if the parameter ``SelfGravity`` is turned on (set to 1),
the parameter ``GravitationalConstant`` must be set to 4\*pi\*G, where G is
Newton's gravitational constant as a dimensionless quantity (that is, with all
units scaled out).
The primary motivation for using a non-arbitrary set of units is to take
advantage of Enzo's various chemistry and cooling algorithms, some of which
have been scaled assuming CGS units. To do this, one chooses physical units
assuming the simulation box size is unity in code units, and that a
density/mass and time value of 1 in code units are something meaningful in CGS.
For example, if one is interested in setting the box size to one parsec, a
density of 1 in code units equivalent to to 10 hydrogen atoms per cubic
centimeter (in CGS units), and the time unit to one million years, the
appropriate settings of the parameters would be as follows:
::
DensityUnits = 1.67e-23 # 10 hydrogen atoms per cc in CGS (c/cm^3)
LengthUnits = 3.0857e+18 # one parsec in cm
TimeUnits = 3.1557e+13 # one megayear in seconds
If we then wish to use gravity, the gravitational constant must be set
explicitly to 4\*pi\*G expressed in a unitless fashion. Since the gravitational
constant in CGS has units of cm\ :sup:`3`\ /(g\*s\ :sup:`2`\ ), this means that
the value should be 4\*pi\*G\ :sub:`cgs` \* ``DensityUnits`` * ``TimeUnits`` :sup:`2`\ . So,
in the units expressed above, that means the gravity parameters must be set as
follows:
::
SelfGravity = 1
GravitationalConstant = 0.0139394 # 4*pi*G_{cgs}*DensityUnits*TimeUnits^2
Note that if gravity is turned on, the parameter ``TopGridGravityBoundary`` must
also be set to either 0 (periodic) or 1 (isolated).
If you set only ``LengthUnits`` and ``DensityUnits`` but not ``TimeUnits`` the code will
calculate it for you using the actual gravitational constant. You see it
printed out in the terminal when the code starts up and you can also find it
towards the end of the parameter file of any output.