3 #include "viscous_numerical_flux.hpp"     6 namespace NumericalFlux {
     8 using AllParam = Parameters::AllParameters;
    11 template<
int nstate, 
typename real>
    12 std::array<real, nstate> array_average(
    13     const std::array<real, nstate> &array1,
    14     const std::array<real, nstate> &array2)
    16     std::array<real,nstate> array_average;
    17     for (
int s=0; s<nstate; s++) {
    18         array_average[s] = 0.5*(array1[s] + array2[s]);
    23 template<
int nstate, 
int dim, 
typename real>
    24 std::array<dealii::Tensor<1,dim,real>, nstate> array_average(
    25     const std::array<dealii::Tensor<1,dim,real>,nstate> &array1,
    26     const std::array<dealii::Tensor<1,dim,real>,nstate> &array2)
    28     std::array<dealii::Tensor<1,dim,real>,nstate> array_average;
    29     for (
int s=0; s<nstate; s++) {
    30         for (
int d=0; d<dim; d++) {
    31             array_average[s][d] = 0.5*(array1[s][d] + array2[s][d]);
    37 template<
int dim, 
int nstate, 
typename real>
    38 std::array<dealii::Tensor<1,dim,real>,nstate> array_jump(
    39     const std::array<real, nstate> &array1,
    40     const std::array<real, nstate> &array2,
    41     const dealii::Tensor<1,dim,real> &normal1)
    43     std::array<dealii::Tensor<1,dim,real>,nstate> array_jump;
    44     for (
int s=0; s<nstate; s++) {
    45         for (
int d=0; d<dim; d++) {
    46          array_jump[s][d] = (array1[s] - array2[s])*normal1[d];
    52 template<
int dim, 
int nstate, 
typename real>
    55     const std::array<real, nstate> &soln_int,
    56     const std::array<real, nstate> &soln_ext,
    57     const dealii::Tensor<1,dim,real> &)
 const    59     std::array<real,nstate> soln_avg = array_average<nstate,real>(soln_int, soln_ext);
    64 template<
int dim, 
int nstate, 
typename real>
    67     const dealii::types::global_dof_index current_cell_index,
    68     const dealii::types::global_dof_index neighbor_cell_index,
    69     const real artificial_diss_coeff_int,
    70     const real artificial_diss_coeff_ext,
    71     const std::array<real, nstate> &soln_int,
    72     const std::array<real, nstate> &soln_ext,
    73     const std::array<dealii::Tensor<1,dim,real>, nstate> &soln_grad_int,
    74     const std::array<dealii::Tensor<1,dim,real>, nstate> &soln_grad_ext,
    75     const dealii::Tensor<1,dim,real> &normal_int,
    77     const bool on_boundary)
 const    79     using ArrayTensor1 = std::array<dealii::Tensor<1,dim,real>, nstate>;
    85         const std::array<real, nstate> soln_bc = soln_ext;
    86         const std::array<dealii::Tensor<1,dim,real>, nstate> soln_grad_bc = soln_grad_int;
    88         real artificial_diss_coeff_bc = artificial_diss_coeff_int;
    89         const dealii::types::global_dof_index boundary_cell_index = current_cell_index;
    91         return evaluate_auxiliary_flux ( current_cell_index, boundary_cell_index,
    92                                          artificial_diss_coeff_int, artificial_diss_coeff_bc,
    94                                          soln_grad_int, soln_grad_bc,
    99     ArrayTensor1 phys_flux_int, phys_flux_ext;
   102     phys_flux_int = pde_physics->dissipative_flux (soln_int, soln_grad_int, current_cell_index);
   103     phys_flux_ext = pde_physics->dissipative_flux (soln_ext, soln_grad_ext, neighbor_cell_index);
   105     ArrayTensor1 phys_flux_avg = array_average<nstate,dim,real>(phys_flux_int, phys_flux_ext);
   107     std::array<real,nstate> auxiliary_flux_dot_n;
   108     for (
int s=0; s<nstate; s++) {
   111         for (
int d=0; d<dim; ++d) {
   112             phys += (phys_flux_avg[s][d]) * normal_int[d];
   114         auxiliary_flux_dot_n[s] = phys;
   117     if (artificial_diss_coeff_int > 1e-13 || artificial_diss_coeff_ext > 1e-13) {
   118         ArrayTensor1 artificial_phys_flux_int, artificial_phys_flux_ext;
   121         artificial_phys_flux_int = artificial_dissip->calc_artificial_dissipation_flux (soln_int, soln_grad_int, artificial_diss_coeff_int);
   122         artificial_phys_flux_ext = artificial_dissip->calc_artificial_dissipation_flux (soln_ext, soln_grad_ext, artificial_diss_coeff_ext);
   123         ArrayTensor1 artificial_phys_flux_avg = array_average<nstate,dim,real>(artificial_phys_flux_int, artificial_phys_flux_ext);
   126         ArrayTensor1 soln_jump     = array_jump<dim,nstate,real>(soln_int, soln_ext, normal_int);
   127         ArrayTensor1 artificial_A_jumpu_int, artificial_A_jumpu_ext;
   128         artificial_A_jumpu_int = artificial_dissip->calc_artificial_dissipation_flux (soln_int, soln_jump, artificial_diss_coeff_int);
   129         artificial_A_jumpu_ext = artificial_dissip->calc_artificial_dissipation_flux (soln_ext, soln_jump, artificial_diss_coeff_ext);
   130         const ArrayTensor1 artificial_A_jumpu_avg = array_average<nstate,dim,real>(artificial_A_jumpu_int, artificial_A_jumpu_ext);
   132         for (
int s=0; s<nstate; s++) {
   135             for (
int d=0; d<dim; ++d) {
   136                 arti += (artificial_phys_flux_avg[s][d] - penalty * artificial_A_jumpu_avg[s][d]) * normal_int[d];
   138             auxiliary_flux_dot_n[s] += arti;
   142     return auxiliary_flux_dot_n;
   145 template<
int dim, 
int nstate, 
typename real>
   148     const std::array<real, nstate> &soln_int,
   149     const std::array<real, nstate> &soln_ext,
   150     const dealii::Tensor<1,dim,real> &)
 const   152     std::array<real,nstate> soln_avg = array_average<nstate,real>(soln_int, soln_ext);
   157 template<
int dim, 
int nstate, 
typename real>
   160     const dealii::types::global_dof_index current_cell_index,
   161     const dealii::types::global_dof_index neighbor_cell_index,
   162     const real artificial_diss_coeff_int,
   163     const real artificial_diss_coeff_ext,
   164     const std::array<real, nstate> &soln_int,
   165     const std::array<real, nstate> &soln_ext,
   166     const std::array<dealii::Tensor<1,dim,real>, nstate> &soln_grad_int,
   167     const std::array<dealii::Tensor<1,dim,real>, nstate> &soln_grad_ext,
   168     const dealii::Tensor<1,dim,real> &normal_int,
   170     const bool on_boundary)
 const   172     using ArrayTensor1 = std::array<dealii::Tensor<1,dim,real>, nstate>;
   178         const std::array<real, nstate> soln_bc = soln_ext;
   179         const std::array<dealii::Tensor<1,dim,real>, nstate> soln_grad_bc = soln_grad_int;
   181         real artificial_diss_coeff_bc = artificial_diss_coeff_int;
   182         const dealii::types::global_dof_index boundary_cell_index = current_cell_index;
   184         return evaluate_auxiliary_flux ( current_cell_index, boundary_cell_index,
   185                                          artificial_diss_coeff_int, artificial_diss_coeff_bc,
   187                                          soln_grad_int, soln_grad_bc,
   192     ArrayTensor1 phys_flux_int, phys_flux_ext;
   195     phys_flux_int = pde_physics->dissipative_flux (soln_int, soln_grad_int, current_cell_index);
   196     phys_flux_ext = pde_physics->dissipative_flux (soln_ext, soln_grad_ext, neighbor_cell_index);
   198     ArrayTensor1 phys_flux_avg = array_average<nstate,dim,real>(phys_flux_int, phys_flux_ext);
   201     ArrayTensor1 soln_jump     = array_jump<dim,nstate,real>(soln_int, soln_ext, normal_int);
   202     ArrayTensor1 A_jumpu_int, A_jumpu_ext;
   203     A_jumpu_int = pde_physics->dissipative_flux (soln_int, soln_jump, current_cell_index);
   204     A_jumpu_ext = pde_physics->dissipative_flux (soln_ext, soln_jump, neighbor_cell_index);
   205     const ArrayTensor1 A_jumpu_avg = array_average<nstate,dim,real>(A_jumpu_int, A_jumpu_ext);
   207     std::array<real,nstate> auxiliary_flux_dot_n;
   208     for (
int s=0; s<nstate; s++) {
   211         for (
int d=0; d<dim; ++d) {
   212             phys += (phys_flux_avg[s][d] - penalty * A_jumpu_avg[s][d]) * normal_int[d];
   214         auxiliary_flux_dot_n[s] = phys;
   217     if (artificial_diss_coeff_int > 1e-13 || artificial_diss_coeff_ext > 1e-13) {
   218         ArrayTensor1 artificial_phys_flux_int, artificial_phys_flux_ext;
   221         artificial_phys_flux_int = artificial_dissip->calc_artificial_dissipation_flux (soln_int, soln_grad_int, artificial_diss_coeff_int);
   222         artificial_phys_flux_ext = artificial_dissip->calc_artificial_dissipation_flux (soln_ext, soln_grad_ext, artificial_diss_coeff_ext);
   223         ArrayTensor1 artificial_phys_flux_avg = array_average<nstate,dim,real>(artificial_phys_flux_int, artificial_phys_flux_ext);
   226         ArrayTensor1 artificial_A_jumpu_int, artificial_A_jumpu_ext;
   227         artificial_A_jumpu_int = artificial_dissip->calc_artificial_dissipation_flux (soln_int, soln_jump, artificial_diss_coeff_int);
   228         artificial_A_jumpu_ext = artificial_dissip->calc_artificial_dissipation_flux (soln_ext, soln_jump, artificial_diss_coeff_ext);
   229         const ArrayTensor1 artificial_A_jumpu_avg = array_average<nstate,dim,real>(artificial_A_jumpu_int, artificial_A_jumpu_ext);
   231         for (
int s=0; s<nstate; s++) {
   234             for (
int d=0; d<dim; ++d) {
   235                 arti += (artificial_phys_flux_avg[s][d] - penalty * artificial_A_jumpu_avg[s][d]) * normal_int[d];
   237             auxiliary_flux_dot_n[s] += arti;
   241     return auxiliary_flux_dot_n;
   244 template<
int dim, 
int nstate, 
typename real>
   247     const std::array<real, nstate> &soln_int,
   248     const std::array<real, nstate> &soln_ext,
   249     const dealii::Tensor<1,dim,real> &)
 const   251     std::array<real,nstate> soln_avg = array_average<nstate,real>(soln_int, soln_ext);
   256 template<
int dim, 
int nstate, 
typename real>
   259     const dealii::types::global_dof_index current_cell_index,
   260     const dealii::types::global_dof_index neighbor_cell_index,
   261     const real artificial_diss_coeff_int,
   262     const real artificial_diss_coeff_ext,
   263     const std::array<real, nstate> &soln_int,
   264     const std::array<real, nstate> &soln_ext,
   265     const std::array<dealii::Tensor<1,dim,real>, nstate> &soln_grad_int,
   266     const std::array<dealii::Tensor<1,dim,real>, nstate> &soln_grad_ext,
   267     const dealii::Tensor<1,dim,real> &normal_int,
   269     const bool on_boundary)
 const   271     using ArrayTensor1 = std::array<dealii::Tensor<1,dim,real>, nstate>;
   291     ArrayTensor1 phys_flux_int, phys_flux_ext;
   294     phys_flux_int = pde_physics->dissipative_flux (soln_int, soln_grad_int, current_cell_index);
   295     phys_flux_ext = pde_physics->dissipative_flux (soln_ext, soln_grad_ext, neighbor_cell_index);
   297     ArrayTensor1 phys_flux_avg = array_average<nstate,dim,real>(phys_flux_int, phys_flux_ext);
   299     std::array<real,nstate> auxiliary_flux_dot_n;
   300     for (
int s=0; s<nstate; s++) {
   302         for (
int d=0; d<dim; ++d) {
   303             phys += phys_flux_avg[s][d] * normal_int[d];
   305         auxiliary_flux_dot_n[s] = phys;
   308     if (artificial_diss_coeff_int > 1e-13 || artificial_diss_coeff_ext > 1e-13) {
   309         ArrayTensor1 artificial_phys_flux_int, artificial_phys_flux_ext;
   312         artificial_phys_flux_int = artificial_dissip->calc_artificial_dissipation_flux (soln_int, soln_grad_int, artificial_diss_coeff_int);
   313         artificial_phys_flux_ext = artificial_dissip->calc_artificial_dissipation_flux (soln_ext, soln_grad_ext, artificial_diss_coeff_ext);
   314         ArrayTensor1 artificial_phys_flux_avg = array_average<nstate,dim,real>(artificial_phys_flux_int, artificial_phys_flux_ext);
   316         for (
int s=0; s<nstate; s++) {
   318             for (
int d=0; d<dim; ++d) {
   319                 arti += artificial_phys_flux_avg[s][d] * normal_int[d];
   321             auxiliary_flux_dot_n[s] += arti;
   325     return auxiliary_flux_dot_n;
 std::array< real, nstate > evaluate_auxiliary_flux(const dealii::types::global_dof_index current_cell_index, const dealii::types::global_dof_index neighbor_cell_index, const real artificial_diss_coeff_int, const real artificial_diss_coeff_ext, const std::array< real, nstate > &soln_int, const std::array< real, nstate > &soln_ext, const std::array< dealii::Tensor< 1, dim, real >, nstate > &soln_grad_int, const std::array< dealii::Tensor< 1, dim, real >, nstate > &soln_grad_ext, const dealii::Tensor< 1, dim, real > &normal_int, const real &penalty, const bool on_boundary=false) const override
Evaluate auxiliary flux at the interface. 
std::array< real, nstate > evaluate_solution_flux(const std::array< real, nstate > &soln_int, const std::array< real, nstate > &soln_ext, const dealii::Tensor< 1, dim, real > &normal_int) const override
Evaluate solution flux at the interface. 
Base class of numerical flux associated with dissipation. 
Files for the baseline physics. 
std::array< real, nstate > evaluate_solution_flux(const std::array< real, nstate > &soln_int, const std::array< real, nstate > &soln_ext, const dealii::Tensor< 1, dim, real > &normal_int) const override
Evaluate solution flux at the interface. 
virtual std::array< real, nstate > evaluate_auxiliary_flux(const dealii::types::global_dof_index current_cell_index, const dealii::types::global_dof_index neighbor_cell_index, const real artificial_diss_coeff_int, const real artificial_diss_coeff_ext, const std::array< real, nstate > &soln_int, const std::array< real, nstate > &soln_ext, const std::array< dealii::Tensor< 1, dim, real >, nstate > &soln_grad_int, const std::array< dealii::Tensor< 1, dim, real >, nstate > &soln_grad_ext, const dealii::Tensor< 1, dim, real > &normal_int, const real &penalty, const bool on_boundary=false) const =0
Auxiliary flux at the interface. 
std::array< real, nstate > evaluate_auxiliary_flux(const dealii::types::global_dof_index current_cell_index, const dealii::types::global_dof_index neighbor_cell_index, const real artificial_diss_coeff_int, const real artificial_diss_coeff_ext, const std::array< real, nstate > &soln_int, const std::array< real, nstate > &soln_ext, const std::array< dealii::Tensor< 1, dim, real >, nstate > &soln_grad_int, const std::array< dealii::Tensor< 1, dim, real >, nstate > &soln_grad_ext, const dealii::Tensor< 1, dim, real > &normal_int, const real &penalty, const bool on_boundary=false) const override
Evaluate auxiliary flux at the interface. 
Symmetric interior penalty method. 
std::array< real, nstate > evaluate_solution_flux(const std::array< real, nstate > &soln_int, const std::array< real, nstate > &soln_ext, const dealii::Tensor< 1, dim, real > &normal_int) const override
Evaluate solution flux at the interface.