|
| 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) |
| |
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
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}