MFC
Exascale flow solver
Loading...
Searching...
No Matches
m_eos Module Reference

Equations of state in Gamma/Pi form, rho e = Gamma(rho) p + Pi(rho). More...

Functions/Subroutines

impure subroutine, public s_initialize_eos_module ()
 Resolve every fluid's EOS coefficients once, before any conversion runs.
impure subroutine, public s_finalize_eos_module ()
 Deallocate the fluid property arrays allocated in s_initialize_eos_module.
subroutine s_reference_curve (rho, i, p_ref, e_ref, dp_drho, de_drho, g0, dg0)
 The reference curve of a state-dependent EOS at rho: p_ref, e_ref, their d/drho, and Gamma_G with its d/drho. A new family adds one case here and nothing else.
logical function, public f_is_state_dependent (i)
 Whether the EOS of fluid i is a family whose coefficients vary with density.
logical function f_has_isentropic_reference (i)
 True when fluid i's reference curve is itself an isentrope (de_ref = -p_ref d(1/rho), which holds for JWL and Vinet but not for the Mie-Gruneisen Hugoniot) and its Gruneisen coefficient is constant. Those two together make the isentrope through any state closed-form, so it never has to be integrated.
impure real(wp) function f_hugoniot_compression_limit (c0, s, s2, s3)
 The largest compression a cubic Hugoniot fit can represent. mu(u_p) = u_p/(u_s - u_p) rises, peaks where c0 = s2 u_p^2 + 2 s3 u_p^3, and falls after; only the rising branch is a physical shock. Returns a huge value for the linear fit, which never turns over. Host-side: called once per fluid at initialization.
subroutine s_eos_coefficients (rho, i, gamma, pi_inf, dpi, dgamma)
 Gamma, Pi, dPi/drho and dGamma/drho of fluid i at density rho, the coefficients of rho e = Gamma p + Pi(rho). Stiffened and ideal gas keep the constants resolved at init, bit for bit.
real(wp) function, public f_isentrope_exponent (gamma)
 Exponent of the stiffened-gas isentrope p + B = const rho**n. Precomputed per fluid as isentrope_n.
real(wp) function, public f_isentrope_pressure (pi_inf, gamma)
 Reference pressure of that isentrope. Precomputed per fluid as isentrope_B.
real(wp) function, public f_sg_thermal (pres, rho_or_t, n, b, cv)
 Stiffened-gas thermal law p + B = (n - 1)*cv*rho*T. Pass rho to get T, or T to get rho.
real(wp) function, public f_mixture_temperature (alpha_rho_k, pres, gamma_k, pi_inf_k)
 Thermal-equilibrium mixture temperature for stiffened gas, from primitives. Algebraically identical to the conservative form in m_phase_change's s_infinite_pt_relaxation_k, T = (rho*e + p - sum(alpha_rho_i*qv_i)) / sum(alpha_rho_i*cv_i*n_i), because rho*e = gamma_mix*p + pi_inf_mix + sum(alpha_rho_i*qv_i) in MFC's stored variables.
subroutine, public s_phase_coefficients (alpha_rho, alpha, i, rho, gamma, pi_inf, dpi, dgamma)
 Coefficients of phase i at its own density alpha_rho/alpha: the per-cell dispatch when some fluid's EOS is state dependent, the constants resolved at init otherwise (bit for bit).
real(wp) function f_c2_from_coefficients (rho, pres, gamma, pi_inf, dpi, dgamma)
 c^2 = [((Gamma + 1) p + Pi)/rho - dPi/drho - p dGamma/drho]/Gamma, the frozen speed of one phase.
subroutine s_phase_c2 (rho, pres, i, c2)
 Frozen sound speed squared of one phase at (rho, p) from its own coefficients. These helpers are subroutines, not functions: a device function that calls a device subroutine is a pattern no other backend-tested code in MFC uses.
subroutine s_ode_slope (kind, i, x, y, dydx)
 Slope of the ODE kind for fluid i: dp/drho = c^2 along an isentrope (x = rho, y = p), or the reference temperature dT/dV = (de_ref/dV + p_ref)/c_v - Gamma_G T/V (x = V, y = T), the Maxwell relation applied to e = e_ref + c_v (T - T_ref).
