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.