509class ConvectiveOperator
512 typedef dealii::LinearAlgebra::distributed::Vector<Number> VectorType;
514 typedef ConvectiveOperator<dim, Number> This;
516 typedef CellIntegrator<dim, 1, Number> CellIntegratorScalar;
517 typedef FaceIntegrator<dim, 1, Number> FaceIntegratorScalar;
518 typedef CellIntegrator<dim, dim, Number> CellIntegratorVector;
519 typedef FaceIntegrator<dim, dim, Number> FaceIntegratorVector;
521 typedef dealii::VectorizedArray<Number> scalar;
522 typedef dealii::Tensor<1, dim, dealii::VectorizedArray<Number>> vector;
523 typedef dealii::Tensor<2, dim, dealii::VectorizedArray<Number>> tensor;
524 typedef dealii::Point<dim, dealii::VectorizedArray<Number>> point;
526 ConvectiveOperator() : matrix_free(
nullptr)
531 initialize(dealii::MatrixFree<dim, Number>
const & matrix_free_in,
534 this->matrix_free = &matrix_free_in;
535 this->data = data_in;
537 gamma = data.heat_capacity_ratio;
538 R = data.specific_gas_constant;
539 c_v = R / (gamma - 1.0);
543 evaluate(VectorType & dst, VectorType
const & src, Number
const evaluation_time)
const
546 evaluate_add(dst, src, evaluation_time);
550 evaluate_add(VectorType & dst, VectorType
const & src, Number
const evaluation_time)
const
552 this->eval_time = evaluation_time;
555 &This::cell_loop, &This::face_loop, &This::boundary_face_loop,
this, dst, src);
559 set_evaluation_time(
double const & evaluation_time)
const
561 eval_time = evaluation_time;
564 inline DEAL_II_ALWAYS_INLINE
565 std::tuple<vector, tensor, vector>
566 get_volume_flux(CellIntegratorScalar & density,
567 CellIntegratorVector & momentum,
568 CellIntegratorScalar & energy,
569 unsigned int const q)
const
571 scalar rho_inv = 1.0 / density.get_value(q);
572 vector rho_u = momentum.get_value(q);
573 scalar rho_E = energy.get_value(q);
574 vector u = rho_inv * rho_u;
575 scalar p = calculate_pressure(rho_u, u, rho_E, gamma);
577 tensor momentum_flux = outer_product(rho_u, u);
578 for(
unsigned int d = 0; d < dim; ++d)
579 momentum_flux[d][d] += p;
581 vector energy_flux = (rho_E + p) * u;
583 return std::make_tuple(rho_u, momentum_flux, energy_flux);
586 inline DEAL_II_ALWAYS_INLINE
587 std::tuple<scalar, vector, scalar>
588 get_flux(FaceIntegratorScalar & density_m,
589 FaceIntegratorScalar & density_p,
590 FaceIntegratorVector & momentum_m,
591 FaceIntegratorVector & momentum_p,
592 FaceIntegratorScalar & energy_m,
593 FaceIntegratorScalar & energy_p,
594 unsigned int const q)
const
596 vector normal = momentum_m.get_normal_vector(q);
599 scalar rho_M = density_m.get_value(q);
600 scalar rho_P = density_p.get_value(q);
601 vector rho_u_M = momentum_m.get_value(q);
602 vector rho_u_P = momentum_p.get_value(q);
603 vector u_M = rho_u_M / rho_M;
604 vector u_P = rho_u_P / rho_P;
605 scalar rho_E_M = energy_m.get_value(q);
606 scalar rho_E_P = energy_p.get_value(q);
609 scalar p_M = calculate_pressure(rho_u_M, u_M, rho_E_M, gamma);
610 scalar p_P = calculate_pressure(rho_u_P, u_P, rho_E_P, gamma);
613 scalar lambda = calculate_lambda(rho_M, rho_P, u_M, u_P, p_M, p_P, gamma);
616 scalar flux_density = calculate_flux(rho_u_M, rho_u_P, rho_M, rho_P, lambda, normal);
619 tensor momentum_flux_M = outer_product(rho_u_M, u_M);
620 for(
unsigned int d = 0; d < dim; ++d)
621 momentum_flux_M[d][d] += p_M;
623 tensor momentum_flux_P = outer_product(rho_u_P, u_P);
624 for(
unsigned int d = 0; d < dim; ++d)
625 momentum_flux_P[d][d] += p_P;
627 vector flux_momentum =
628 calculate_flux(momentum_flux_M, momentum_flux_P, rho_u_M, rho_u_P, lambda, normal);
631 vector energy_flux_M = (rho_E_M + p_M) * u_M;
632 vector energy_flux_P = (rho_E_P + p_P) * u_P;
635 calculate_flux(energy_flux_M, energy_flux_P, rho_E_M, rho_E_P, lambda, normal);
637 return std::make_tuple(flux_density, flux_momentum, flux_energy);
640 inline DEAL_II_ALWAYS_INLINE
641 std::tuple<scalar, vector, scalar>
642 get_flux_boundary(FaceIntegratorScalar & density,
643 FaceIntegratorVector & momentum,
644 FaceIntegratorScalar & energy,
645 BoundaryType
const & boundary_type_density,
646 BoundaryType
const & boundary_type_velocity,
647 BoundaryType
const & boundary_type_pressure,
648 BoundaryType
const & boundary_type_energy,
649 EnergyBoundaryVariable
const & boundary_variable,
650 dealii::types::boundary_id
const & boundary_id,
651 unsigned int const q)
const
653 vector normal = momentum.get_normal_vector(q);
656 scalar rho_M = density.get_value(q);
657 vector rho_u_M = momentum.get_value(q);
658 vector u_M = rho_u_M / rho_M;
659 scalar rho_E_M = energy.get_value(q);
660 scalar E_M = rho_E_M / rho_M;
661 scalar p_M = calculate_pressure(rho_M, u_M, E_M, gamma);
666 scalar rho_P = calculate_exterior_value<dim, Number, 0>(rho_M,
667 boundary_type_density,
670 density.quadrature_point(q),
674 vector u_P = calculate_exterior_value<dim, Number, 1>(u_M,
675 boundary_type_velocity,
678 momentum.quadrature_point(q),
681 vector rho_u_P = rho_P * u_P;
684 scalar p_P = calculate_exterior_value<dim, Number, 0>(p_M,
685 boundary_type_pressure,
688 density.quadrature_point(q),
692 scalar E_P = dealii::make_vectorized_array<Number>(0.0);
693 if(boundary_variable == EnergyBoundaryVariable::Energy)
695 E_P = calculate_exterior_value<dim, Number, 0>(E_M,
696 boundary_type_energy,
699 energy.quadrature_point(q),
702 else if(boundary_variable == EnergyBoundaryVariable::Temperature)
704 scalar T_M = calculate_temperature(p_M, rho_M, R);
705 scalar T_P = calculate_exterior_value<dim, Number, 0>(T_M,
706 boundary_type_energy,
709 energy.quadrature_point(q),
712 E_P = calculate_energy(T_P, u_P, c_v);
714 scalar rho_E_P = rho_P * E_P;
717 scalar lambda = calculate_lambda(rho_M, rho_P, u_M, u_P, p_M, p_P, gamma);
720 scalar flux_density = calculate_flux(rho_u_M, rho_u_P, rho_M, rho_P, lambda, normal);
723 tensor momentum_flux_M = outer_product(rho_u_M, u_M);
724 for(
unsigned int d = 0; d < dim; ++d)
725 momentum_flux_M[d][d] += p_M;
727 tensor momentum_flux_P = outer_product(rho_u_P, u_P);
728 for(
unsigned int d = 0; d < dim; ++d)
729 momentum_flux_P[d][d] += p_P;
731 vector flux_momentum =
732 calculate_flux(momentum_flux_M, momentum_flux_P, rho_u_M, rho_u_P, lambda, normal);
735 vector energy_flux_M = (rho_E_M + p_M) * u_M;
736 vector energy_flux_P = (rho_E_P + p_P) * u_P;
738 calculate_flux(energy_flux_M, energy_flux_P, rho_E_M, rho_E_P, lambda, normal);
740 return std::make_tuple(flux_density, flux_momentum, flux_energy);
745 cell_loop(dealii::MatrixFree<dim, Number>
const & matrix_free,
747 VectorType
const & src,
748 std::pair<unsigned int, unsigned int>
const & cell_range)
const
750 CellIntegratorScalar density(matrix_free, data.dof_index, data.quad_index, 0);
751 CellIntegratorVector momentum(matrix_free, data.dof_index, data.quad_index, 1);
752 CellIntegratorScalar energy(matrix_free, data.dof_index, data.quad_index, 1 + dim);
754 for(
unsigned int cell = cell_range.first; cell < cell_range.second; ++cell)
756 density.reinit(cell);
757 density.gather_evaluate(src, dealii::EvaluationFlags::values);
759 momentum.reinit(cell);
760 momentum.gather_evaluate(src, dealii::EvaluationFlags::values);
763 energy.gather_evaluate(src, dealii::EvaluationFlags::values);
765 for(
unsigned int q = 0; q < momentum.n_q_points; ++q)
767 std::tuple<vector, tensor, vector> flux = get_volume_flux(density, momentum, energy, q);
769 density.submit_gradient(-std::get<0>(flux), q);
770 momentum.submit_gradient(-std::get<1>(flux), q);
771 energy.submit_gradient(-std::get<2>(flux), q);
774 density.integrate_scatter(dealii::EvaluationFlags::gradients, dst);
775 momentum.integrate_scatter(dealii::EvaluationFlags::gradients, dst);
776 energy.integrate_scatter(dealii::EvaluationFlags::gradients, dst);
781 face_loop(dealii::MatrixFree<dim, Number>
const & matrix_free,
783 VectorType
const & src,
784 std::pair<unsigned int, unsigned int>
const & face_range)
const
786 FaceIntegratorScalar density_m(matrix_free,
true, data.dof_index, data.quad_index, 0);
787 FaceIntegratorScalar density_p(matrix_free,
false, data.dof_index, data.quad_index, 0);
789 FaceIntegratorVector momentum_m(matrix_free,
true, data.dof_index, data.quad_index, 1);
790 FaceIntegratorVector momentum_p(matrix_free,
false, data.dof_index, data.quad_index, 1);
792 FaceIntegratorScalar energy_m(matrix_free,
true, data.dof_index, data.quad_index, 1 + dim);
793 FaceIntegratorScalar energy_p(matrix_free,
false, data.dof_index, data.quad_index, 1 + dim);
795 for(
unsigned int face = face_range.first; face < face_range.second; face++)
798 density_m.reinit(face);
799 density_m.gather_evaluate(src, dealii::EvaluationFlags::values);
801 density_p.reinit(face);
802 density_p.gather_evaluate(src, dealii::EvaluationFlags::values);
805 momentum_m.reinit(face);
806 momentum_m.gather_evaluate(src, dealii::EvaluationFlags::values);
808 momentum_p.reinit(face);
809 momentum_p.gather_evaluate(src, dealii::EvaluationFlags::values);
812 energy_m.reinit(face);
813 energy_m.gather_evaluate(src, dealii::EvaluationFlags::values);
815 energy_p.reinit(face);
816 energy_p.gather_evaluate(src, dealii::EvaluationFlags::values);
818 for(
unsigned int q = 0; q < momentum_m.n_q_points; ++q)
820 std::tuple<scalar, vector, scalar> flux =
821 get_flux(density_m, density_p, momentum_m, momentum_p, energy_m, energy_p, q);
823 density_m.submit_value(std::get<0>(flux), q);
825 density_p.submit_value(-std::get<0>(flux), q);
827 momentum_m.submit_value(std::get<1>(flux), q);
829 momentum_p.submit_value(-std::get<1>(flux), q);
831 energy_m.submit_value(std::get<2>(flux), q);
833 energy_p.submit_value(-std::get<2>(flux), q);
836 density_m.integrate_scatter(dealii::EvaluationFlags::values, dst);
837 density_p.integrate_scatter(dealii::EvaluationFlags::values, dst);
839 momentum_m.integrate_scatter(dealii::EvaluationFlags::values, dst);
840 momentum_p.integrate_scatter(dealii::EvaluationFlags::values, dst);
842 energy_m.integrate_scatter(dealii::EvaluationFlags::values, dst);
843 energy_p.integrate_scatter(dealii::EvaluationFlags::values, dst);
848 boundary_face_loop(dealii::MatrixFree<dim, Number>
const & matrix_free,
850 VectorType
const & src,
851 std::pair<unsigned int, unsigned int>
const & face_range)
const
853 FaceIntegratorScalar density(matrix_free,
true, data.dof_index, data.quad_index, 0);
854 FaceIntegratorVector momentum(matrix_free,
true, data.dof_index, data.quad_index, 1);
855 FaceIntegratorScalar energy(matrix_free,
true, data.dof_index, data.quad_index, 1 + dim);
857 for(
unsigned int face = face_range.first; face < face_range.second; face++)
859 density.reinit(face);
860 density.gather_evaluate(src, dealii::EvaluationFlags::values);
862 momentum.reinit(face);
863 momentum.gather_evaluate(src, dealii::EvaluationFlags::values);
866 energy.gather_evaluate(src, dealii::EvaluationFlags::values);
868 dealii::types::boundary_id boundary_id = matrix_free.get_boundary_id(face);
870 BoundaryType boundary_type_density = data.bc->density.get_boundary_type(boundary_id);
871 BoundaryType boundary_type_velocity = data.bc->velocity.get_boundary_type(boundary_id);
872 BoundaryType boundary_type_pressure = data.bc->pressure.get_boundary_type(boundary_id);
873 BoundaryType boundary_type_energy = data.bc->energy.get_boundary_type(boundary_id);
875 EnergyBoundaryVariable boundary_variable = data.bc->energy.get_boundary_variable(boundary_id);
877 for(
unsigned int q = 0; q < density.n_q_points; ++q)
879 std::tuple<scalar, vector, scalar> flux = get_flux_boundary(density,
882 boundary_type_density,
883 boundary_type_velocity,
884 boundary_type_pressure,
885 boundary_type_energy,
890 density.submit_value(std::get<0>(flux), q);
891 momentum.submit_value(std::get<1>(flux), q);
892 energy.submit_value(std::get<2>(flux), q);
895 density.integrate_scatter(dealii::EvaluationFlags::values, dst);
896 momentum.integrate_scatter(dealii::EvaluationFlags::values, dst);
897 energy.integrate_scatter(dealii::EvaluationFlags::values, dst);
901 dealii::MatrixFree<dim, Number>
const * matrix_free;
914 mutable Number eval_time;
951 typedef dealii::LinearAlgebra::distributed::Vector<Number> VectorType;
953 typedef ViscousOperator<dim, Number> This;
955 typedef CellIntegrator<dim, 1, Number> CellIntegratorScalar;
956 typedef FaceIntegrator<dim, 1, Number> FaceIntegratorScalar;
957 typedef CellIntegrator<dim, dim, Number> CellIntegratorVector;
958 typedef FaceIntegrator<dim, dim, Number> FaceIntegratorVector;
960 typedef dealii::VectorizedArray<Number> scalar;
961 typedef dealii::Tensor<1, dim, dealii::VectorizedArray<Number>> vector;
962 typedef dealii::Tensor<2, dim, dealii::VectorizedArray<Number>> tensor;
963 typedef dealii::Point<dim, dealii::VectorizedArray<Number>> point;
965 ViscousOperator() : matrix_free(
nullptr), degree(1)
970 initialize(dealii::MatrixFree<dim, Number>
const & matrix_free_in,
973 this->matrix_free = &matrix_free_in;
974 this->data = data_in;
976 dealii::FiniteElement<dim>
const & fe = matrix_free->get_dof_handler(data.dof_index).get_fe();
979 gamma = data.heat_capacity_ratio;
980 R = data.specific_gas_constant;
981 c_v = R / (gamma - 1.0);
982 mu = data.dynamic_viscosity;
983 nu = mu / data.reference_density;
984 lambda = data.thermal_conductivity;
986 IP::calculate_penalty_parameter<dim, Number>(array_penalty_parameter,
992 evaluate(VectorType & dst, VectorType
const & src, Number
const evaluation_time)
const
995 evaluate_add(dst, src, evaluation_time);
999 evaluate_add(VectorType & dst, VectorType
const & src, Number
const evaluation_time)
const
1001 this->eval_time = evaluation_time;
1004 &This::cell_loop, &This::face_loop, &This::boundary_face_loop,
this, dst, src);
1008 set_evaluation_time(
double const & evaluation_time)
const
1010 eval_time = evaluation_time;
1013 inline DEAL_II_ALWAYS_INLINE
1015 get_penalty_parameter(FaceIntegratorScalar & fe_eval_m, FaceIntegratorScalar & fe_eval_p)
const
1018 std::max(fe_eval_m.read_cell_data(array_penalty_parameter),
1019 fe_eval_p.read_cell_data(array_penalty_parameter)) *
1020 IP::get_penalty_factor<dim, Number>(
1023 fe_eval_m.get_matrix_free().get_dof_handler(data.dof_index).get_triangulation()),
1030 inline DEAL_II_ALWAYS_INLINE
1032 get_penalty_parameter(FaceIntegratorScalar & fe_eval)
const
1034 scalar tau = fe_eval.read_cell_data(array_penalty_parameter) *
1035 IP::get_penalty_factor<dim, Number>(
1038 fe_eval.get_matrix_free().get_dof_handler(data.dof_index).get_triangulation()),
1045 inline DEAL_II_ALWAYS_INLINE
1046 std::tuple<vector, tensor, vector>
1047 get_volume_flux(CellIntegratorScalar & density,
1048 CellIntegratorVector & momentum,
1049 CellIntegratorScalar & energy,
1050 unsigned int const q)
const
1052 scalar rho_inv = 1.0 / density.get_value(q);
1053 vector grad_rho = density.get_gradient(q);
1055 vector rho_u = momentum.get_value(q);
1056 vector u = rho_inv * rho_u;
1057 tensor grad_rho_u = momentum.get_gradient(q);
1059 scalar rho_E = energy.get_value(q);
1060 vector grad_rho_E = energy.get_gradient(q);
1063 tensor grad_u = calculate_grad_u(rho_inv, rho_u, grad_rho, grad_rho_u);
1064 tensor tau = calculate_stress_tensor(grad_u, mu);
1067 vector grad_E = calculate_grad_E(rho_inv, rho_E, grad_rho, grad_rho_E);
1068 vector grad_T = calculate_grad_T(grad_E, u, grad_u, gamma, R);
1069 vector energy_flux = tau * u + lambda * grad_T;
1071 return std::make_tuple(vector() , tau, energy_flux);
1074 inline DEAL_II_ALWAYS_INLINE
1075 std::tuple<scalar, vector, scalar>
1076 get_gradient_flux(FaceIntegratorScalar & density_m,
1077 FaceIntegratorScalar & density_p,
1078 FaceIntegratorVector & momentum_m,
1079 FaceIntegratorVector & momentum_p,
1080 FaceIntegratorScalar & energy_m,
1081 FaceIntegratorScalar & energy_p,
1082 scalar
const & tau_IP,
1083 unsigned int const q)
const
1085 vector normal = momentum_m.get_normal_vector(q);
1088 scalar rho_M = density_m.get_value(q);
1089 vector grad_rho_M = density_m.get_gradient(q);
1091 scalar rho_P = density_p.get_value(q);
1092 vector grad_rho_P = density_p.get_gradient(q);
1095 vector rho_u_M = momentum_m.get_value(q);
1096 tensor grad_rho_u_M = momentum_m.get_gradient(q);
1098 vector rho_u_P = momentum_p.get_value(q);
1099 tensor grad_rho_u_P = momentum_p.get_gradient(q);
1102 scalar rho_E_M = energy_m.get_value(q);
1103 vector grad_rho_E_M = energy_m.get_gradient(q);
1105 scalar rho_E_P = energy_p.get_value(q);
1106 vector grad_rho_E_P = energy_p.get_gradient(q);
1109 scalar jump_density = rho_M - rho_P;
1110 scalar gradient_flux_density = -tau_IP * jump_density;
1113 scalar rho_inv_M = 1.0 / rho_M;
1114 tensor grad_u_M = calculate_grad_u(rho_inv_M, rho_u_M, grad_rho_M, grad_rho_u_M);
1115 tensor tau_M = calculate_stress_tensor(grad_u_M, mu);
1117 scalar rho_inv_P = 1.0 / rho_P;
1118 tensor grad_u_P = calculate_grad_u(rho_inv_P, rho_u_P, grad_rho_P, grad_rho_u_P);
1119 tensor tau_P = calculate_stress_tensor(grad_u_P, mu);
1121 vector jump_momentum = rho_u_M - rho_u_P;
1122 vector gradient_flux_momentum = 0.5 * (tau_M + tau_P) * normal - tau_IP * jump_momentum;
1125 vector u_M = rho_inv_M * rho_u_M;
1126 vector grad_E_M = calculate_grad_E(rho_inv_M, rho_E_M, grad_rho_M, grad_rho_E_M);
1127 vector grad_T_M = calculate_grad_T(grad_E_M, u_M, grad_u_M, gamma, R);
1129 vector u_P = rho_inv_P * rho_u_P;
1130 vector grad_E_P = calculate_grad_E(rho_inv_P, rho_E_P, grad_rho_P, grad_rho_E_P);
1131 vector grad_T_P = calculate_grad_T(grad_E_P, u_P, grad_u_P, gamma, R);
1133 vector flux_energy_average = 0.5 * (tau_M * u_M + tau_P * u_P + lambda * (grad_T_M + grad_T_P));
1135 scalar jump_energy = rho_E_M - rho_E_P;
1136 scalar gradient_flux_energy = flux_energy_average * normal - tau_IP * jump_energy;
1138 return std::make_tuple(gradient_flux_density, gradient_flux_momentum, gradient_flux_energy);
1142 inline DEAL_II_ALWAYS_INLINE
1143 std::tuple<scalar, vector, scalar>
1144 get_gradient_flux_boundary(FaceIntegratorScalar & density,
1145 FaceIntegratorVector & momentum,
1146 FaceIntegratorScalar & energy,
1147 scalar
const & tau_IP,
1148 BoundaryType
const & boundary_type_density,
1149 BoundaryType
const & boundary_type_velocity,
1150 BoundaryType
const & boundary_type_energy,
1151 EnergyBoundaryVariable
const & boundary_variable,
1152 dealii::types::boundary_id
const & boundary_id,
1153 unsigned int const q)
const
1155 vector normal = momentum.get_normal_vector(q);
1158 scalar rho_M = density.get_value(q);
1159 vector grad_rho_M = density.get_gradient(q);
1161 scalar rho_P = calculate_exterior_value<dim, Number, 0>(rho_M,
1162 boundary_type_density,
1165 density.quadrature_point(q),
1168 scalar jump_density = rho_M - rho_P;
1169 scalar gradient_flux_density = -tau_IP * jump_density;
1172 vector rho_u_M = momentum.get_value(q);
1173 tensor grad_rho_u_M = momentum.get_gradient(q);
1175 scalar rho_inv_M = 1.0 / rho_M;
1176 vector u_M = rho_inv_M * rho_u_M;
1178 vector u_P = calculate_exterior_value<dim, Number, 1>(u_M,
1179 boundary_type_velocity,
1182 momentum.quadrature_point(q),
1185 vector rho_u_P = rho_P * u_P;
1187 tensor grad_u_M = calculate_grad_u(rho_inv_M, rho_u_M, grad_rho_M, grad_rho_u_M);
1188 tensor tau_M = calculate_stress_tensor(grad_u_M, mu);
1190 vector tau_P_normal =
1191 calculate_exterior_normal_grad<dim, Number, 1>(tau_M * normal,
1192 boundary_type_velocity,
1195 momentum.quadrature_point(q),
1198 vector jump_momentum = rho_u_M - rho_u_P;
1199 vector gradient_flux_momentum = 0.5 * (tau_M * normal + tau_P_normal) - tau_IP * jump_momentum;
1202 scalar rho_E_M = energy.get_value(q);
1203 vector grad_rho_E_M = energy.get_gradient(q);
1205 scalar E_M = rho_inv_M * rho_E_M;
1206 scalar E_P = dealii::make_vectorized_array<Number>(0.0);
1207 if(boundary_variable == EnergyBoundaryVariable::Energy)
1209 E_P = calculate_exterior_value<dim, Number, 0>(E_M,
1210 boundary_type_energy,
1213 energy.quadrature_point(q),
1216 else if(boundary_variable == EnergyBoundaryVariable::Temperature)
1218 scalar p_M = calculate_pressure(rho_M, u_M, E_M, gamma);
1219 scalar T_M = calculate_temperature(p_M, rho_M, R);
1220 scalar T_P = calculate_exterior_value<dim, Number, 0>(T_M,
1221 boundary_type_energy,
1224 energy.quadrature_point(q),
1227 E_P = calculate_energy(T_P, u_P, c_v);
1230 scalar rho_E_P = rho_P * E_P;
1232 vector grad_E_M = calculate_grad_E(rho_inv_M, rho_E_M, grad_rho_M, grad_rho_E_M);
1233 vector grad_T_M = calculate_grad_T(grad_E_M, u_M, grad_u_M, gamma, R);
1235 scalar grad_T_M_normal = grad_T_M * normal;
1236 scalar grad_T_P_normal =
1237 calculate_exterior_normal_grad<dim, Number, 0>(grad_T_M_normal,
1238 boundary_type_energy,
1241 energy.quadrature_point(q),
1244 scalar jump_energy = rho_E_M - rho_E_P;
1245 scalar gradient_flux_energy = 0.5 * (u_M * tau_M * normal + u_P * tau_P_normal +
1246 lambda * (grad_T_M * normal + grad_T_P_normal)) -
1247 tau_IP * jump_energy;
1249 return std::make_tuple(gradient_flux_density, gradient_flux_momentum, gradient_flux_energy);
1252 inline DEAL_II_ALWAYS_INLINE
1259 get_value_flux(FaceIntegratorScalar & density_m,
1260 FaceIntegratorScalar & density_p,
1261 FaceIntegratorVector & momentum_m,
1262 FaceIntegratorVector & momentum_p,
1263 FaceIntegratorScalar & energy_m,
1264 FaceIntegratorScalar & energy_p,
1265 unsigned int const q)
const
1267 vector normal = momentum_m.get_normal_vector(q);
1270 scalar rho_M = density_m.get_value(q);
1271 scalar rho_P = density_p.get_value(q);
1274 vector rho_u_M = momentum_m.get_value(q);
1275 vector rho_u_P = momentum_p.get_value(q);
1278 scalar rho_E_M = energy_m.get_value(q);
1279 scalar rho_E_P = energy_p.get_value(q);
1281 vector jump_rho = (rho_M - rho_P) * normal;
1282 tensor jump_rho_u = outer_product(rho_u_M - rho_u_P, normal);
1283 vector jump_rho_E = (rho_E_M - rho_E_P) * normal;
1285 scalar rho_inv_M = 1.0 / rho_M;
1286 scalar rho_inv_P = 1.0 / rho_P;
1288 vector u_M = rho_inv_M * rho_u_M;
1289 vector u_P = rho_inv_P * rho_u_P;
1292 tensor grad_u_using_jumps_M = calculate_grad_u(rho_inv_M,
1297 tensor tau_using_jumps_M = calculate_stress_tensor(grad_u_using_jumps_M, mu);
1298 tensor value_flux_momentum_M = -0.5 * tau_using_jumps_M;
1300 tensor grad_u_using_jumps_P = calculate_grad_u(rho_inv_P,
1305 tensor tau_using_jumps_P = calculate_stress_tensor(grad_u_using_jumps_P, mu);
1306 tensor value_flux_momentum_P = -0.5 * tau_using_jumps_P;
1309 vector grad_E_using_jumps_M = calculate_grad_E(rho_inv_M,
1314 vector grad_T_using_jumps_M =
1315 calculate_grad_T(grad_E_using_jumps_M, u_M, grad_u_using_jumps_M, gamma, R);
1316 vector value_flux_energy_M = -0.5 * (tau_using_jumps_M * u_M + lambda * grad_T_using_jumps_M);
1318 vector grad_E_using_jumps_P = calculate_grad_E(rho_inv_P,
1323 vector grad_T_using_jumps_P =
1324 calculate_grad_T(grad_E_using_jumps_P, u_P, grad_u_using_jumps_P, gamma, R);
1325 vector value_flux_energy_P = -0.5 * (tau_using_jumps_P * u_P + lambda * grad_T_using_jumps_P);
1327 return std::make_tuple(vector() ,
1328 value_flux_momentum_M,
1329 value_flux_energy_M,
1331 value_flux_momentum_P,
1332 value_flux_energy_P);
1335 inline DEAL_II_ALWAYS_INLINE
1336 std::tuple<vector , tensor , vector >
1337 get_value_flux_boundary(FaceIntegratorScalar & density,
1338 FaceIntegratorVector & momentum,
1339 FaceIntegratorScalar & energy,
1340 BoundaryType
const & boundary_type_density,
1341 BoundaryType
const & boundary_type_velocity,
1342 BoundaryType
const & boundary_type_energy,
1343 EnergyBoundaryVariable
const & boundary_variable,
1344 dealii::types::boundary_id
const & boundary_id,
1345 unsigned int const q)
const
1347 vector normal = momentum.get_normal_vector(q);
1350 scalar rho_M = density.get_value(q);
1351 scalar rho_P = calculate_exterior_value<dim, Number, 0>(rho_M,
1352 boundary_type_density,
1355 density.quadrature_point(q),
1358 scalar rho_inv_M = 1.0 / rho_M;
1361 vector rho_u_M = momentum.get_value(q);
1362 vector u_M = rho_inv_M * rho_u_M;
1364 vector u_P = calculate_exterior_value<dim, Number, 1>(u_M,
1365 boundary_type_velocity,
1368 momentum.quadrature_point(q),
1371 vector rho_u_P = rho_P * u_P;
1374 scalar rho_E_M = energy.get_value(q);
1375 scalar E_M = rho_inv_M * rho_E_M;
1377 scalar E_P = dealii::make_vectorized_array<Number>(0.0);
1378 if(boundary_variable == EnergyBoundaryVariable::Energy)
1380 E_P = calculate_exterior_value<dim, Number, 0>(E_M,
1381 boundary_type_energy,
1384 energy.quadrature_point(q),
1387 else if(boundary_variable == EnergyBoundaryVariable::Temperature)
1389 scalar p_M = calculate_pressure(rho_M, u_M, E_M, gamma);
1390 scalar T_M = calculate_temperature(p_M, rho_M, R);
1391 scalar T_P = calculate_exterior_value<dim, Number, 0>(T_M,
1392 boundary_type_energy,
1395 energy.quadrature_point(q),
1398 E_P = calculate_energy(T_P, u_P, c_v);
1400 scalar rho_E_P = rho_P * E_P;
1402 vector jump_rho = (rho_M - rho_P) * normal;
1403 tensor jump_rho_u = outer_product(rho_u_M - rho_u_P, normal);
1404 vector jump_rho_E = (rho_E_M - rho_E_P) * normal;
1407 tensor grad_u_using_jumps_M = calculate_grad_u(rho_inv_M,
1412 tensor tau_using_jumps_M = calculate_stress_tensor(grad_u_using_jumps_M, mu);
1413 tensor value_flux_momentum_M = -0.5 * tau_using_jumps_M;
1416 vector grad_E_using_jumps_M = calculate_grad_E(rho_inv_M,
1421 vector grad_T_using_jumps_M =
1422 calculate_grad_T(grad_E_using_jumps_M, u_M, grad_u_using_jumps_M, gamma, R);
1423 vector value_flux_energy_M = -0.5 * (tau_using_jumps_M * u_M + lambda * grad_T_using_jumps_M);
1425 return std::make_tuple(vector() , value_flux_momentum_M, value_flux_energy_M);
1430 cell_loop(dealii::MatrixFree<dim, Number>
const & matrix_free,
1432 VectorType
const & src,
1433 std::pair<unsigned int, unsigned int>
const & cell_range)
const
1435 CellIntegratorScalar density(matrix_free, data.dof_index, data.quad_index, 0);
1436 CellIntegratorVector momentum(matrix_free, data.dof_index, data.quad_index, 1);
1437 CellIntegratorScalar energy(matrix_free, data.dof_index, data.quad_index, 1 + dim);
1439 for(
unsigned int cell = cell_range.first; cell < cell_range.second; ++cell)
1441 density.reinit(cell);
1442 density.gather_evaluate(src,
1443 dealii::EvaluationFlags::values | dealii::EvaluationFlags::gradients);
1445 momentum.reinit(cell);
1446 momentum.gather_evaluate(src,
1447 dealii::EvaluationFlags::values |
1448 dealii::EvaluationFlags::gradients);
1450 energy.reinit(cell);
1451 energy.gather_evaluate(src,
1452 dealii::EvaluationFlags::values | dealii::EvaluationFlags::gradients);
1454 for(
unsigned int q = 0; q < momentum.n_q_points; ++q)
1456 std::tuple<vector, tensor, vector> flux = get_volume_flux(density, momentum, energy, q);
1458 momentum.submit_gradient(std::get<1>(flux), q);
1459 energy.submit_gradient(std::get<2>(flux), q);
1462 momentum.integrate_scatter(dealii::EvaluationFlags::gradients, dst);
1463 energy.integrate_scatter(dealii::EvaluationFlags::gradients, dst);
1468 face_loop(dealii::MatrixFree<dim, Number>
const & matrix_free,
1470 VectorType
const & src,
1471 std::pair<unsigned int, unsigned int>
const & face_range)
const
1473 FaceIntegratorScalar density_m(matrix_free,
true, data.dof_index, data.quad_index, 0);
1474 FaceIntegratorScalar density_p(matrix_free,
false, data.dof_index, data.quad_index, 0);
1476 FaceIntegratorVector momentum_m(matrix_free,
true, data.dof_index, data.quad_index, 1);
1477 FaceIntegratorVector momentum_p(matrix_free,
false, data.dof_index, data.quad_index, 1);
1479 FaceIntegratorScalar energy_m(matrix_free,
true, data.dof_index, data.quad_index, 1 + dim);
1480 FaceIntegratorScalar energy_p(matrix_free,
false, data.dof_index, data.quad_index, 1 + dim);
1482 for(
unsigned int face = face_range.first; face < face_range.second; face++)
1485 density_m.reinit(face);
1486 density_m.gather_evaluate(src,
1487 dealii::EvaluationFlags::values |
1488 dealii::EvaluationFlags::gradients);
1490 density_p.reinit(face);
1491 density_p.gather_evaluate(src,
1492 dealii::EvaluationFlags::values |
1493 dealii::EvaluationFlags::gradients);
1496 momentum_m.reinit(face);
1497 momentum_m.gather_evaluate(src,
1498 dealii::EvaluationFlags::values |
1499 dealii::EvaluationFlags::gradients);
1501 momentum_p.reinit(face);
1502 momentum_p.gather_evaluate(src,
1503 dealii::EvaluationFlags::values |
1504 dealii::EvaluationFlags::gradients);
1507 energy_m.reinit(face);
1508 energy_m.gather_evaluate(src,
1509 dealii::EvaluationFlags::values |
1510 dealii::EvaluationFlags::gradients);
1512 energy_p.reinit(face);
1513 energy_p.gather_evaluate(src,
1514 dealii::EvaluationFlags::values |
1515 dealii::EvaluationFlags::gradients);
1517 scalar tau_IP = get_penalty_parameter(density_m, density_p);
1519 for(
unsigned int q = 0; q < density_m.n_q_points; ++q)
1521 std::tuple<scalar, vector, scalar> gradient_flux = get_gradient_flux(
1522 density_m, density_p, momentum_m, momentum_p, energy_m, energy_p, tau_IP, q);
1524 std::tuple<vector, tensor, vector, vector, tensor, vector> value_flux =
1525 get_value_flux(density_m, density_p, momentum_m, momentum_p, energy_m, energy_p, q);
1527 density_m.submit_value(-std::get<0>(gradient_flux), q);
1529 density_p.submit_value(std::get<0>(gradient_flux), q);
1531 momentum_m.submit_gradient(std::get<1>(value_flux), q);
1533 momentum_p.submit_gradient(std::get<4>(value_flux), q);
1535 momentum_m.submit_value(-std::get<1>(gradient_flux), q);
1537 momentum_p.submit_value(std::get<1>(gradient_flux), q);
1539 energy_m.submit_gradient(std::get<2>(value_flux), q);
1541 energy_p.submit_gradient(std::get<5>(value_flux), q);
1543 energy_m.submit_value(-std::get<2>(gradient_flux), q);
1545 energy_p.submit_value(std::get<2>(gradient_flux), q);
1548 density_m.integrate_scatter(dealii::EvaluationFlags::values, dst);
1549 density_p.integrate_scatter(dealii::EvaluationFlags::values, dst);
1551 momentum_m.integrate_scatter(dealii::EvaluationFlags::values |
1552 dealii::EvaluationFlags::gradients,
1554 momentum_p.integrate_scatter(dealii::EvaluationFlags::values |
1555 dealii::EvaluationFlags::gradients,
1558 energy_m.integrate_scatter(dealii::EvaluationFlags::values |
1559 dealii::EvaluationFlags::gradients,
1561 energy_p.integrate_scatter(dealii::EvaluationFlags::values |
1562 dealii::EvaluationFlags::gradients,
1568 boundary_face_loop(dealii::MatrixFree<dim, Number>
const & matrix_free,
1570 VectorType
const & src,
1571 std::pair<unsigned int, unsigned int>
const & face_range)
const
1573 FaceIntegratorScalar density(matrix_free,
true, data.dof_index, data.quad_index, 0);
1574 FaceIntegratorVector momentum(matrix_free,
true, data.dof_index, data.quad_index, 1);
1575 FaceIntegratorScalar energy(matrix_free,
true, data.dof_index, data.quad_index, 1 + dim);
1577 for(
unsigned int face = face_range.first; face < face_range.second; face++)
1579 density.reinit(face);
1580 density.gather_evaluate(src,
1581 dealii::EvaluationFlags::values | dealii::EvaluationFlags::gradients);
1583 momentum.reinit(face);
1584 momentum.gather_evaluate(src,
1585 dealii::EvaluationFlags::values |
1586 dealii::EvaluationFlags::gradients);
1588 energy.reinit(face);
1589 energy.gather_evaluate(src,
1590 dealii::EvaluationFlags::values | dealii::EvaluationFlags::gradients);
1592 scalar tau_IP = get_penalty_parameter(density);
1594 dealii::types::boundary_id boundary_id = matrix_free.get_boundary_id(face);
1596 BoundaryType boundary_type_density = data.bc->density.get_boundary_type(boundary_id);
1597 BoundaryType boundary_type_velocity = data.bc->velocity.get_boundary_type(boundary_id);
1598 BoundaryType boundary_type_energy = data.bc->energy.get_boundary_type(boundary_id);
1600 EnergyBoundaryVariable boundary_variable = data.bc->energy.get_boundary_variable(boundary_id);
1602 for(
unsigned int q = 0; q < density.n_q_points; ++q)
1604 std::tuple<scalar, vector, scalar> gradient_flux =
1605 get_gradient_flux_boundary(density,
1609 boundary_type_density,
1610 boundary_type_velocity,
1611 boundary_type_energy,
1616 std::tuple<vector, tensor, vector> value_flux =
1617 get_value_flux_boundary(density,
1620 boundary_type_density,
1621 boundary_type_velocity,
1622 boundary_type_energy,
1627 density.submit_value(-std::get<0>(gradient_flux), q);
1629 momentum.submit_gradient(std::get<1>(value_flux), q);
1630 momentum.submit_value(-std::get<1>(gradient_flux), q);
1632 energy.submit_gradient(std::get<2>(value_flux), q);
1633 energy.submit_value(-std::get<2>(gradient_flux), q);
1636 density.integrate_scatter(dealii::EvaluationFlags::values, dst);
1637 momentum.integrate_scatter(dealii::EvaluationFlags::values |
1638 dealii::EvaluationFlags::gradients,
1640 energy.integrate_scatter(dealii::EvaluationFlags::values | dealii::EvaluationFlags::gradients,
1645 dealii::MatrixFree<dim, Number>
const * matrix_free;
1649 unsigned int degree;
1669 dealii::AlignedVector<dealii::VectorizedArray<Number>> array_penalty_parameter;
1671 mutable Number eval_time;
1688class CombinedOperator
1691 typedef dealii::LinearAlgebra::distributed::Vector<Number> VectorType;
1695 typedef CombinedOperator<dim, Number> This;
1697 typedef CellIntegrator<dim, 1, Number> CellIntegratorScalar;
1698 typedef FaceIntegrator<dim, 1, Number> FaceIntegratorScalar;
1699 typedef CellIntegrator<dim, dim, Number> CellIntegratorVector;
1700 typedef FaceIntegrator<dim, dim, Number> FaceIntegratorVector;
1702 typedef dealii::VectorizedArray<Number> scalar;
1703 typedef dealii::Tensor<1, dim, dealii::VectorizedArray<Number>> vector;
1704 typedef dealii::Tensor<2, dim, dealii::VectorizedArray<Number>> tensor;
1705 typedef dealii::Point<dim, dealii::VectorizedArray<Number>> point;
1707 CombinedOperator() : matrix_free(
nullptr), convective_operator(
nullptr), viscous_operator(
nullptr)
1712 initialize(dealii::MatrixFree<dim, Number>
const & matrix_free_in,
1714 ConvectiveOp
const & convective_operator_in,
1715 ViscousOp
const & viscous_operator_in)
1717 this->matrix_free = &matrix_free_in;
1718 this->data = data_in;
1720 this->convective_operator = &convective_operator_in;
1721 this->viscous_operator = &viscous_operator_in;
1725 evaluate(VectorType & dst, VectorType
const & src, Number
const evaluation_time)
const
1728 evaluate_add(dst, src, evaluation_time);
1732 evaluate_add(VectorType & dst, VectorType
const & src, Number
const evaluation_time)
const
1734 convective_operator->set_evaluation_time(evaluation_time);
1735 viscous_operator->set_evaluation_time(evaluation_time);
1738 &This::cell_loop, &This::face_loop, &This::boundary_face_loop,
this, dst, src);
1746 cell_loop(dealii::MatrixFree<dim, Number>
const & matrix_free,
1748 VectorType
const & src,
1749 std::pair<unsigned int, unsigned int>
const & cell_range)
const
1751 CellIntegratorScalar density(matrix_free, data.dof_index, data.quad_index, 0);
1752 CellIntegratorVector momentum(matrix_free, data.dof_index, data.quad_index, 1);
1753 CellIntegratorScalar energy(matrix_free, data.dof_index, data.quad_index, 1 + dim);
1755 for(
unsigned int cell = cell_range.first; cell < cell_range.second; ++cell)
1757 density.reinit(cell);
1758 density.gather_evaluate(src,
1759 dealii::EvaluationFlags::values | dealii::EvaluationFlags::gradients);
1761 momentum.reinit(cell);
1762 momentum.gather_evaluate(src,
1763 dealii::EvaluationFlags::values |
1764 dealii::EvaluationFlags::gradients);
1766 energy.reinit(cell);
1767 energy.gather_evaluate(src,
1768 dealii::EvaluationFlags::values | dealii::EvaluationFlags::gradients);
1770 for(
unsigned int q = 0; q < momentum.n_q_points; ++q)
1772 std::tuple<vector, tensor, vector> conv_flux =
1773 convective_operator->get_volume_flux(density, momentum, energy, q);
1775 std::tuple<vector, tensor, vector> visc_flux =
1776 viscous_operator->get_volume_flux(density, momentum, energy, q);
1778 density.submit_gradient(-std::get<0>(conv_flux), q);
1779 momentum.submit_gradient(-std::get<1>(conv_flux) + std::get<1>(visc_flux), q);
1780 energy.submit_gradient(-std::get<2>(conv_flux) + std::get<2>(visc_flux), q);
1783 density.integrate_scatter(dealii::EvaluationFlags::gradients, dst);
1784 momentum.integrate_scatter(dealii::EvaluationFlags::gradients, dst);
1785 energy.integrate_scatter(dealii::EvaluationFlags::gradients, dst);
1790 face_loop(dealii::MatrixFree<dim, Number>
const & matrix_free,
1792 VectorType
const & src,
1793 std::pair<unsigned int, unsigned int>
const & face_range)
const
1795 FaceIntegratorScalar density_m(matrix_free,
true, data.dof_index, data.quad_index, 0);
1796 FaceIntegratorScalar density_p(matrix_free,
false, data.dof_index, data.quad_index, 0);
1797 FaceIntegratorVector momentum_m(matrix_free,
true, data.dof_index, data.quad_index, 1);
1798 FaceIntegratorVector momentum_p(matrix_free,
false, data.dof_index, data.quad_index, 1);
1799 FaceIntegratorScalar energy_m(matrix_free,
true, data.dof_index, data.quad_index, 1 + dim);
1800 FaceIntegratorScalar energy_p(matrix_free,
false, data.dof_index, data.quad_index, 1 + dim);
1802 for(
unsigned int face = face_range.first; face < face_range.second; face++)
1805 density_m.reinit(face);
1806 density_m.gather_evaluate(src,
1807 dealii::EvaluationFlags::values |
1808 dealii::EvaluationFlags::gradients);
1810 density_p.reinit(face);
1811 density_p.gather_evaluate(src,
1812 dealii::EvaluationFlags::values |
1813 dealii::EvaluationFlags::gradients);
1816 momentum_m.reinit(face);
1817 momentum_m.gather_evaluate(src,
1818 dealii::EvaluationFlags::values |
1819 dealii::EvaluationFlags::gradients);
1821 momentum_p.reinit(face);
1822 momentum_p.gather_evaluate(src,
1823 dealii::EvaluationFlags::values |
1824 dealii::EvaluationFlags::gradients);
1827 energy_m.reinit(face);
1828 energy_m.gather_evaluate(src,
1829 dealii::EvaluationFlags::values |
1830 dealii::EvaluationFlags::gradients);
1832 energy_p.reinit(face);
1833 energy_p.gather_evaluate(src,
1834 dealii::EvaluationFlags::values |
1835 dealii::EvaluationFlags::gradients);
1837 scalar tau_IP = viscous_operator->get_penalty_parameter(density_m, density_p);
1839 for(
unsigned int q = 0; q < density_m.n_q_points; ++q)
1841 std::tuple<scalar, vector, scalar> conv_flux = convective_operator->get_flux(
1842 density_m, density_p, momentum_m, momentum_p, energy_m, energy_p, q);
1844 std::tuple<scalar, vector, scalar> visc_grad_flux = viscous_operator->get_gradient_flux(
1845 density_m, density_p, momentum_m, momentum_p, energy_m, energy_p, tau_IP, q);
1847 std::tuple<vector, tensor, vector, vector, tensor, vector> visc_value_flux =
1848 viscous_operator->get_value_flux(
1849 density_m, density_p, momentum_m, momentum_p, energy_m, energy_p, q);
1851 density_m.submit_value(std::get<0>(conv_flux) - std::get<0>(visc_grad_flux), q);
1853 density_p.submit_value(-std::get<0>(conv_flux) + std::get<0>(visc_grad_flux), q);
1855 momentum_m.submit_value(std::get<1>(conv_flux) - std::get<1>(visc_grad_flux), q);
1857 momentum_p.submit_value(-std::get<1>(conv_flux) + std::get<1>(visc_grad_flux), q);
1859 momentum_m.submit_gradient(std::get<1>(visc_value_flux), q);
1861 momentum_p.submit_gradient(std::get<4>(visc_value_flux), q);
1863 energy_m.submit_value(std::get<2>(conv_flux) - std::get<2>(visc_grad_flux), q);
1865 energy_p.submit_value(-std::get<2>(conv_flux) + std::get<2>(visc_grad_flux), q);
1867 energy_m.submit_gradient(std::get<2>(visc_value_flux), q);
1869 energy_p.submit_gradient(std::get<5>(visc_value_flux), q);
1872 density_m.integrate_scatter(dealii::EvaluationFlags::values, dst);
1873 density_p.integrate_scatter(dealii::EvaluationFlags::values, dst);
1875 momentum_m.integrate_scatter(dealii::EvaluationFlags::values |
1876 dealii::EvaluationFlags::gradients,
1878 momentum_p.integrate_scatter(dealii::EvaluationFlags::values |
1879 dealii::EvaluationFlags::gradients,
1882 energy_m.integrate_scatter(dealii::EvaluationFlags::values |
1883 dealii::EvaluationFlags::gradients,
1885 energy_p.integrate_scatter(dealii::EvaluationFlags::values |
1886 dealii::EvaluationFlags::gradients,
1892 boundary_face_loop(dealii::MatrixFree<dim, Number>
const & matrix_free,
1894 VectorType
const & src,
1895 std::pair<unsigned int, unsigned int>
const & face_range)
const
1897 FaceIntegratorScalar density(matrix_free,
true, data.dof_index, data.quad_index, 0);
1898 FaceIntegratorVector momentum(matrix_free,
true, data.dof_index, data.quad_index, 1);
1899 FaceIntegratorScalar energy(matrix_free,
true, data.dof_index, data.quad_index, 1 + dim);
1901 for(
unsigned int face = face_range.first; face < face_range.second; face++)
1903 density.reinit(face);
1904 density.gather_evaluate(src,
1905 dealii::EvaluationFlags::values | dealii::EvaluationFlags::gradients);
1907 momentum.reinit(face);
1908 momentum.gather_evaluate(src,
1909 dealii::EvaluationFlags::values |
1910 dealii::EvaluationFlags::gradients);
1912 energy.reinit(face);
1913 energy.gather_evaluate(src,
1914 dealii::EvaluationFlags::values | dealii::EvaluationFlags::gradients);
1916 scalar tau_IP = viscous_operator->get_penalty_parameter(density);
1918 dealii::types::boundary_id boundary_id = matrix_free.get_boundary_id(face);
1920 BoundaryType boundary_type_density = data.bc->density.get_boundary_type(boundary_id);
1921 BoundaryType boundary_type_velocity = data.bc->velocity.get_boundary_type(boundary_id);
1922 BoundaryType boundary_type_pressure = data.bc->pressure.get_boundary_type(boundary_id);
1923 BoundaryType boundary_type_energy = data.bc->energy.get_boundary_type(boundary_id);
1925 EnergyBoundaryVariable boundary_variable = data.bc->energy.get_boundary_variable(boundary_id);
1927 for(
unsigned int q = 0; q < density.n_q_points; ++q)
1929 std::tuple<scalar, vector, scalar> conv_flux =
1930 convective_operator->get_flux_boundary(density,
1933 boundary_type_density,
1934 boundary_type_velocity,
1935 boundary_type_pressure,
1936 boundary_type_energy,
1941 std::tuple<scalar, vector, scalar> visc_grad_flux =
1942 viscous_operator->get_gradient_flux_boundary(density,
1946 boundary_type_density,
1947 boundary_type_velocity,
1948 boundary_type_energy,
1953 std::tuple<vector, tensor, vector> visc_value_flux =
1954 viscous_operator->get_value_flux_boundary(density,
1957 boundary_type_density,
1958 boundary_type_velocity,
1959 boundary_type_energy,
1964 density.submit_value(std::get<0>(conv_flux) - std::get<0>(visc_grad_flux), q);
1966 momentum.submit_value(std::get<1>(conv_flux) - std::get<1>(visc_grad_flux), q);
1967 momentum.submit_gradient(std::get<1>(visc_value_flux), q);
1969 energy.submit_value(std::get<2>(conv_flux) - std::get<2>(visc_grad_flux), q);
1970 energy.submit_gradient(std::get<2>(visc_value_flux), q);
1973 density.integrate_scatter(dealii::EvaluationFlags::values, dst);
1974 momentum.integrate_scatter(dealii::EvaluationFlags::values |
1975 dealii::EvaluationFlags::gradients,
1977 energy.integrate_scatter(dealii::EvaluationFlags::values | dealii::EvaluationFlags::gradients,
1982 dealii::MatrixFree<dim, Number>
const * matrix_free;