subroutine s_rk4 (kind, i, x0, y0, x1, y)
 Fixed-step classical RK4 for the ODE kind from (x0, y0) to x1.
subroutine, public s_phase_pressure_on_isentrope (pres, rho, xi, i, p_isen)
 Pressure of phase i after the isentropic density change rho -> xi rho: closed form for the constant-coefficient families, integrated for a state-dependent EOS (the star states it serves are close to rho).
subroutine, public s_phase_temperature (rho, pres, i, t)
 Temperature of phase i at (rho, p): the stiffened-gas relation, or T_ref(rho) + (e - e_ref)/c_v.
subroutine, public s_phase_density_on_isentrope (i, rho_from, p_from, p_to, rho_to, c2_to)
 Density of phase i on the isentrope through (rho_from, p_from) at p_to, and c^2 there: Newton on the pressure integrator, whose slope is c^2. The relaxation's own Newton wraps this, so a few steps suffice.
subroutine, public s_phase_internal_energy (pres, alpha, alpha_rho, i, e_phase)
 Internal energy per unit volume of phase i at pressure pres: alpha (Gamma p + Pi) + alpha_rho qv, with the coefficients at the phase's own density.
subroutine, public s_phase_bulk_modulus (pres, alpha, alpha_rho, i, blkmod)
 Bulk modulus rho c^2 of phase i at pressure pres: f_bulk_modulus for a constant-coefficient fluid, bit for bit, minus the reference-curve terms rho (dPi/drho + p dGamma/drho)/Gamma otherwise.
real(wp) function, public f_pressure (e_int, gamma, pi_inf, qv)
 Pressure of a stiffened gas from its internal energy density - the inverse of s_compute_energy. Callers subtract the kinetic, magnetic and elastic energy first; none of those are equation-of-state terms.
real(wp) function, public f_bulk_modulus (pres, gamma, pi_inf)
 Isentropic bulk modulus. Takes coefficients rather than a fluid index, so a mixture - whose effective gamma and pi_inf come from s_compute_mixture_coefficients - is the same call as a single fluid. Elastic callers add their own shear term.
real(wp) function, public f_relativistic_enthalpy (pres, rho, gamma)
 Relativistic specific enthalpy, h = 1 + (Gamma + 1)p/rho. Ideal gas only: the stiffness does not appear, so a fluid with a nonzero pi_inf is not represented here (the validator refuses that combination).
subroutine, public s_compute_mixture_coefficients (alpha_rho_k, alpha_k, rho_k, gamma_k, pi_inf_k, qv_k)
 Mixture coefficients of one state. Under bubbles_euler with num_fluids == 1 the sole advection slot aliases the void fraction (eqn_idxalf == eqn_idxadvend), so alpha is not a composition there and the coefficients are the liquid's. Clipping stays with callers; it differs between solvers and cannot coincide with that case, as mpp_lim requires num_fluids > 1.
subroutine, public s_compute_mixture_coefficients_dt (dalpha_rho_dt, dadv_dt, alpha_rho, adv, drho_dt, dgamma_dt, dpi_inf_dt, dqv_dt)
 Time derivative of the mixture coefficients, mirroring s_compute_mixture_coefficients.
subroutine, public s_compute_speed_of_sound (pres, rho, gamma, pi_inf, adv, c, alpha_rho)
 Speed of sound of a thermodynamic state. Enthalpy is not an argument: for a real state H, |u|^2 and qv all cancel out of c^2 = ((Gamma + 1)p + Pi)/(Gamma rho). Averaged states, whose enthalpy is a free input, use the _avg variant.
subroutine, public s_compute_speed_of_sound_avg (pres, rho, gamma, pi_inf, qv, vel_sum, h, c_c, adv, c, alpha_rho)
 Speed of sound of an interface-averaged state. An average of two states is not a state - its enthalpy is not the one its pressure and density imply - so the caller supplies H, |u|^2 and qv. Only the enthalpy-reading branches differ from s_compute_speed_of_sound; keep the condition below in step with the branch list there.

Detailed Description

