MaxEigenvalueWaveSpeed Struct Reference#

DiFfRG: DiFfRG::FV::KurganovTadmor::MaxEigenvalueWaveSpeed Struct Reference
DiFfRG
Discretization Framework for functional Renormalization Group flows
DiFfRG::FV::KurganovTadmor::MaxEigenvalueWaveSpeed Struct Reference

Default wave-speed strategy. More...

#include <max_eigenvalue_wave_speed.hh>

Static Public Member Functions

template<typename NumberType , int dim, size_t n_components>
static std::array< NumberType, dim > compute_speeds (const std::array< internal::JacobianMatrix< NumberType, n_components >, dim > &J_plus, const std::array< internal::JacobianMatrix< NumberType, n_components >, dim > &J_minus)
 
template<typename NumberType , int dim, size_t n_components>
static std::array< WaveSpeedBranch, dim > select_speed_branches (const std::array< internal::JacobianMatrix< NumberType, n_components >, dim > &J_plus, const std::array< internal::JacobianMatrix< NumberType, n_components >, dim > &J_minus)
 
template<typename NumberType , int dim, size_t n_components>
static std::pair< std::array< std::array< NumberType, n_components >, dim >, std::array< std::array< NumberType, n_components >, dim > > compute_speed_derivatives (const std::array< internal::JacobianMatrix< NumberType, n_components >, dim > &J_plus, const std::array< internal::JacobianMatrix< NumberType, n_components >, dim > &J_minus, const internal::HessianTensor< NumberType, dim, n_components > &H_plus, const internal::HessianTensor< NumberType, dim, n_components > &H_minus)
 Compute da[d]/du_c analytically from J and H: a[d] = spectral_radius(J[d]) da[d]/du_c = d(spectral_radius)/dJ[d] : H[d][:][:][ c].
 
template<typename NumberType , int dim, size_t n_components>
static std::pair< std::array< std::array< NumberType, n_components >, dim >, std::array< std::array< NumberType, n_components >, dim > > compute_selected_speed_derivatives (const std::array< internal::JacobianMatrix< NumberType, n_components >, dim > &J_plus, const std::array< internal::JacobianMatrix< NumberType, n_components >, dim > &J_minus, const internal::HessianTensor< NumberType, dim, n_components > &H_plus, const internal::HessianTensor< NumberType, dim, n_components > &H_minus)
 

Static Private Member Functions

template<typename NumberType , int dim, size_t n_components>
static std::pair< std::array< NumberType, dim >, std::array< NumberType, dim > > compute_spectral_radii (const std::array< internal::JacobianMatrix< NumberType, n_components >, dim > &J_plus, const std::array< internal::JacobianMatrix< NumberType, n_components >, dim > &J_minus)
 

Detailed Description

Default wave-speed strategy.

compute_speeds: a[d] = max(spectral_radius(J_plus[d]), spectral_radius(J_minus[d])) compute_speed_derivatives: analytical derivative via eigenvector perturbation theory compute_selected_speed_derivatives: derivative for the branch selected by compute_speeds

Member Function Documentation

◆ compute_selected_speed_derivatives()

template<typename NumberType , int dim, size_t n_components>
static std::pair< std::array< std::array< NumberType, n_components >, dim >, std::array< std::array< NumberType, n_components >, dim > > DiFfRG::FV::KurganovTadmor::MaxEigenvalueWaveSpeed::compute_selected_speed_derivatives ( const std::array< internal::JacobianMatrix< NumberType, n_components >, dim > & J_plus,
const std::array< internal::JacobianMatrix< NumberType, n_components >, dim > & J_minus,
const internal::HessianTensor< NumberType, dim, n_components > & H_plus,
const internal::HessianTensor< NumberType, dim, n_components > & H_minus )
inlinestatic

◆ compute_spectral_radii()

template<typename NumberType , int dim, size_t n_components>
static std::pair< std::array< NumberType, dim >, std::array< NumberType, dim > > DiFfRG::FV::KurganovTadmor::MaxEigenvalueWaveSpeed::compute_spectral_radii ( const std::array< internal::JacobianMatrix< NumberType, n_components >, dim > & J_plus,
const std::array< internal::JacobianMatrix< NumberType, n_components >, dim > & J_minus )
inlinestaticprivate

◆ compute_speed_derivatives()

template<typename NumberType , int dim, size_t n_components>
static std::pair< std::array< std::array< NumberType, n_components >, dim >, std::array< std::array< NumberType, n_components >, dim > > DiFfRG::FV::KurganovTadmor::MaxEigenvalueWaveSpeed::compute_speed_derivatives ( const std::array< internal::JacobianMatrix< NumberType, n_components >, dim > & J_plus,
const std::array< internal::JacobianMatrix< NumberType, n_components >, dim > & J_minus,
const internal::HessianTensor< NumberType, dim, n_components > & H_plus,
const internal::HessianTensor< NumberType, dim, n_components > & H_minus )
inlinestatic

Compute da[d]/du_c analytically from J and H: a[d] = spectral_radius(J[d]) da[d]/du_c = d(spectral_radius)/dJ[d] : H[d][:][:][ c].

For n_components == 1: a[d] = |J[d][0][0]|, da/du_c = sign(J[d][0][0]) * H[d][0][0][c]

For n_components > 1: Find the dominant eigenvalue lambda* and its right/left eigenvectors v, w (Eigen EigenSolver). Then by first-order eigenvalue perturbation theory: da[d]/du_c = sign(Re(lambda*)) * sum_{i,j} Re(w[i]) * Re(v[j]) * H[d][i][j][c] / Re(w . v)

Returns
{da_plus, da_minus}

◆ compute_speeds()

template<typename NumberType , int dim, size_t n_components>
static std::array< NumberType, dim > DiFfRG::FV::KurganovTadmor::MaxEigenvalueWaveSpeed::compute_speeds ( const std::array< internal::JacobianMatrix< NumberType, n_components >, dim > & J_plus,
const std::array< internal::JacobianMatrix< NumberType, n_components >, dim > & J_minus )
inlinestatic

◆ select_speed_branches()

template<typename NumberType , int dim, size_t n_components>
static std::array< WaveSpeedBranch, dim > DiFfRG::FV::KurganovTadmor::MaxEigenvalueWaveSpeed::select_speed_branches ( const std::array< internal::JacobianMatrix< NumberType, n_components >, dim > & J_plus,
const std::array< internal::JacobianMatrix< NumberType, n_components >, dim > & J_minus )
inlinestatic

The documentation for this struct was generated from the following file: