1 #include <boost/preprocessor/seq/for_each.hpp> 5 #include "viscous_numerical_flux.hpp" 8 namespace NumericalFlux {
10 using AllParam = Parameters::AllParameters;
13 template<
int nstate,
typename real>
14 std::array<real, nstate> array_average(
15 const std::array<real, nstate> &array1,
16 const std::array<real, nstate> &array2)
18 std::array<real,nstate> array_average;
19 for (
int s=0; s<nstate; s++) {
20 array_average[s] = 0.5*(array1[s] + array2[s]);
25 template<
int nstate,
int dim,
typename real>
26 std::array<dealii::Tensor<1,dim,real>, nstate> array_average(
27 const std::array<dealii::Tensor<1,dim,real>,nstate> &array1,
28 const std::array<dealii::Tensor<1,dim,real>,nstate> &array2)
30 std::array<dealii::Tensor<1,dim,real>,nstate> array_average;
31 for (
int s=0; s<nstate; s++) {
32 for (
int d=0; d<dim; d++) {
33 array_average[s][d] = 0.5*(array1[s][d] + array2[s][d]);
39 template<
int dim,
int nspecies,
int nstate,
typename real>
40 std::array<dealii::Tensor<1,dim,real>,nstate> array_jump(
41 const std::array<real, nstate> &array1,
42 const std::array<real, nstate> &array2,
43 const dealii::Tensor<1,dim,real> &normal1)
45 std::array<dealii::Tensor<1,dim,real>,nstate> array_jump;
46 for (
int s=0; s<nstate; s++) {
47 for (
int d=0; d<dim; d++) {
48 array_jump[s][d] = (array1[s] - array2[s])*normal1[d];
54 template<
int dim,
int nspecies,
int nstate,
typename real>
57 const std::array<real, nstate> &soln_int,
58 const std::array<real, nstate> &soln_ext,
59 const dealii::Tensor<1,dim,real> &)
const 61 std::array<real,nstate> soln_avg = array_average<nstate,real>(soln_int, soln_ext);
66 template<
int dim,
int nspecies,
int nstate,
typename real>
69 const dealii::types::global_dof_index current_cell_index,
70 const dealii::types::global_dof_index neighbor_cell_index_,
71 const real artificial_diss_coeff_int,
72 const real artificial_diss_coeff_ext_,
73 const std::array<real, nstate> &soln_int,
74 const std::array<real, nstate> &soln_ext,
75 const std::array<dealii::Tensor<1,dim,real>, nstate> &soln_grad_int,
76 const std::array<dealii::Tensor<1,dim,real>, nstate> &soln_grad_ext_,
77 const std::array<real, nstate> &filtered_soln_int,
78 const std::array<real, nstate> &filtered_soln_ext,
79 const std::array<dealii::Tensor<1,dim,real>, nstate> &filtered_soln_grad_int,
80 const std::array<dealii::Tensor<1,dim,real>, nstate> &filtered_soln_grad_ext_,
81 const dealii::Tensor<1,dim,real> &normal_int,
83 const bool on_boundary,
84 const int boundary_type)
const 86 using ArrayTensor1 = std::array<dealii::Tensor<1,dim,real>, nstate>;
88 real artificial_diss_coeff_ext;
89 dealii::types::global_dof_index neighbor_cell_index;
90 std::array<dealii::Tensor<1,dim,real>, nstate> soln_grad_ext;
91 std::array<dealii::Tensor<1,dim,real>, nstate> filtered_soln_grad_ext;
96 artificial_diss_coeff_ext = artificial_diss_coeff_int;
97 neighbor_cell_index = current_cell_index;
98 soln_grad_ext = soln_grad_int;
100 filtered_soln_grad_ext = filtered_soln_grad_int;
102 artificial_diss_coeff_ext = artificial_diss_coeff_ext_;
103 neighbor_cell_index = neighbor_cell_index_;
104 soln_grad_ext = soln_grad_ext_;
105 filtered_soln_grad_ext = filtered_soln_grad_ext_;
109 std::array<real,nstate> phys_flux_int_dot_n, phys_flux_ext_dot_n;
110 phys_flux_int_dot_n = pde_physics->dissipative_flux_dot_normal (soln_int, soln_grad_int, filtered_soln_int, filtered_soln_grad_int, on_boundary, current_cell_index, normal_int, boundary_type);
111 phys_flux_ext_dot_n = pde_physics->dissipative_flux_dot_normal (soln_ext, soln_grad_ext, filtered_soln_ext, filtered_soln_grad_ext, on_boundary, neighbor_cell_index, normal_int, boundary_type);
112 const std::array<real,nstate> phys_flux_avg_dot_n = array_average<nstate,real>(phys_flux_int_dot_n,phys_flux_ext_dot_n);
114 std::array<real,nstate> auxiliary_flux_dot_n = phys_flux_avg_dot_n;
116 if (artificial_diss_coeff_int > 1e-13 || artificial_diss_coeff_ext > 1e-13) {
117 ArrayTensor1 artificial_phys_flux_int, artificial_phys_flux_ext;
120 artificial_phys_flux_int = artificial_dissip->calc_artificial_dissipation_flux (soln_int, soln_grad_int, artificial_diss_coeff_int);
121 artificial_phys_flux_ext = artificial_dissip->calc_artificial_dissipation_flux (soln_ext, soln_grad_ext, artificial_diss_coeff_ext);
122 ArrayTensor1 artificial_phys_flux_avg = array_average<nstate,dim,real>(artificial_phys_flux_int, artificial_phys_flux_ext);
125 ArrayTensor1 soln_jump = array_jump<dim,nspecies,nstate,real>(soln_int, soln_ext, normal_int);
126 ArrayTensor1 artificial_A_jumpu_int, artificial_A_jumpu_ext;
127 artificial_A_jumpu_int = artificial_dissip->calc_artificial_dissipation_flux (soln_int, soln_jump, artificial_diss_coeff_int);
128 artificial_A_jumpu_ext = artificial_dissip->calc_artificial_dissipation_flux (soln_ext, soln_jump, artificial_diss_coeff_ext);
129 const ArrayTensor1 artificial_A_jumpu_avg = array_average<nstate,dim,real>(artificial_A_jumpu_int, artificial_A_jumpu_ext);
131 for (
int s=0; s<nstate; s++) {
134 for (
int d=0; d<dim; ++d) {
135 arti += (artificial_phys_flux_avg[s][d] - penalty * artificial_A_jumpu_avg[s][d]) * normal_int[d];
137 auxiliary_flux_dot_n[s] += arti;
141 return auxiliary_flux_dot_n;
144 template<
int dim,
int nspecies,
int nstate,
typename real>
147 const std::array<real, nstate> &soln_int,
148 const std::array<real, nstate> &soln_ext,
149 const dealii::Tensor<1,dim,real> &)
const 151 std::array<real,nstate> soln_avg = array_average<nstate,real>(soln_int, soln_ext);
156 template<
int dim,
int nspecies,
int nstate,
typename real>
159 const dealii::types::global_dof_index current_cell_index,
160 const dealii::types::global_dof_index neighbor_cell_index_,
161 const real artificial_diss_coeff_int,
162 const real artificial_diss_coeff_ext_,
163 const std::array<real, nstate> &soln_int,
164 const std::array<real, nstate> &soln_ext,
165 const std::array<dealii::Tensor<1,dim,real>, nstate> &soln_grad_int,
166 const std::array<dealii::Tensor<1,dim,real>, nstate> &soln_grad_ext_,
167 const std::array<real, nstate> &filtered_soln_int,
168 const std::array<real, nstate> &filtered_soln_ext,
169 const std::array<dealii::Tensor<1,dim,real>, nstate> &filtered_soln_grad_int,
170 const std::array<dealii::Tensor<1,dim,real>, nstate> &filtered_soln_grad_ext_,
171 const dealii::Tensor<1,dim,real> &normal_int,
173 const bool on_boundary,
174 const int boundary_type)
const 176 using ArrayTensor1 = std::array<dealii::Tensor<1,dim,real>, nstate>;
178 real artificial_diss_coeff_ext;
179 dealii::types::global_dof_index neighbor_cell_index;
180 std::array<dealii::Tensor<1,dim,real>, nstate> soln_grad_ext;
181 std::array<dealii::Tensor<1,dim,real>, nstate> filtered_soln_grad_ext;
186 artificial_diss_coeff_ext = artificial_diss_coeff_int;
187 neighbor_cell_index = current_cell_index;
189 soln_grad_ext = soln_grad_ext_;
191 filtered_soln_grad_ext = filtered_soln_grad_ext_;
193 artificial_diss_coeff_ext = artificial_diss_coeff_ext_;
194 neighbor_cell_index = neighbor_cell_index_;
195 soln_grad_ext = soln_grad_ext_;
196 filtered_soln_grad_ext = filtered_soln_grad_ext_;
200 std::array<real,nstate> phys_flux_int_dot_n, phys_flux_ext_dot_n;
201 phys_flux_int_dot_n = pde_physics->dissipative_flux_dot_normal (soln_int, soln_grad_int, filtered_soln_int, filtered_soln_grad_int, on_boundary, current_cell_index, normal_int, boundary_type);
202 phys_flux_ext_dot_n = pde_physics->dissipative_flux_dot_normal (soln_ext, soln_grad_ext, filtered_soln_ext, filtered_soln_grad_ext, on_boundary, neighbor_cell_index, normal_int, boundary_type);
203 const std::array<real,nstate> phys_flux_avg_dot_n = array_average<nstate,real>(phys_flux_int_dot_n,phys_flux_ext_dot_n);
206 ArrayTensor1 soln_jump = array_jump<dim,nspecies,nstate,real>(soln_int, soln_ext, normal_int);
207 ArrayTensor1 filtered_soln_jump = array_jump<dim,nspecies,nstate,real>(filtered_soln_int, filtered_soln_ext, normal_int);
208 std::array<real,nstate> A_jumpu_int_dot_n, A_jumpu_ext_dot_n;
209 A_jumpu_int_dot_n = pde_physics->dissipative_flux_dot_normal (soln_int, soln_jump, filtered_soln_int, filtered_soln_jump, on_boundary, current_cell_index, normal_int, boundary_type);
210 A_jumpu_ext_dot_n = pde_physics->dissipative_flux_dot_normal (soln_ext, soln_jump, filtered_soln_ext, filtered_soln_jump, on_boundary, neighbor_cell_index, normal_int, boundary_type);
211 const std::array<real,nstate> A_jumpu_avg_dot_n = array_average<nstate,real>(A_jumpu_int_dot_n, A_jumpu_ext_dot_n);
213 std::array<real,nstate> auxiliary_flux_dot_n;
214 for (
int s=0; s<nstate; s++) {
215 auxiliary_flux_dot_n[s] = phys_flux_avg_dot_n[s] - penalty * A_jumpu_avg_dot_n[s];
218 if (artificial_diss_coeff_int > 1e-13 || artificial_diss_coeff_ext > 1e-13) {
219 ArrayTensor1 artificial_phys_flux_int, artificial_phys_flux_ext;
222 artificial_phys_flux_int = artificial_dissip->calc_artificial_dissipation_flux (soln_int, soln_grad_int, artificial_diss_coeff_int);
223 artificial_phys_flux_ext = artificial_dissip->calc_artificial_dissipation_flux (soln_ext, soln_grad_ext, artificial_diss_coeff_ext);
224 ArrayTensor1 artificial_phys_flux_avg = array_average<nstate,dim,real>(artificial_phys_flux_int, artificial_phys_flux_ext);
227 ArrayTensor1 artificial_A_jumpu_int, artificial_A_jumpu_ext;
228 artificial_A_jumpu_int = artificial_dissip->calc_artificial_dissipation_flux (soln_int, soln_jump, artificial_diss_coeff_int);
229 artificial_A_jumpu_ext = artificial_dissip->calc_artificial_dissipation_flux (soln_ext, soln_jump, artificial_diss_coeff_ext);
230 const ArrayTensor1 artificial_A_jumpu_avg = array_average<nstate,dim,real>(artificial_A_jumpu_int, artificial_A_jumpu_ext);
232 for (
int s=0; s<nstate; s++) {
235 for (
int d=0; d<dim; ++d) {
236 arti += (artificial_phys_flux_avg[s][d] - penalty * artificial_A_jumpu_avg[s][d]) * normal_int[d];
238 auxiliary_flux_dot_n[s] += arti;
242 return auxiliary_flux_dot_n;
245 template<
int dim,
int nspecies,
int nstate,
typename real>
248 const std::array<real, nstate> &soln_int,
249 const std::array<real, nstate> &soln_ext,
250 const dealii::Tensor<1,dim,real> &)
const 252 std::array<real,nstate> soln_avg = array_average<nstate,real>(soln_int, soln_ext);
257 template<
int dim,
int nspecies,
int nstate,
typename real>
260 const dealii::types::global_dof_index current_cell_index,
261 const dealii::types::global_dof_index neighbor_cell_index_,
262 const real artificial_diss_coeff_int,
263 const real artificial_diss_coeff_ext_,
264 const std::array<real, nstate> &soln_int,
265 const std::array<real, nstate> &soln_ext,
266 const std::array<dealii::Tensor<1,dim,real>, nstate> &soln_grad_int,
267 const std::array<dealii::Tensor<1,dim,real>, nstate> &soln_grad_ext_,
268 const std::array<real, nstate> &filtered_soln_int,
269 const std::array<real, nstate> &filtered_soln_ext,
270 const std::array<dealii::Tensor<1,dim,real>, nstate> &filtered_soln_grad_int,
271 const std::array<dealii::Tensor<1,dim,real>, nstate> &filtered_soln_grad_ext_,
272 const dealii::Tensor<1,dim,real> &normal_int,
274 const bool on_boundary,
275 const int boundary_type)
const 277 using ArrayTensor1 = std::array<dealii::Tensor<1,dim,real>, nstate>;
282 real artificial_diss_coeff_ext;
283 dealii::types::global_dof_index neighbor_cell_index;
284 std::array<dealii::Tensor<1,dim,real>, nstate> soln_grad_ext;
285 std::array<dealii::Tensor<1,dim,real>, nstate> filtered_soln_grad_ext;
296 artificial_diss_coeff_ext = artificial_diss_coeff_ext_;
297 neighbor_cell_index = neighbor_cell_index_;
298 soln_grad_ext = soln_grad_ext_;
299 filtered_soln_grad_ext = filtered_soln_grad_ext_;
303 std::array<real,nstate> phys_flux_int_dot_n, phys_flux_ext_dot_n;
304 phys_flux_int_dot_n = pde_physics->dissipative_flux_dot_normal (soln_int, soln_grad_int, filtered_soln_int, filtered_soln_grad_int, on_boundary, current_cell_index, normal_int, boundary_type);
305 phys_flux_ext_dot_n = pde_physics->dissipative_flux_dot_normal (soln_ext, soln_grad_ext, filtered_soln_ext, filtered_soln_grad_ext, on_boundary, neighbor_cell_index, normal_int, boundary_type);
306 const std::array<real,nstate> phys_flux_avg_dot_n = array_average<nstate,real>(phys_flux_int_dot_n,phys_flux_ext_dot_n);
308 std::array<real,nstate> auxiliary_flux_dot_n = phys_flux_avg_dot_n;
310 if (artificial_diss_coeff_int > 1e-13 || artificial_diss_coeff_ext > 1e-13) {
311 ArrayTensor1 artificial_phys_flux_int, artificial_phys_flux_ext;
314 artificial_phys_flux_int = artificial_dissip->calc_artificial_dissipation_flux (soln_int, soln_grad_int, artificial_diss_coeff_int);
315 artificial_phys_flux_ext = artificial_dissip->calc_artificial_dissipation_flux (soln_ext, soln_grad_ext, artificial_diss_coeff_ext);
316 ArrayTensor1 artificial_phys_flux_avg = array_average<nstate,dim,real>(artificial_phys_flux_int, artificial_phys_flux_ext);
318 for (
int s=0; s<nstate; s++) {
320 for (
int d=0; d<dim; ++d) {
321 arti += artificial_phys_flux_avg[s][d] * normal_int[d];
323 auxiliary_flux_dot_n[s] += arti;
327 return auxiliary_flux_dot_n;
330 #if PHILIP_SPECIES==1 332 #define POSSIBLE_NSTATE (1)(2)(3)(4)(5)(6) 335 #define INSTANTIATE_FOR_NSTATE(r, data, nstate) \ 336 template class NumericalFluxDissipative<PHILIP_DIM, PHILIP_SPECIES, nstate, double>; \ 337 template class NumericalFluxDissipative<PHILIP_DIM, PHILIP_SPECIES, nstate, FadType>; \ 338 template class NumericalFluxDissipative<PHILIP_DIM, PHILIP_SPECIES, nstate, RadType>; \ 339 template class NumericalFluxDissipative<PHILIP_DIM, PHILIP_SPECIES, nstate, FadFadType>; \ 340 template class NumericalFluxDissipative<PHILIP_DIM, PHILIP_SPECIES, nstate, RadFadType>; \ 342 template class SymmetricInternalPenalty<PHILIP_DIM, PHILIP_SPECIES, nstate, double>; \ 343 template class SymmetricInternalPenalty<PHILIP_DIM, PHILIP_SPECIES, nstate, FadType>; \ 344 template class SymmetricInternalPenalty<PHILIP_DIM, PHILIP_SPECIES, nstate, RadType>; \ 345 template class SymmetricInternalPenalty<PHILIP_DIM, PHILIP_SPECIES, nstate, FadFadType>; \ 346 template class SymmetricInternalPenalty<PHILIP_DIM, PHILIP_SPECIES, nstate, RadFadType>; \ 348 template class BassiRebay2<PHILIP_DIM, PHILIP_SPECIES, nstate, double>; \ 349 template class BassiRebay2<PHILIP_DIM, PHILIP_SPECIES, nstate, FadType>; \ 350 template class BassiRebay2<PHILIP_DIM, PHILIP_SPECIES, nstate, RadType>; \ 351 template class BassiRebay2<PHILIP_DIM, PHILIP_SPECIES, nstate, FadFadType>; \ 352 template class BassiRebay2<PHILIP_DIM, PHILIP_SPECIES, nstate, RadFadType>; \ 354 template class CentralViscousNumericalFlux<PHILIP_DIM, PHILIP_SPECIES, nstate, double>; \ 355 template class CentralViscousNumericalFlux<PHILIP_DIM, PHILIP_SPECIES, nstate, FadType>; \ 356 template class CentralViscousNumericalFlux<PHILIP_DIM, PHILIP_SPECIES, nstate, RadType>; \ 357 template class CentralViscousNumericalFlux<PHILIP_DIM, PHILIP_SPECIES, nstate, FadFadType>; \ 358 template class CentralViscousNumericalFlux<PHILIP_DIM, PHILIP_SPECIES, nstate, RadFadType>; 359 BOOST_PP_SEQ_FOR_EACH(INSTANTIATE_FOR_NSTATE, _, POSSIBLE_NSTATE)
361 #define POSSIBLE_TYPE (double)(FadType)(RadType)(FadFadType)(RadFadType) 362 #define INSTANTIATE_TYPES(r, data, type) \ 363 template class NumericalFluxDissipative<PHILIP_DIM, PHILIP_SPECIES, PHILIP_DIM+PHILIP_SPECIES+1, type>; \ 364 template class SymmetricInternalPenalty<PHILIP_DIM, PHILIP_SPECIES, PHILIP_DIM+PHILIP_SPECIES+1, type>; \ 365 template class BassiRebay2<PHILIP_DIM, PHILIP_SPECIES, PHILIP_DIM+PHILIP_SPECIES+1, type>; \ 366 template class CentralViscousNumericalFlux<PHILIP_DIM, PHILIP_SPECIES, PHILIP_DIM+PHILIP_SPECIES+1, type>; 367 BOOST_PP_SEQ_FOR_EACH(INSTANTIATE_TYPES, _, POSSIBLE_TYPE)
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 std::array< real, nstate > &filtered_soln_int, const std::array< real, nstate > &filtered_soln_ext, const std::array< dealii::Tensor< 1, dim, real >, nstate > &filtered_soln_grad_int, const std::array< dealii::Tensor< 1, dim, real >, nstate > &filtered_soln_grad_ext_, const dealii::Tensor< 1, dim, real > &normal_int, const real &penalty, const bool on_boundary, const int boundary_type=0) const override
Evaluate 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 std::array< real, nstate > &filtered_soln_int, const std::array< real, nstate > &filtered_soln_ext, const std::array< dealii::Tensor< 1, dim, real >, nstate > &filtered_soln_grad_int, const std::array< dealii::Tensor< 1, dim, real >, nstate > &filtered_soln_grad_ext_, const dealii::Tensor< 1, dim, real > &normal_int, const real &penalty, const bool on_boundary, const int boundary_type=0) const override
Evaluate auxiliary flux at the interface.
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.
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 std::array< real, nstate > &filtered_soln_int, const std::array< real, nstate > &filtered_soln_ext, const std::array< dealii::Tensor< 1, dim, real >, nstate > &filtered_soln_grad_int, const std::array< dealii::Tensor< 1, dim, real >, nstate > &filtered_soln_grad_ext_, const dealii::Tensor< 1, dim, real > &normal_int, const real &penalty, const bool on_boundary, const int boundary_type=0) const =0
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.