Equations of state in Gamma/Pi form, rho e = Gamma(rho) p + Pi(rho).

Stiffened and ideal gas keep constant coefficients, resolved once at start-up. The state-dependent families (Mie-Gruneisen, JWL, Vinet) evaluate theirs per cell from a reference curve.

The mixture closure rules that combine the phases – Wood's law, the six-equation mean, the bubbly branch – are not themselves equations of state, but s_compute_mixture_coefficients, s_compute_speed_of_sound and their _dt/_avg variants live here rather than in m_variables_conversion, and must stay here. They are the hot-path callers of the phase chain (s_phase_coefficients -> s_eos_coefficients -> s_reference_curve), and on NVHPC that inlining only happens within a single file: the cross-file inliner refuses any device routine with a subroutine call in its call tree. Splitting them from the chain costs ~25% of grind time on NVHPC and nothing on the other backends, so it fails quietly. The solver kernels never inlined these four in the first place, which is why the module boundary is drawn above them and not below. See docs/documentation/gpuParallelization.md, "Module boundaries and NVHPC inlining".

This module is a leaf: it directly uses only m_derived_types, m_constants, and m_global_parameters_common. Adding an EOS family means one case in s_reference_curve.

Function/Subroutine Documentation

◆ f_bulk_modulus()

real(wp) function, public m_eos::f_bulk_modulus ( real(wp), intent(in) pres,
real(wp), intent(in) gamma,
real(wp), intent(in) pi_inf )

Isentropic bulk modulus. Takes coefficients rather than a fluid index, so a mixture - whose effective gamma and pi_inf come from s_compute_mixture_coefficients - is the same call as a single fluid. Elastic callers add their own shear term.

Definition at line 1823 of file m_eos.fpp.f90.

Here is the caller graph for this function:

◆ f_c2_from_coefficients()

real(wp) function m_eos::f_c2_from_coefficients ( real(wp), intent(in) rho,
real(wp), intent(in) pres,
real(wp), intent(in) gamma,
real(wp), intent(in) pi_inf,
real(wp), intent(in) dpi,
real(wp), intent(in) dgamma )
private

c^2 = [((Gamma + 1) p + Pi)/rho - dPi/drho - p dGamma/drho]/Gamma, the frozen speed of one phase.

Definition at line 1353 of file m_eos.fpp.f90.

Here is the caller graph for this function:

◆ f_has_isentropic_reference()

logical function m_eos::f_has_isentropic_reference ( integer, intent(in) i)
private

True when fluid i's reference curve is itself an isentrope (de_ref = -p_ref d(1/rho), which holds for JWL and Vinet but not for the Mie-Gruneisen Hugoniot) and its Gruneisen coefficient is constant. Those two together make the isentrope through any state closed-form, so it never has to be integrated.

Definition at line 977 of file m_eos.fpp.f90.

Here is the caller graph for this function:

◆ f_hugoniot_compression_limit()

impure real(wp) function m_eos::f_hugoniot_compression_limit ( real(wp), intent(in) c0,
real(wp), intent(in) s,
real(wp), intent(in) s2,
real(wp), intent(in) s3 )
private

The largest compression a cubic Hugoniot fit can represent. mu(u_p) = u_p/(u_s - u_p) rises, peaks where c0 = s2 u_p^2 + 2 s3 u_p^3, and falls after; only the rising branch is a physical shock. Returns a huge value for the linear fit, which never turns over. Host-side: called once per fluid at initialization.

Definition at line 1025 of file m_eos.fpp.f90.

Here is the caller graph for this function:

◆ f_is_state_dependent()

logical function, public m_eos::f_is_state_dependent ( integer, intent(in) i)

Whether the EOS of fluid i is a family whose coefficients vary with density.

Definition at line 929 of file m_eos.fpp.f90.

Here is the caller graph for this function:

◆ f_isentrope_exponent()

real(wp) function, public m_eos::f_isentrope_exponent ( real(wp), intent(in) gamma)

Exponent of the stiffened-gas isentrope p + B = const rho**n. Precomputed per fluid as isentrope_n.

Definition at line 1090 of file m_eos.fpp.f90.

