SpECTRE  2021.08.02
NewtonianEuler::NumericalFluxes::Hllc< Dim, Frame > Struct Template Reference

Compute the HLLC numerical flux. More...

#include <Hllc.hpp>

Classes

struct  LargestIngoingSpeed
 Estimate for one of the signal speeds. More...
 
struct  LargestOutgoingSpeed
 Estimate for the other signal speed. More...
 
struct  NormalVelocity
 The normal component of the velocity. More...
 

Public Types

using char_speeds_tag = Tags::CharacteristicSpeeds< Dim >
 
using options = tmpl::list<>
 
using variables_tags = tmpl::list< Tags::MassDensityCons, Tags::MomentumDensity< Dim >, Tags::EnergyDensity >
 
using package_field_tags = tmpl::list< ::Tags::NormalDotFlux< Tags::MassDensityCons >, ::Tags::NormalDotFlux< Tags::MomentumDensity< Dim, Frame > >, ::Tags::NormalDotFlux< Tags::EnergyDensity >, Tags::MassDensityCons, Tags::MomentumDensity< Dim, Frame >, Tags::EnergyDensity, Tags::Pressure< DataVector >, ::Tags::Normalized< domain::Tags::UnnormalizedFaceNormal< Dim, Frame > >, NormalVelocity, LargestIngoingSpeed, LargestOutgoingSpeed >
 
using package_extra_tags = tmpl::list<>
 
using argument_tags = tmpl::list< ::Tags::NormalDotFlux< Tags::MassDensityCons >, ::Tags::NormalDotFlux< Tags::MomentumDensity< Dim, Frame > >, ::Tags::NormalDotFlux< Tags::EnergyDensity >, Tags::MassDensityCons, Tags::MomentumDensity< Dim, Frame >, Tags::EnergyDensity, Tags::Velocity< DataVector, Dim, Frame >, Tags::Pressure< DataVector >, char_speeds_tag, ::Tags::Normalized< domain::Tags::UnnormalizedFaceNormal< Dim, Frame > > >
 

Public Member Functions

void pup (PUP::er &) noexcept
 
void package_data (gsl::not_null< Scalar< DataVector > * > packaged_n_dot_f_mass_density, gsl::not_null< tnsr::I< DataVector, Dim, Frame > * > packaged_n_dot_f_momentum_density, gsl::not_null< Scalar< DataVector > * > packaged_n_dot_f_energy_density, gsl::not_null< Scalar< DataVector > * > packaged_mass_density, gsl::not_null< tnsr::I< DataVector, Dim, Frame > * > packaged_momentum_density, gsl::not_null< Scalar< DataVector > * > packaged_energy_density, gsl::not_null< Scalar< DataVector > * > packaged_pressure, gsl::not_null< tnsr::i< DataVector, Dim, Frame > * > packaged_face_normal, gsl::not_null< Scalar< DataVector > * > packaged_normal_velocity, gsl::not_null< Scalar< DataVector > * > packaged_largest_ingoing_speed, gsl::not_null< Scalar< DataVector > * > packaged_largest_outgoing_speed, const Scalar< DataVector > &normal_dot_flux_mass_density, const tnsr::I< DataVector, Dim, Frame > &normal_dot_flux_momentum_density, const Scalar< DataVector > &normal_dot_flux_energy_density, const Scalar< DataVector > &mass_density, const tnsr::I< DataVector, Dim, Frame > &momentum_density, const Scalar< DataVector > &energy_density, const tnsr::I< DataVector, Dim, Frame > &velocity, const Scalar< DataVector > &pressure, const typename char_speeds_tag::type &characteristic_speeds, const tnsr::i< DataVector, Dim, Frame > &interface_unit_normal) const noexcept
 
void operator() (gsl::not_null< Scalar< DataVector > * > normal_dot_numerical_flux_mass_density, gsl::not_null< tnsr::I< DataVector, Dim, Frame > * > normal_dot_numerical_flux_momentum_density, gsl::not_null< Scalar< DataVector > * > normal_dot_numerical_flux_energy_density, const Scalar< DataVector > &normal_dot_flux_mass_density_int, const tnsr::I< DataVector, Dim, Frame > &normal_dot_flux_momentum_density_int, const Scalar< DataVector > &normal_dot_flux_energy_density_int, const Scalar< DataVector > &mass_density_int, const tnsr::I< DataVector, Dim, Frame > &momentum_density_int, const Scalar< DataVector > &energy_density_int, const Scalar< DataVector > &pressure_int, const tnsr::i< DataVector, Dim, Frame > &interface_unit_normal, const Scalar< DataVector > &normal_velocity_int, const Scalar< DataVector > &largest_ingoing_speed_int, const Scalar< DataVector > &largest_outgoing_speed_int, const Scalar< DataVector > &minus_normal_dot_flux_mass_density_ext, const tnsr::I< DataVector, Dim, Frame > &minus_normal_dot_flux_momentum_density_ext, const Scalar< DataVector > &minus_normal_dot_flux_energy_density_ext, const Scalar< DataVector > &mass_density_ext, const tnsr::I< DataVector, Dim, Frame > &momentum_density_ext, const Scalar< DataVector > &energy_density_ext, const Scalar< DataVector > &pressure_ext, const tnsr::i< DataVector, Dim, Frame > &minus_interface_unit_normal, const Scalar< DataVector > &minus_normal_velocity_ext, const Scalar< DataVector > &minus_largest_outgoing_speed_ext, const Scalar< DataVector > &minus_largest_ingoing_speed_ext) const noexcept
 

