InterfaceΒΆ

The EOS with thermal+composition degrees of freedom are represented by objects of type eos_thermal. These objects represent the generic EOS interface and do not implement any EOS. Instead, they forward any request to an actual implementation of a particular EOS. To obtain an eos_thermal object representing a particular EOS, one uses functions such as make_eos_hybrid() provided for each type of EOS, or reads from an universal EOS file using load_eos_thermal().

Calling the EOS is a two stage process: first, one needs to specify the state of matter. This can be done either in terms of mass density, specific internal energy, and electron fraction, or in terms of mass density, temperature, and electron fraction. For this, use the methods at_rho_eps_ye() and at_rho_temp_ye(). Both return an object of type state. All EOS provide the first form, which is required for numerical simulations. The second form based on temperature is optional and might not be supported by all EOS implementations.

Second, one can use methods of this object to obtain pressure, soundspeed, internal specific energy, temperature, specific entropy, derivatives of pressure with respect to mass density and internal specific energy. Further, one can use the state object like a boolean variable to check if the state is in the valid regime of the EOS. Trying to compute any of the above from an invalid state will throw an exception. The following snipped demonstrates the EOS use:

auto s = eos.at_rho_eps_ye(rho, eps, ye);
if (s) {
  auto pressure   = s.press()
  auto soundspeed = s.csnd()
}

The functionality above is also provided by another set of EOS methods with names such as press_at_rho_eps_ye(), press_at_rho_temp_ye(), etc. Those do not throw exceptions when called outside the valid ranges, but instead return NANs. When computing several quantities for the same state, the alternative syntax might be less efficient because the validity has to be checked and the thermal degree of freedom mapped onto the EOS-internal representation each time instead of only once as for the primary syntax.

The eos_thermal class also provides methods to query the valid ranges of the independent variables. For mass density and electron fraction, the validity region is a simple range. For specific internal energy or temperature, the valid range depends on mass density and electron fraction. For convenience, there are methods to check if given parameter combinations are in the valid region.

Tip

The interface objects are designed to be used as ordinary variables, which can be copied around cheaply and without worrying about ownership of any resource allocations. Internally, they just contain a shared pointer to an actual (immutable) implementation.

Note

The EOS interface is thread-safe in the sense that the same EOS oject can be used in multiple threads. Since the EOS implementations are immutable, data-races cannot occur. Copying an EOS object inside a thread is save but might affect performance since the copying is an atomic operation. Passing the EOS inside an innermost loop should better be done by reference instead of value.