Here is the caller graph for this function:

◆ f_isentrope_pressure()

real(wp) function, public m_eos::f_isentrope_pressure ( real(wp), intent(in) pi_inf,
real(wp), intent(in) gamma )

Reference pressure of that isentrope. Precomputed per fluid as isentrope_B.

Definition at line 1136 of file m_eos.fpp.f90.

Here is the caller graph for this function:

◆ f_mixture_temperature()

real(wp) function, public m_eos::f_mixture_temperature ( real(wp), dimension(num_fluids), intent(in) alpha_rho_k,
real(wp), intent(in) pres,
real(wp), intent(in) gamma_k,
real(wp), intent(in) pi_inf_k )

Thermal-equilibrium mixture temperature for stiffened gas, from primitives. Algebraically identical to the conservative form in m_phase_change's s_infinite_pt_relaxation_k, T = (rho*e + p - sum(alpha_rho_i*qv_i)) / sum(alpha_rho_i*cv_i*n_i), because rho*e = gamma_mix*p + pi_inf_mix + sum(alpha_rho_i*qv_i) in MFC's stored variables.

Definition at line 1230 of file m_eos.fpp.f90.

◆ f_pressure()

real(wp) function, public m_eos::f_pressure ( real(wp), intent(in) e_int,
real(wp), intent(in) gamma,
real(wp), intent(in) pi_inf,
real(wp), intent(in) qv )

Pressure of a stiffened gas from its internal energy density - the inverse of s_compute_energy. Callers subtract the kinetic, magnetic and elastic energy first; none of those are equation-of-state terms.

Definition at line 1776 of file m_eos.fpp.f90.

Here is the caller graph for this function:

◆ f_relativistic_enthalpy()

real(wp) function, public m_eos::f_relativistic_enthalpy ( real(wp), intent(in) pres,
real(wp), intent(in) rho,
real(wp), intent(in) gamma )

Relativistic specific enthalpy, h = 1 + (Gamma + 1)p/rho. Ideal gas only: the stiffness does not appear, so a fluid with a nonzero pi_inf is not represented here (the validator refuses that combination).

Definition at line 1870 of file m_eos.fpp.f90.

Here is the caller graph for this function:

◆ f_sg_thermal()

real(wp) function, public m_eos::f_sg_thermal ( real(wp), intent(in) pres,
real(wp), intent(in) rho_or_t,
real(wp), intent(in) n,
real(wp), intent(in) b,
real(wp), intent(in) cv )

Stiffened-gas thermal law p + B = (n - 1)*cv*rho*T. Pass rho to get T, or T to get rho.

Definition at line 1182 of file m_eos.fpp.f90.

Here is the caller graph for this function:

◆ s_compute_mixture_coefficients()

subroutine, public m_eos::s_compute_mixture_coefficients ( real(wp), dimension(num_fluids), intent(in) alpha_rho_k,
real(wp), dimension(num_fluids), intent(in) alpha_k,
real(wp), intent(out) rho_k,
real(wp), intent(out) gamma_k,
real(wp), intent(out) pi_inf_k,
real(wp), intent(out) qv_k )

Mixture coefficients of one state. Under bubbles_euler with num_fluids == 1 the sole advection slot aliases the void fraction (eqn_idxalf == eqn_idxadvend), so alpha is not a composition there and the coefficients are the liquid's. Clipping stays with callers; it differs between solvers and cannot coincide with that case, as mpp_lim requires num_fluids > 1.

Definition at line 1918 of file m_eos.fpp.f90.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ s_compute_mixture_coefficients_dt()

subroutine, public m_eos::s_compute_mixture_coefficients_dt ( real(wp), dimension(num_fluids), intent(in) dalpha_rho_dt,
real(wp), dimension(num_fluids), intent(in) dadv_dt,
real(wp), dimension(num_fluids), intent(in) alpha_rho,
real(wp), dimension(num_fluids), intent(in) adv,
real(wp), intent(out) drho_dt,
real(wp), intent(out) dgamma_dt,
real(wp), intent(out) dpi_inf_dt,
real(wp), intent(out) dqv_dt )