Static Public Attributes

static constexpr Options::String help
 

Detailed Description

template<size_t Dim, typename Frame>
struct NewtonianEuler::NumericalFluxes::Hllc< Dim, Frame >

Compute the HLLC numerical flux.

Class implementing the HLLC flux for the Newtonian Euler equations, originally introduced by E. F. Toro, M. Spruce and W. Speares [107]. Let \(F^k = [F^k(\rho), F^k(S^i), F^k(e)]^T\) be the fluxes of the conservative quantities \(U = [\rho, S^i, e]^T\) (see NewtonianEuler::ComputeFluxes). Denoting \(v_n = n_k v^k\) and \(F = n_kF^k\), where \(v^k\) is the velocity and \(n_k\) is the interface unit normal, the HLLC flux is

\begin{align*} G_\text{HLLC} = \begin{cases} F_\text{int}, & S_\text{min} > 0, \\ G_{*\text{int}}, & S_\text{min} \leq 0\quad\text{and}\quad S_* > 0, \\ G_{*\text{ext}}, & S_* \leq 0\quad\text{and}\quad S_\text{max} > 0, \\ F_\text{ext}, & S_\text{max} \leq 0, \end{cases} \end{align*}

where

\begin{align*} G_{*\text{int}} &= \frac{S_*\left(F_\text{int} - S_\text{min}U_\text{int}\right) - S_\text{min} p_{*\text{int}}D_*}{S_* - S_\text{min}},\\ G_{*\text{ext}} &= \frac{S_*\left(F_\text{ext} - S_\text{max}U_\text{ext}\right) - S_\text{max} p_{*\text{ext}}D_*}{S_* - S_\text{max}}, \end{align*}

with

\begin{align*} p_{*\text{int}} &\equiv p_\text{int} + \rho_\text{int} \left[(v_n)_\text{int} - S_\text{min}\right] \left[(v_n)_\text{int} - S_*\right], \\ p_{*\text{ext}} &\equiv p_\text{ext} + \rho_\text{ext} \left[(v_n)_\text{ext} - S_\text{max}\right] \left[(v_n)_\text{ext} - S_*\right], \\ S_* &\equiv \frac{p_\text{int} + F(\rho)_\text{int}\left[(v_n)_\text{int} - S_\text{min}\right] - p_\text{ext} - F(\rho)_\text{ext}\left[(v_n)_\text{ext} - S_\text{max}\right]}{F(\rho)_\text{int} - \rho_\text{int}S_\text{min} - F(\rho)_\text{ext} + \rho_\text{ext}S_\text{max}},\\ D_* &\equiv \left[\begin{array}{c} 0\\ n^i\\ S_* \end{array}\right], \end{align*}

and \(S_\text{min}\) and \(S_\text{max}\) are estimates of the minimum and maximum signal speeds bounding the ingoing and outgoing wavespeeds that arise when solving the Riemann problem. One requires \(S_\text{min} \leq S_* \leq S_\text{max}\). As estimates, we use

\begin{align*} S_\text{min} &= \text{min}\left(\{\lambda_\text{int}\},\{\lambda_\text{ext}\}, 0\right)\\ S_\text{max} &= \text{max}\left(\{\lambda_\text{int}\},\{\lambda_\text{ext}\}, 0\right), \end{align*}

where \(\{\lambda\}\) is the set of all the characteristic speeds along a given normal. This way, the definition of \(G_\text{HLLC}\) simplifies to

\begin{align*} G_\text{HLLC} = \begin{cases} \dfrac{S_*\left(F_\text{int} - S_\text{min}U_\text{int}\right) - S_\text{min} p_{*\text{int}}D_*}{S_* - S_\text{min}}, & S_* > 0, \\ \dfrac{S_*\left(F_\text{ext} - S_\text{max}U_\text{ext}\right) - S_\text{max} p_{*\text{ext}}D_*}{S_* - S_\text{max}}, & S_* \leq 0. \\ \end{cases} \end{align*}

Warning
The HLLC flux implemented here does not incorporate any cure for the Carbuncle phenomenon or other shock instabilities reported in the literature. Prefer using another numerical flux in more than 1-d.

Member Data Documentation

◆ help

template<size_t Dim, typename Frame >
constexpr Options::String NewtonianEuler::NumericalFluxes::Hllc< Dim, Frame >::help
staticconstexpr
Initial value:
= {
"Compute the HLLC flux for the Newtonian Euler system."}