Units and Conventions

Nyx uses a cosmological system of units based on Mpc, M\(_\odot\), and km/s for length, mass, and velocity, respectively. Temperature is given in degrees Kelvin. The unit of time is derived from velocity and length units. All inputs and problem initialization should be specified consistently with these units, and the outputs should be interpreted with these units in mind. In the equation of state calls, there is an internal conversion between cosmological and CGS units.

Table 2 shows some of the common symbols / names used throughout the code documentation and papers.

Table 2 Common quantities and units.
name units description
\(t\) (Mpc/km) s time
\(\rho\) M\(_\odot\) / Mpc\(^3\) mass density
\(\ub\) km/s velocity vector
\(p\) M\(_\odot\) (km/s)\(^2\) / Mpc\(^3\) pressure
\(\gb\) (km/s)2 / Mpc gravitational acceleration
\(E\) (km/s)\(^2\) specific total energy
\(e\) (km/s)\(^2\) specific internal energy
\(T\) \(K\) temperature

In Table 3 we list the values used for physical constants in cosmological units. Note that \(\Omega_m\), \(\Omega_b\), \(\Omega_r\) and \(h\) are set in the inputs file Comoving: List of Parameters. Full list of constants and conversion factors is set in Source/Driver/constants_cosmo.H.

Table 3 Physical constant values
Constant Cosmological units
Gravitational constant (\(G\)) 4.3019425e-9 Mpc (km/s)\(^2\) M\(_\odot^{-1}\)
Avogadro’s number (\(n_A\)) 1.1977558e57 M\(_\odot^{-1}\)
Boltzmann’s constant (\(k_B\)) 0.6941701e-59 M\(_\odot\) (km/s)\(^2\) / K
Hubble constant (\(H\)) 100 (km/s) / Mpc

The only other place that dimensional numbers are used in the code is in the tracing and Riemann solve. We set three small numbers which need to be consistent with the data specified We set one large number which needs to be consistent with the data specified. Each of these can be specified in the inputs file.

  • small_dens – small value for density
  • small_press – small value for pressure
  • small_temp – small value for temperature
  • large_temp – large value for temperature

These are the places that each is used in the code:

  • small_dens

    • enforce_minimum_density (called after subroutine consup) – there are two choices for this. In the flooring routine,
      enforce_minimum_density_floor – density is set to small_dens, (rho e) and (rho E) are computed from small_temp,
      and momenta are set to zero. In the conservative routine, enforce_minimum_density_cons, an iterative procedure
      is used to create diffusive fluxes that adjusts all the variables conservatively until density is greater than small_dens.
    • tracexy / tracez / tracexy_ppm / tracez_ppm:
      qxp = max(qxp,small_dens)
      qxm = max(qxm,small_dens)
      and analogously for qyp/qym and qzp/qzm. This modifies the primitive density and pressure inside the tracing, not the underlying state variables
    • riemannus – we set

      wsmall = small_dens * csmall

      and then

      wl = max(wsmall, sqrt(gaml * pl * rl))
      wr = max(wsmall, sqrt(gamr * pr * rr))

      Also, we set

      ro = max(small_dens,ro)

      where ro = 0.5 * (rl + rr) – this state is only chosen when ustar = 0, and

      rstar = max(small_dens,rstar)

      where rstar = ro + (pstar-po)/co:math:^2

  • small_temp:

    • compute_new_temp: if \(\rho e < 0\), then
      call nyx_eos_given_RT (e,…,small_temp,…) in order to compute a new energy, \(e\).
      This energy is then used to define a new \(E = e + ke\)
      Coming out of this the temperature is equal to small_temp and the energy \(e\) has been reset.
    • reset_internal_energy: if \(e < 0\) and \(E - ke < 0\) then
      call nyx_eos_given_RT (e,…,small_temp,…) in order to compute a new energy, \(e\). This energy is also used to define a new \(E = e + ke\)
  • large_temp:

    • compute_new_temp: if \(T > \mathrm{large\_temp}\), and the input flag nyx.local_max_temp_dt=1 then
      set \(T = \mathrm{large\_temp}\) and call nyx_eos_given_RT (e,…,large_temp,…) in order to compute a new energy, \(e\).
      This energy is then used to define a new \(E = e + ke\)
      Coming out of this the temperature is equal to large_temp and the energy \(e\) has been reset.
  • small_pres:

    • tracexy / tracez / tracexy_ppm / tracez_ppm:
      qpres = max(qpres,small_pres)
      for qxp/qyp, qyp/qym and qzp/qzm. This modifies the primitive density and pressure inside the tracing, not the underlying state variables
    • riemannus – we set

      pstar = max(small_pres,pstar)
      pgdnv = max(small_pres,pgdnv). Note that pgdnv is the pressure explicitly used in the fluxes.
    • uflatten – small_pres is used to keep the denominator away from zero

    • Everywhere we define values of pressure on a face, we set that value to be at least small_pres.