Time derivative of the mixture coefficients, mirroring s_compute_mixture_coefficients.

Definition at line 2005 of file m_eos.fpp.f90.

Here is the call graph for this function:

◆ s_compute_speed_of_sound()

subroutine, public m_eos::s_compute_speed_of_sound ( real(wp), intent(in) pres,
real(wp), intent(in) rho,
real(wp), intent(in) gamma,
real(wp), intent(in) pi_inf,
real(wp), dimension(num_fluids), intent(in) adv,
real(wp), intent(out) c,
real(wp), dimension(num_fluids), intent(in), optional alpha_rho )

Speed of sound of a thermodynamic state. Enthalpy is not an argument: for a real state H, |u|^2 and qv all cancel out of c^2 = ((Gamma + 1)p + Pi)/(Gamma rho). Averaged states, whose enthalpy is a free input, use the _avg variant.

Definition at line 2087 of file m_eos.fpp.f90.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ s_compute_speed_of_sound_avg()

subroutine, public m_eos::s_compute_speed_of_sound_avg ( real(wp), intent(in) pres,
real(wp), intent(in) rho,
real(wp), intent(in) gamma,
real(wp), intent(in) pi_inf,
real(wp), intent(in) qv,
real(wp), intent(in) vel_sum,
real(wp), intent(in) h,
real(wp), intent(in) c_c,
real(wp), dimension(num_fluids), intent(in) adv,
real(wp), intent(out) c,
real(wp), dimension(num_fluids), intent(in), optional alpha_rho )

Speed of sound of an interface-averaged state. An average of two states is not a state - its enthalpy is not the one its pressure and density imply - so the caller supplies H, |u|^2 and qv. Only the enthalpy-reading branches differ from s_compute_speed_of_sound; keep the condition below in step with the branch list there.

Definition at line 2214 of file m_eos.fpp.f90.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ s_eos_coefficients()

subroutine m_eos::s_eos_coefficients ( real(wp), intent(in) rho,
integer, intent(in) i,
real(wp), intent(out) gamma,
real(wp), intent(out) pi_inf,
real(wp), intent(out) dpi,
real(wp), intent(out) dgamma )
private

Gamma, Pi, dPi/drho and dGamma/drho of fluid i at density rho, the coefficients of rho e = Gamma p + Pi(rho). Stiffened and ideal gas keep the constants resolved at init, bit for bit.

Definition at line 1051 of file m_eos.fpp.f90.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ s_finalize_eos_module()

impure subroutine, public m_eos::s_finalize_eos_module

Deallocate the fluid property arrays allocated in s_initialize_eos_module.

Definition at line 793 of file m_eos.fpp.f90.

◆ s_initialize_eos_module()

impure subroutine, public m_eos::s_initialize_eos_module

Resolve every fluid's EOS coefficients once, before any conversion runs.

Definition at line 402 of file m_eos.fpp.f90.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ s_ode_slope()

subroutine m_eos::s_ode_slope ( integer, intent(in) kind,
integer, intent(in) i,
real(wp), intent(in) x,
real(wp), intent(in) y,
real(wp), intent(out) dydx )
private

Slope of the ODE kind for fluid i: dp/drho = c^2 along an isentrope (x = rho, y = p), or the reference temperature dT/dV = (de_ref/dV + p_ref)/c_v - Gamma_G T/V (x = V, y = T), the Maxwell relation applied to e = e_ref + c_v (T - T_ref).

Definition at line 1430 of file m_eos.fpp.f90.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ s_phase_bulk_modulus()

subroutine, public m_eos::s_phase_bulk_modulus ( real(wp), intent(in) pres,
real(wp), intent(in) alpha,
real(wp), intent(in) alpha_rho,
integer, intent(in) i,
real(wp), intent(out) blkmod )

Bulk modulus rho c^2 of phase i at pressure pres: f_bulk_modulus for a constant-coefficient fluid, bit for bit, minus the reference-curve terms rho (dPi/drho + p dGamma/drho)/Gamma otherwise.

Definition at line 1726 of file m_eos.fpp.f90.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ s_phase_c2()

