184 const dealii::Tensor<1, dim, dealii::VectorizedArray<number>> &normal)
const
190 const auto velocity_m = state_view_m.velocity();
191 const auto velocity_p = state_view_p.velocity();
193 const auto flux_p = calculate_convective_flux(u_p);
194 const auto flux_m = calculate_convective_flux(u_m);
196 const auto sound_speed_p = state_view_p.speed_of_sound();
197 const auto sound_speed_m = state_view_m.speed_of_sound();
199 switch (flow_data.numerical_flux_type)
201 case NumericalFluxType::lax_friedrichs_modified: {
202 const auto sound_speed_p2 = sound_speed_p * sound_speed_p;
203 const auto sound_speed_m2 = sound_speed_m * sound_speed_m;
206 0.5 * std::sqrt(std::max(velocity_p.norm_square() + sound_speed_p2,
207 velocity_m.norm_square() + sound_speed_m2));
209 return contract_average_tensor_with_vector<n_conserved_variables<dim>,
211 dealii::VectorizedArray<number>>(flux_m,
214 0.5 * lambda * (u_m - u_p);
216 case NumericalFluxType::lax_friedrichs_exact: {
217 const auto lambda = std::max(std::abs(velocity_p * normal) + sound_speed_p,
218 std::abs(velocity_m * normal) + sound_speed_m);
220 return contract_average_tensor_with_vector<n_conserved_variables<dim>,
222 dealii::VectorizedArray<number>>(flux_m,
225 0.5 * lambda * (u_m - u_p);
227 case NumericalFluxType::harten_lax_vanleer: {
228 const auto avg_velocity_normal = 0.5 * ((velocity_m + velocity_p) * normal);
229 const auto avg_c = std::abs(0.5 * (sound_speed_m + sound_speed_p));
230 const dealii::VectorizedArray<number> s_pos =
231 std::max(dealii::VectorizedArray<number>(), avg_velocity_normal + avg_c);
232 const dealii::VectorizedArray<number> s_neg =
233 std::min(dealii::VectorizedArray<number>(), avg_velocity_normal - avg_c);
234 const dealii::VectorizedArray<number> inverse_s =
235 dealii::VectorizedArray<number>(1.) / (s_pos - s_neg);
239 contract_tensor_with_vector<n_conserved_variables<dim>, dim, number>(flux_m,
244 s_pos * s_neg * (u_m - u_p));
247 Assert(
false, dealii::ExcNotImplemented());
294 dealii::VectorizedArray<number> rho_inv = 1.0 / w_q[0];
295 dealii::VectorizedArray<number> momentum_norm_squared = 0.0;
296 dealii::VectorizedArray<number> momentum_times_delta_momentum_squared = 0.0;
297 dealii::Tensor<1, dim, dealii::VectorizedArray<number>> momentum;
298 dealii::Tensor<1, dim, dealii::VectorizedArray<number>> delta_momentum;
299 for (
unsigned int i = 1; i < dim + 1; ++i)
301 momentum_norm_squared += w_q[i] * w_q[i];
302 momentum_times_delta_momentum_squared += delta_w_q[i] * w_q[i];
303 momentum[i - 1] = w_q[i];
304 delta_momentum[i - 1] = delta_w_q[i];
308 for (
unsigned int dimension = 0; dimension < dim; ++dimension)
309 convective_differential_change[0][dimension] = delta_w_q[dimension + 1];
312 dealii::Tensor<1, dim, dealii::Tensor<1, dim, dealii::VectorizedArray<number>>> helper;
314 helper -= rho_inv * rho_inv * delta_w_q[0] *
315 dyadic_product<dim, dim, dealii::VectorizedArray<number>>(&w_q[1], &w_q[1]);
316 helper += rho_inv * rho_inv * rs_div_c * momentum_norm_squared * delta_w_q[0] * 0.5 *
317 identity<dim, dealii::VectorizedArray<number>>();
320 rho_inv * dyadic_product<dim, dim, dealii::VectorizedArray<number>>(&delta_w_q[1], &w_q[1]);
322 rho_inv * dyadic_product<dim, dim, dealii::VectorizedArray<number>>(&w_q[1], &delta_w_q[1]);
323 helper -= rs_div_c * rho_inv * momentum_times_delta_momentum_squared *
324 identity<dim, dealii::VectorizedArray<number>>();
326 helper += rs_div_c * delta_w_q[dim + 1] * identity<dim, dealii::VectorizedArray<number>>();
328 for (
unsigned int i = 0; i < dim; ++i)
330 convective_differential_change[i + 1] += helper[i];
334 dealii::Tensor<1, dim, dealii::VectorizedArray<number>> helper_energy;
336 helper_energy -= (w_q[dim + 1] + rs_div_c * (w_q[dim + 1] - rho_inv * momentum_norm_squared)) *
337 rho_inv * rho_inv * delta_w_q[0] * momentum;
340 (w_q[dim + 1] + rs_div_c * (w_q[dim + 1] - 0.5 * rho_inv * momentum_norm_squared)) * rho_inv *
343 rs_div_c * momentum_times_delta_momentum_squared * rho_inv * rho_inv * momentum;
345 helper_energy += (1 + rs_div_c) * delta_w_q[dim + 1] * rho_inv * momentum;
346 convective_differential_change[dim + 1] = helper_energy;
348 return convective_differential_change;
355 const std::pair<ConservedVariables, ConservedVariables> &w_q,
356 const std::pair<ConservedVariables, ConservedVariables> &delta_w_q,
357 const dealii::Tensor<1, dim, dealii::VectorizedArray<number>> &normal)
const
371 const dealii::Tensor<1, dim, dealii::VectorizedArray<number>> &)>
372 compute_lambda_times_jump;
375 switch (flow_data.numerical_flux_type)
377 case NumericalFluxType::lax_friedrichs_exact: {
378 compute_lambda_times_jump =
384 const dealii::Tensor<1, dim, dealii::VectorizedArray<number>> &normal)
389 const auto velocity_m = state_view_m.velocity();
390 const auto velocity_p = state_view_p.velocity();
393 std::max(std::abs(velocity_p * normal) + state_view_p.speed_of_sound(),
394 std::abs(velocity_m * normal) + state_view_m.speed_of_sound());
395 return lambda * (delta_w_m - delta_w_p);
399 case NumericalFluxType::lax_friedrichs_modified: {
400 compute_lambda_times_jump =
405 const dealii::Tensor<1, dim, dealii::VectorizedArray<number>> &)
410 const auto velocity_m = state_view_m.velocity();
411 const auto velocity_p = state_view_p.velocity();
413 const auto pressure_m = state_view_m.pressure();
414 const auto pressure_p = state_view_p.pressure();
417 0.5 * std::sqrt(std::max(
418 velocity_p.norm_square() + std::abs(material.gamma * pressure_p / w_p[0]),
419 velocity_m.norm_square() + std::abs(material.gamma * pressure_m / w_m[0])));
420 return lambda * (delta_w_m - delta_w_p);
425 DEAL_II_ASSERT_UNREACHABLE();
430 constexpr number epsilon = 1e-3;
431 constexpr number epsilon_inv = 1e3;
432 switch (flow_data.linearization_jump_convective_flux)
434 case LinearizedConvectiveFluxJumpType::complete_fd: {
436 compute_lambda_times_jump(w_p, w_m, w_p, w_m, normal),
439 compute_lambda_times_jump(w_p + epsilon * delta_w_p,
440 w_m + epsilon * delta_w_m,
441 w_p + epsilon * delta_w_p,
442 w_m + epsilon * delta_w_m,
447 case LinearizedConvectiveFluxJumpType::lambda_fd: {
449 0.5 * compute_lambda_times_jump(w_p, w_m, delta_w_p, delta_w_m, normal), normal);
451 auto helper = compute_lambda_times_jump(
452 w_p + epsilon * delta_w_p, w_m + epsilon * delta_w_m, w_p, w_m, normal);
453 helper -= compute_lambda_times_jump(w_p, w_m, w_p, w_m, normal);
457 case LinearizedConvectiveFluxJumpType::analytic: {
459 0.5 * compute_lambda_times_jump(w_p, w_m, delta_w_p, delta_w_m, normal), normal);
461 const auto linearize_speed_of_sound =
464 const dealii::VectorizedArray<number> &c,
465 const dealii::VectorizedArray<number> &) -> dealii::VectorizedArray<number> {
466 dealii::Tensor<1, dim, dealii::VectorizedArray<number>> m_q;
467 dealii::Tensor<1, dim, dealii::VectorizedArray<number>> delta_m_q;
468 for (
unsigned int i = 0; i < dim; ++i)
471 delta_m_q[i] = delta_w_q[i + 1];
473 dealii::VectorizedArray<number> rho_inv = 1. / w_q[0];
474 dealii::VectorizedArray<number> lin_c = delta_w_q[0] / (2.0 * c) * material.gamma *
475 rho_inv * rho_inv * rs_div_c *
476 (rho_inv * m_q * m_q - w_q[dim + 1]);
477 lin_c -= material.gamma / (2.0 * c) * rho_inv * rho_inv * rs_div_c * m_q * delta_m_q;
478 lin_c += material.gamma / (2.0 * c) * rho_inv * rs_div_c * delta_w_q[dim + 1];
482 const auto norm_lin_velocity =
485 const dealii::Tensor<1, dim, dealii::VectorizedArray<number>> &normal)
486 -> dealii::VectorizedArray<number> {
487 auto rho_inv = 1. / state_view_q.density();
488 auto u = state_view_q.velocity();
489 dealii::Tensor<1, dim, dealii::VectorizedArray<number>> delta_m_q;
490 for (
unsigned int i = 0; i < dim; ++i)
491 delta_m_q[i] = delta_w_q[i + 1];
492 auto lin_velocity = delta_m_q * rho_inv - u * rho_inv * delta_w_q[0];
493 return lin_velocity * normal;
498 const dealii::VectorizedArray<number> &a) ->
const dealii::VectorizedArray<number> {
499 return dealii::compare_and_apply_mask<dealii::SIMDComparison::greater_than>(
500 a, dealii::VectorizedArray<number>(0.0), 1.0, -1.0);
506 const auto velocity_m = state_view_m.velocity();
507 const auto velocity_p = state_view_p.velocity();
509 const auto pressure_m = state_view_m.pressure();
510 const auto pressure_p = state_view_p.pressure();
512 const auto speed_of_sound_m = state_view_m.speed_of_sound();
513 const auto speed_of_sound_p = state_view_p.speed_of_sound();
515 const auto lin_lambda_p =
516 signum(velocity_p * normal) * norm_lin_velocity(state_view_p, delta_w_p, normal) +
517 linearize_speed_of_sound(w_p, delta_w_p, speed_of_sound_p, pressure_p);
518 const auto lin_lambda_m =
519 signum(velocity_m * normal) * norm_lin_velocity(state_view_m, delta_w_m, normal) +
520 linearize_speed_of_sound(w_m, delta_w_m, speed_of_sound_m, pressure_m);
522 const auto lin_lambda =
523 dealii::compare_and_apply_mask<dealii::SIMDComparison::greater_than>(
524 velocity_p.norm() + speed_of_sound_p,
525 velocity_m.norm() + speed_of_sound_m,
529 for (
unsigned int i = 0; i < n_conserved_variables<dim>; ++i)
530 flux[i] += 0.5 * lin_lambda * (w_m[i] - w_p[i]) * normal;
538 "The provided linearization scheme of the jump operator term in the convective"
539 " numerical flux is not supported."));