subroutine m_eos::s_phase_c2 ( real(wp), intent(in) rho,
real(wp), intent(in) pres,
integer, intent(in) i,
real(wp), intent(out) c2 )
private

Frozen sound speed squared of one phase at (rho, p) from its own coefficients. These helpers are subroutines, not functions: a device function that calls a device subroutine is a pattern no other backend-tested code in MFC uses.

Definition at line 1400 of file m_eos.fpp.f90.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ s_phase_coefficients()

subroutine, public m_eos::s_phase_coefficients ( real(wp), intent(in) alpha_rho,
real(wp), intent(in) alpha,
integer, intent(in) i,
real(wp), intent(out) rho,
real(wp), intent(out) gamma,
real(wp), intent(out) pi_inf,
real(wp), intent(out) dpi,
real(wp), intent(out) dgamma )

Coefficients of phase i at its own density alpha_rho/alpha: the per-cell dispatch when some fluid's EOS is state dependent, the constants resolved at init otherwise (bit for bit).

Definition at line 1298 of file m_eos.fpp.f90.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ s_phase_density_on_isentrope()

subroutine, public m_eos::s_phase_density_on_isentrope ( integer, intent(in) i,
real(wp), intent(in) rho_from,
real(wp), intent(in) p_from,
real(wp), intent(in) p_to,
real(wp), intent(out) rho_to,
real(wp), intent(out) c2_to )

Density of phase i on the isentrope through (rho_from, p_from) at p_to, and c^2 there: Newton on the pressure integrator, whose slope is c^2. The relaxation's own Newton wraps this, so a few steps suffice.

Definition at line 1629 of file m_eos.fpp.f90.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ s_phase_internal_energy()

subroutine, public m_eos::s_phase_internal_energy ( real(wp), intent(in) pres,
real(wp), intent(in) alpha,
real(wp), intent(in) alpha_rho,
integer, intent(in) i,
real(wp), intent(out) e_phase )

Internal energy per unit volume of phase i at pressure pres: alpha (Gamma p + Pi) + alpha_rho qv, with the coefficients at the phase's own density.

Definition at line 1676 of file m_eos.fpp.f90.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ s_phase_pressure_on_isentrope()

subroutine, public m_eos::s_phase_pressure_on_isentrope ( real(wp), intent(in) pres,
real(wp), intent(in) rho,
real(wp), intent(in) xi,
integer, intent(in) i,
real(wp), intent(out) p_isen )

Pressure of phase i after the isentropic density change rho -> xi rho: closed form for the constant-coefficient families, integrated for a state-dependent EOS (the star states it serves are close to rho).

Definition at line 1514 of file m_eos.fpp.f90.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ s_phase_temperature()

subroutine, public m_eos::s_phase_temperature ( real(wp), intent(in) rho,
real(wp), intent(in) pres,
integer, intent(in) i,
real(wp), intent(out) t )

Temperature of phase i at (rho, p): the stiffened-gas relation, or T_ref(rho) + (e - e_ref)/c_v.

Definition at line 1573 of file m_eos.fpp.f90.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ s_reference_curve()

subroutine m_eos::s_reference_curve ( real(wp), intent(in) rho,
integer, intent(in) i,
real(wp), intent(out) p_ref,
real(wp), intent(out) e_ref,
real(wp), intent(out) dp_drho,
real(wp), intent(out) de_drho,
real(wp), intent(out) g0,
real(wp), intent(out) dg0 )
private

The reference curve of a state-dependent EOS at rho: p_ref, e_ref, their d/drho, and Gamma_G with its d/drho. A new family adds one case here and nothing else.

Definition at line 831 of file m_eos.fpp.f90.

Here is the caller graph for this function:

◆ s_rk4()

subroutine m_eos::s_rk4 ( integer, intent(in) kind,
integer, intent(in) i,
real(wp), intent(in) x0,
real(wp), intent(in) y0,
real(wp), intent(in) x1,
real(wp), intent(out) y )
private

Fixed-step classical RK4 for the ODE kind from (x0, y0) to x1.

Definition at line 1463 of file m_eos.fpp.f90.

Here is the call graph for this function:
Here is the caller graph for this function: