62 const DofValueAndGradientStateView &liquid_state,
63 const DofValueAndGradientStateView &gas_state,
65 const number &m_dot_evap,
66 const number &laser_heat_source)
69 dealii::ExcNotImplemented(
70 "Currently, only dim=1 is enabled for "
71 "enforcing interface jump conditions with the penalty method."));
74 using Idx = std::conditional_t<
76 CompressibleFlow::Idx1D,
77 std::conditional_t<dim == 2,
78 CompressibleFlow::Idx2D,
79 std::conditional_t<dim == 3, CompressibleFlow::Idx3D, void>>>;
81 ConservedVariablesType total_flux_liquid;
82 ConservedVariablesType total_flux_gas;
85 const dealii::VectorizedArray<number> omega_mass_1 = 0.5;
86 const dealii::VectorizedArray<number> omega_mass_2 = 1. - omega_mass_1;
92 const dealii::VectorizedArray<number> interface_mass_flux_conservation_term =
93 (liquid_state.density() / gas_state.density() * gas_state.momentum(0) -
94 gas_state.density() / liquid_state.density() * liquid_state.momentum(0) +
95 (gas_state.density() * gas_state.density() -
96 liquid_state.density() * liquid_state.density()) /
97 (liquid_state.density() * gas_state.density()) * m_dot_evap);
99 total_flux_liquid[Idx::density] = omega_mass_1 * interface_mass_flux_conservation_term;
100 total_flux_gas[Idx::density] = omega_mass_2 * interface_mass_flux_conservation_term;
102 const dealii::VectorizedArray<number> weighted_average_momentum =
104 gas_state.momentum(0),
106 liquid_state.momentum(0));
108 total_flux_liquid[Idx::density] += weighted_average_momentum;
109 total_flux_gas[Idx::density] -= weighted_average_momentum;
113 const dealii::VectorizedArray<number> penalty_gas_density =
114 multiphase_scratch_data.
phase_coupling.penalty.coefficients.density *
115 (gas_state.density() -
116 multiphase_scratch_data.
phase_coupling.penalty.target_values.density_gas_phase);
118 total_flux_gas[Idx::density] += penalty_gas_density;
125 const dealii::VectorizedArray<number> omega_mom_1_conv = 0.5;
126 const dealii::VectorizedArray<number> omega_mom_2_conv = 1. - omega_mom_1_conv;
128 const dealii::VectorizedArray<number> omega_mom_1_visc =
129 liquid_state.dynamic_viscosity() /
130 (liquid_state.dynamic_viscosity() + gas_state.dynamic_viscosity());
131 const dealii::VectorizedArray<number> omega_mom_2_visc = 1. - omega_mom_1_visc;
135 const dealii::Tensor<2, dim, dealii::VectorizedArray<number>> viscous_stress_tensor_liquid =
136 CompressibleFlow::viscous_stress_tensor<dim, number>(liquid_state.grad_velocity(),
137 liquid_state.dynamic_viscosity());
138 const dealii::Tensor<2, dim, dealii::VectorizedArray<number>> viscous_stress_tensor_gas =
139 CompressibleFlow::viscous_stress_tensor<dim, number>(gas_state.grad_velocity(),
140 gas_state.dynamic_viscosity());
142 const dealii::VectorizedArray<number> stress_tensor_liquid =
144 viscous_stress_tensor_liquid)[0][0];
145 const dealii::VectorizedArray<number> stress_tensor_gas =
147 viscous_stress_tensor_gas)[0][0];
149 const dealii::VectorizedArray<number> jump_momentum_term_liquid =
150 liquid_state.momentum(0) * liquid_state.momentum(0) / liquid_state.density();
151 const dealii::VectorizedArray<number> jump_momentum_term_gas =
152 gas_state.momentum(0) * gas_state.momentum(0) / gas_state.density();
154 total_flux_liquid[Idx::momentum_x] +=
155 omega_mom_1_conv * (jump_momentum_term_liquid - jump_momentum_term_gas);
156 total_flux_gas[Idx::momentum_x] +=
157 omega_mom_2_conv * (jump_momentum_term_liquid - jump_momentum_term_gas);
159 const dealii::VectorizedArray<number> average_momentum_term_1 =
161 jump_momentum_term_liquid,
163 jump_momentum_term_gas);
165 total_flux_liquid[Idx::momentum_x] += average_momentum_term_1;
166 total_flux_gas[Idx::momentum_x] -= average_momentum_term_1;
168 const dealii::VectorizedArray<number> jump_momentum_term_2 =
169 -(liquid_state.momentum(0) / liquid_state.density() -
170 gas_state.momentum(0) / gas_state.density()) *
173 const dealii::VectorizedArray<number> average_momentum_term_2 =
175 -stress_tensor_liquid,
179 total_flux_liquid[Idx::momentum_x] +=
180 jump_momentum_term_2 * omega_mom_1_visc + average_momentum_term_2;
181 total_flux_gas[Idx::momentum_x] +=
182 jump_momentum_term_2 * omega_mom_2_visc - average_momentum_term_2;
189 const dealii::VectorizedArray<number> omega_energy_1_conv = 0.5;
190 const dealii::VectorizedArray<number> omega_energy_2_conv = 1. - omega_energy_1_conv;
192 const dealii::VectorizedArray<number> omega_energy_1_visc =
193 liquid_state.dynamic_viscosity() /
194 (liquid_state.dynamic_viscosity() + gas_state.dynamic_viscosity());
195 const dealii::VectorizedArray<number> omega_energy_2_visc = 1. - omega_energy_1_visc;
198 const dealii::VectorizedArray<number> vel_liquid = liquid_state.velocity(0);
199 const dealii::VectorizedArray<number> vel_gas = gas_state.velocity(0);
201 const dealii::VectorizedArray<number> jump_energy_term_1 =
202 (liquid_state.total_energy() * vel_liquid - gas_state.total_energy() * vel_gas);
204 const dealii::VectorizedArray<number> average_energy_term_1 =
206 liquid_state.total_energy() *
209 gas_state.total_energy() *
212 total_flux_liquid[Idx::energy] =
213 jump_energy_term_1 * omega_energy_1_conv + average_energy_term_1;
214 total_flux_gas[Idx::energy] = jump_energy_term_1 * omega_energy_2_conv - average_energy_term_1;
216 const dealii::VectorizedArray<number> jump_energy_term_2 =
217 -m_dot_evap * (liquid_state.total_energy() / liquid_state.density() -
218 gas_state.total_energy() / gas_state.density()) -
220 m_dot_evap * multiphase_scratch_data.
phase_change.liquid_gas.latent_heat_of_vaporization;
222 total_flux_liquid[Idx::energy] += jump_energy_term_2 * omega_energy_1_visc;
223 total_flux_gas[Idx::energy] += jump_energy_term_2 * omega_energy_2_visc;
225 const dealii::VectorizedArray<number> weighted_average_energy_term_liquid =
226 -stress_tensor_liquid * vel_liquid -
227 liquid_state.thermal_conductivity() * liquid_state.grad_temperature()[0];
228 const dealii::VectorizedArray<number> weighted_average_energy_term_gas =
229 -stress_tensor_gas * vel_gas -
230 gas_state.thermal_conductivity() * gas_state.grad_temperature()[0];
231 const dealii::VectorizedArray<number> weighted_average_energy_term =
234 weighted_average_energy_term_liquid,
236 weighted_average_energy_term_gas);
238 total_flux_liquid[Idx::energy] += weighted_average_energy_term;
239 total_flux_gas[Idx::energy] -= weighted_average_energy_term;
242 const dealii::VectorizedArray<number> temperature_gas = gas_state.temperature();
244 const dealii::VectorizedArray<number> penalty_gas_temperature =
245 multiphase_scratch_data.
phase_coupling.penalty.coefficients.temperature *
247 multiphase_scratch_data.
phase_coupling.penalty.target_values.temperature_gas_phase);
249 total_flux_gas[Idx::energy] += penalty_gas_temperature;
251 return {total_flux_liquid, total_flux_gas};
293 const DofStateView &liquid_state,
294 const DofStateView &gas_state,
295 const dealii::Tensor<1, dim, dealii::VectorizedArray<number>> &normal,
296 const ConvectiveKernel &convective_kernel_liquid,
297 const ConvectiveKernel &convective_kernel_gas,
298 const number &m_dot_evap)
304 constexpr int gas = 1;
307 using Idx = std::conditional_t<
309 CompressibleFlow::Idx1D,
310 std::conditional_t<dim == 2,
311 CompressibleFlow::Idx2D,
312 std::conditional_t<dim == 3, CompressibleFlow::Idx3D, void>>>;
316 std::array<DofStateView, 2> state = {{liquid_state, gas_state}};
317 std::array<dealii::Tensor<1, dim, dealii::VectorizedArray<number>>, 2> vel;
318 std::array<dealii::VectorizedArray<number>, 2> pressure;
319 std::array<dealii::VectorizedArray<number>, 2> rho;
320 std::array<dealii::VectorizedArray<number>, 2> rho_E;
321 std::array<dealii::VectorizedArray<number>, 2> speed_of_sound;
322 for (
unsigned int i : {0, 1})
324 vel[i] = state[i].velocity();
325 rho[i] = state[i].density();
326 rho_E[i] = state[i].total_energy();
327 pressure[i] = state[i].pressure();
328 speed_of_sound[i] = state[i].speed_of_sound();
333 std::array<dealii::VectorizedArray<number>, 2> vel_n;
334 std::array<dealii::VectorizedArray<number>, 2> E_n;
335 for (
unsigned int i : {0, 1})
337 vel_n[i] = vel[i] * normal;
338 E_n[i] = rho_E[i] / rho[i] - 0.5 * (vel[i] * vel[i] - vel_n[i] * vel_n[i]);
343 std::array<dealii::VectorizedArray<number>, 2> shock_speed;
345 shock_speed[
gas] = vel_n[
gas] + speed_of_sound[
gas];
349 std::array<dealii::VectorizedArray<number>, 2> m_hat;
350 std::array<dealii::VectorizedArray<number>, 2> I_hat;
351 std::array<dealii::VectorizedArray<number>, 2> E_hat;
352 for (
unsigned int i : {0, 1})
354 m_hat[i] = rho[i] * (vel_n[i] - shock_speed[i]);
355 I_hat[i] = m_hat[i] * vel_n[i] + pressure[i];
356 E_hat[i] = m_hat[i] * E_n[i] + pressure[i] * vel_n[i];
362 const dealii::VectorizedArray<number> delta_p = 0.;
365 std::array<dealii::VectorizedArray<number>, 2> tmp_1;
366 std::array<dealii::VectorizedArray<number>, 2> tmp_2;
367 for (
unsigned int i : {0, 1})
369 tmp_1[i] = m_dot_evap / m_hat[i];
370 tmp_2[i] = m_dot_evap - m_hat[i];
373 std::array<dealii::VectorizedArray<number>, 2> numerator;
374 std::array<dealii::VectorizedArray<number>, 2> denominator;
387 std::array<dealii::VectorizedArray<number>, 2> vel_n_star;
388 for (
unsigned int i : {0, 1})
389 vel_n_star[i] = numerator[i] / denominator[i];
393 std::array<dealii::VectorizedArray<number>, 2> pressure_star;
394 for (
unsigned int i : {0, 1})
395 pressure_star[i] = I_hat[i] - m_hat[i] * vel_n_star[i];
399 std::array<dealii::Tensor<1, dim, dealii::VectorizedArray<number>>, 2> vel_star_cartesian;
401 std::vector<dealii::Tensor<1, dim, dealii::VectorizedArray<number>>> tangent;
402 tangent.resize(dim - 1);
405 if constexpr (dim == 2)
407 tangent[0][0] = normal[1];
408 tangent[0][1] = -normal[0];
410 else if constexpr (dim == 3)
412 dealii::Tensor<1, dim, dealii::VectorizedArray<number>> temp_vec;
416 dealii::VectorizedArray<number> tolerance = 1.e-10;
417 dealii::VectorizedArray<number> norm_diff = (temp_vec - normal).norm();
418 dealii::Tensor<1, dim, dealii::VectorizedArray<number>> temp_vec_y;
420 for (
int i = 0; i < 3; ++i)
422 temp_vec[i] = compare_and_apply_mask<dealii::SIMDComparison::less_than>(norm_diff,
427 tangent[0] = temp_vec - (temp_vec * normal) * normal;
428 tangent[1] = dealii::cross_product_3d(normal, tangent[0]);
431 for (
unsigned int i : {0, 1})
433 vel_star_cartesian[i] = vel_n_star[i] * normal;
434 for (
unsigned int j = 0; j < dim - 1; ++j)
435 vel_star_cartesian[i] += (vel[i] * tangent[j]) * tangent[j];
440 std::array<ConservedVariablesType, 2> u_star;
441 for (
unsigned int i : {0, 1})
443 u_star[i][Idx::density] = m_hat[i] / (vel_n_star[i] - shock_speed[i]);
444 for (
unsigned int j = 1; j < dim + 1; j++)
445 u_star[i][j] = u_star[i][Idx::density] * vel_star_cartesian[i][j - 1];
446 u_star[i][Idx::energy] =
447 (E_hat[i] - pressure_star[i] * vel_n_star[i]) / (vel_n_star[i] - shock_speed[i]) -
448 0.5 * u_star[i][Idx::density] * vel_n_star[i] * vel_n_star[i] +
449 0.5 * u_star[i][Idx::density] * vel_star_cartesian[i] * vel_star_cartesian[i];
454 dealii::VectorizedArray<number> numerator_normal_vel =
456 vel_n_star[
gas] * u_star[
gas][Idx::density];
457 dealii::VectorizedArray<number> denominator_normal_vel =
458 u_star[
liquid][Idx::density] - u_star[
gas][Idx::density];
460 dealii::VectorizedArray<number> normal_velocity_interface =
461 compare_and_apply_mask<dealii::SIMDComparison::greater_than>(std::abs(denominator_normal_vel),
463 numerator_normal_vel /
464 denominator_normal_vel,
469 std::array<ConservedVariablesGradType, 2> flux;
470 std::array<ConservedVariablesGradType, 2> conv_flux;
471 std::array<ConservedVariablesGradType, 2> shock_flux;
473 conv_flux[
liquid] = convective_kernel_liquid.flux(state[
liquid].value());
474 conv_flux[
gas] = convective_kernel_gas.flux(state[
gas].value());
476 for (
unsigned int i : {0, 1})
478 shock_flux[i] =
dyadic_product(shock_speed[i] * (u_star[i] - state[i].value()), normal);
479 flux[i] = conv_flux[i];
482 const auto zero_vec = dealii::make_vectorized_array(0.);
483 const auto one_vec = dealii::make_vectorized_array(1.);
486 shock_flux[
liquid] * compare_and_apply_mask<dealii::SIMDComparison::greater_than>(
487 shock_speed[
liquid], zero_vec, zero_vec, one_vec);
489 shock_flux[
gas] * compare_and_apply_mask<dealii::SIMDComparison::less_than_or_equal>(
490 shock_speed[
gas], zero_vec, zero_vec, one_vec);
492 return {flux[
liquid], flux[
gas], normal_velocity_interface};
528 const DofStateView &liquid_cons_view,
529 const DofStateView &gas_cons_view,
531 const number &m_dot_evap,
532 const number &delta_T)
534 ConservedVariablesType liquid_prim_data;
535 ConservedVariablesType gas_prim_data;
536 DofPrimitiveValueView liquid_prim_view(liquid_prim_data);
537 DofPrimitiveValueView gas_prim_view(gas_prim_data);
539 CompressibleFlow::conservative_to_primitive<dim, DofStateView, DofPrimitiveValueView>(
540 liquid_cons_view, liquid_prim_view);
541 CompressibleFlow::conservative_to_primitive<dim, DofStateView, DofPrimitiveValueView>(
542 gas_cons_view, gas_prim_view);
545 const dealii::VectorizedArray<number> delta_p = 0.;
548 ConservedVariablesType J_Dir;
552 J_Dir[Idx::pressure] =
553 delta_p - m_dot_evap * (liquid_prim_view.velocity(0) - gas_prim_view.velocity(0));
554 J_Dir[Idx::velocity] =
555 m_dot_evap * (1. / liquid_cons_view.density() - 1. / gas_cons_view.density());
556 J_Dir[Idx::temperature] = delta_T;
558 const ConservedVariablesType liquid_prim_tmp = liquid_prim_view.value();
560 liquid_prim_view.value() = gas_prim_view.value() + J_Dir;
561 gas_prim_view.value() = liquid_prim_tmp - J_Dir;
563 ConservedVariablesType liquid_cons_star_data;
564 ConservedVariablesType gas_cons_star_data;
565 DofValueView liquid_cons_view_star(liquid_cons_star_data);
566 DofValueView gas_cons_view_star(gas_cons_star_data);
568 CompressibleFlow::primitive_to_conservative<dim, DofValueView, DofPrimitiveStateView>(
569 DofPrimitiveStateView(liquid_prim_view.value(), multiphase_scratch_data.
material_liquid),
570 liquid_cons_view_star);
571 CompressibleFlow::primitive_to_conservative<dim, DofValueView, DofPrimitiveStateView>(
572 DofPrimitiveStateView(gas_prim_view.value(), multiphase_scratch_data.
material_gas),
575 J_Dir = liquid_cons_view_star.value() - gas_cons_view_star.value();
624 const DofStateView &liquid_state,
625 const DofStateView &gas_state,
626 const dealii::Tensor<1, dim, dealii::VectorizedArray<number>> &normal,
627 const number &visc_ave_weight_phase_liquid,
628 const number &visc_ave_weight_phase_gas,
630 const DiffusiveKernel &diffusive_kernel_liquid,
631 const DiffusiveKernel &diffusive_kernel_gas,
633 const number &cell_size,
634 const number &m_dot_evap,
635 const number &delta_T,
636 const number &laser_heat_source)
639 using Idx = std::conditional_t<
641 CompressibleFlow::Idx1D,
642 std::conditional_t<dim == 2,
643 CompressibleFlow::Idx2D,
644 std::conditional_t<dim == 3, CompressibleFlow::Idx3D, void>>>;
649 const dealii::Tensor<1, dim, dealii::VectorizedArray<number>> vel_liquid =
650 liquid_state.velocity();
651 const dealii::Tensor<1, dim, dealii::VectorizedArray<number>> vel_gas = gas_state.velocity();
653 const dealii::VectorizedArray<number> vel_n_liquid = vel_liquid * normal;
654 const dealii::VectorizedArray<number> vel_n_gas = vel_gas * normal;
656 const auto pressure_liquid = liquid_state.pressure();
657 const auto pressure_gas = gas_state.pressure();
661 ConservedVariablesType J_Rob;
665 (pressure_liquid * vel_n_liquid - pressure_gas * vel_n_gas) +
666 m_dot_evap * (liquid_state.total_energy() / liquid_state.density() -
667 gas_state.total_energy() / gas_state.density()) +
669 m_dot_evap * multiphase_scratch_data.
phase_change.liquid_gas.latent_heat_of_vaporization;
671 const ConservedVariablesGradType viscous_flux_liquid =
672 diffusive_kernel_liquid.flux(liquid_state.value(), liquid_state.gradient_value());
674 const ConservedVariablesGradType viscous_flux_gas =
675 diffusive_kernel_gas.flux(gas_state.value(), gas_state.gradient_value());
677 ConservedVariablesGradType total_flux_liquid =
dyadic_product(J_Rob, normal);
678 total_flux_liquid += viscous_flux_gas;
679 total_flux_liquid *= visc_ave_weight_phase_liquid;
680 total_flux_liquid += visc_ave_weight_phase_gas * viscous_flux_liquid;
682 ConservedVariablesGradType total_flux_gas =
684 total_flux_gas += viscous_flux_liquid;
685 total_flux_gas *= visc_ave_weight_phase_gas;
686 total_flux_gas += visc_ave_weight_phase_liquid * viscous_flux_gas;
690 const auto J_Dir_cons =
693 ConservedVariablesType,
696 DofPrimitiveValueView,
697 DofPrimitiveStateView>(
698 liquid_state, gas_state, multiphase_scratch_data, m_dot_evap, delta_T);
700 const number penalty_parameter =
701 std::min(liquid_state.dynamic_viscosity() /
703 gas_state.dynamic_viscosity() /
704 multiphase_scratch_data.
material_gas.reference_density) *
705 (multiphase_scratch_data.
flow_data.fe.degree + 1.) *
706 (multiphase_scratch_data.
flow_data.fe.degree + 1.) / cell_size * tau;
708 ConservedVariablesGradType penalty_flux_liquid;
709 const auto tmp_m = liquid_state.value() - (gas_state.value() + J_Dir_cons);
711 penalty_flux_liquid *= penalty_parameter;
713 ConservedVariablesGradType penalty_flux_gas;
714 const auto tmp_p = gas_state.value() - (liquid_state.value() - J_Dir_cons);
716 penalty_flux_gas *= penalty_parameter;
718 total_flux_liquid -= penalty_flux_liquid;
719 total_flux_gas -= penalty_flux_gas;
721 return {contract_tensor_with_vector<CompressibleFlow::n_conserved_variables<dim>, dim, number>(
722 total_flux_liquid, normal),
724 total_flux_gas, normal)};
769 const DofStateView &liquid_state,
770 const DofStateView &gas_state,
771 const dealii::Tensor<1, dim, dealii::VectorizedArray<number>> &normal,
772 const number &visc_ave_weight_phase_liquid,
773 const number &visc_ave_weight_phase_gas,
774 const DiffusiveKernel &diffusive_kernel_liquid,
775 const DiffusiveKernel &diffusive_kernel_gas,
777 const number &m_dot_evap,
778 const number &delta_T)
780 const auto J_Dir_cons =
783 ConservedVariablesType,
786 DofPrimitiveValueView,
787 DofPrimitiveStateView>(
788 liquid_state, gas_state, multiphase_scratch_data, m_dot_evap, delta_T);
790 const auto u_liquid_star =
792 liquid_state.value(),
793 visc_ave_weight_phase_liquid,
794 gas_state.value() + J_Dir_cons);
795 const auto u_gas_star =
798 visc_ave_weight_phase_gas,
799 liquid_state.value() -
802 auto tmp_liquid = u_liquid_star - liquid_state.value();
803 auto tmp_gas = u_gas_star - gas_state.value();
805 ConservedVariablesGradType arg_liquid =
dyadic_product(tmp_liquid, normal);
806 ConservedVariablesGradType arg_gas =
dyadic_product(tmp_gas, -normal);
808 const ConservedVariablesGradType flux_grad_liquid =
809 diffusive_kernel_liquid.flux(liquid_state.value(), arg_liquid);
810 const ConservedVariablesGradType flux_grad_gas =
811 diffusive_kernel_gas.flux(gas_state.value(), arg_gas);
813 return {flux_grad_liquid, flux_grad_gas};
859 const DofValueAndGradientStateView &liquid_state,
860 const DofValueAndGradientStateView &gas_state,
861 const dealii::Tensor<1, dim, dealii::VectorizedArray<number>> &normal,
862 const number &visc_ave_weight_phase_liquid,
863 const number &visc_ave_weight_phase_gas,
864 const DiffusiveKernel &diffusive_kernel_liquid,
865 const DiffusiveKernel &diffusive_kernel_gas,
867 const number &cell_size,
868 const number &m_dot_evap,
869 const number &delta_T,
870 const number &laser_heat_source)
873 using Idx = std::conditional_t<
875 CompressibleFlow::Idx1D,
876 std::conditional_t<dim == 2,
877 CompressibleFlow::Idx2D,
878 std::conditional_t<dim == 3, CompressibleFlow::Idx3D, void>>>;
880 const dealii::Tensor<1, dim, dealii::VectorizedArray<number>> vel_liquid =
881 liquid_state.velocity();
882 const dealii::Tensor<1, dim, dealii::VectorizedArray<number>> vel_gas = gas_state.velocity();
884 const dealii::VectorizedArray<number> vel_n_liquid = vel_liquid * normal;
885 const dealii::VectorizedArray<number> vel_n_gas = vel_gas * normal;
887 const dealii::VectorizedArray<number> pressure_liquid = liquid_state.pressure();
888 const dealii::VectorizedArray<number> pressure_gas = gas_state.pressure();
893 ConservedVariablesType J_Rob;
896 m_dot_evap * (liquid_state.total_energy() / liquid_state.density() -
897 gas_state.total_energy() / gas_state.density()) +
898 (pressure_liquid * vel_n_liquid - pressure_gas * vel_n_gas) + laser_heat_source -
899 m_dot_evap * multiphase_scratch_data.
phase_change.liquid_gas.latent_heat_of_vaporization;
901 const ConservedVariablesGradType viscous_flux_liquid =
902 diffusive_kernel_liquid.flux(liquid_state.value(), liquid_state.gradient_value());
904 const ConservedVariablesGradType viscous_flux_gas =
905 diffusive_kernel_gas.flux(gas_state.value(), gas_state.gradient_value());
907 ConservedVariablesType penalty_term_dT;
908 penalty_term_dT[Idx::energy] =
909 multiphase_scratch_data.
phase_coupling.hllp0_and_penalty.penalty_parameter_temperature_jump *
910 (liquid_state.thermal_conductivity() + gas_state.thermal_conductivity()) / (2. * cell_size) *
911 ((liquid_state.temperature() - gas_state.temperature()) - delta_T);
913 const ConservedVariablesType weighted_viscous_flux =
915 visc_ave_weight_phase_gas,
917 viscous_flux_liquid, normal),
918 visc_ave_weight_phase_liquid,
920 viscous_flux_gas, normal));
922 const ConservedVariablesType total_viscous_flux_liquid =
923 -J_Rob * visc_ave_weight_phase_liquid - weighted_viscous_flux + penalty_term_dT;
925 const ConservedVariablesType total_viscous_flux_gas =
926 -J_Rob * visc_ave_weight_phase_gas + weighted_viscous_flux - penalty_term_dT;
928 return {total_viscous_flux_liquid, total_viscous_flux_gas};
978 const DofStateView &liquid_state,
979 const DofStateView &gas_state,
980 const dealii::Tensor<1, dim, dealii::VectorizedArray<number>> &normal,
984 number m_dot_evap = 0.;
987 if (evaporation_model_knight)
989 const dealii::VectorizedArray<number> T_liquid = liquid_state.temperature();
991 const dealii::VectorizedArray<number> vel_n_gas = gas_state.velocity() * normal;
993 const dealii::VectorizedArray<number> speed_of_sound_g = gas_state.temperature();
995 const dealii::VectorizedArray<number> Ma_g = vel_n_gas / speed_of_sound_g;
998 evaporation_model_knight->reinit(T_liquid[0], Ma_g[0]);
999 m_dot_evap = evaporation_model_knight->get_evaporative_mass_flux();
1000 delta_T = evaporation_model_knight->get_temperature_jump();
1002 else if (multiphase_scratch_data.
phase_coupling.evaporation_model ==
1003 EvaporationModelType::constant)
1009 case InterfaceNumericalMethod::HLLP0_and_SIPG:
1010 delta_T = multiphase_scratch_data.
phase_coupling.hllp0_and_sipg.delta_T;
1013 case InterfaceNumericalMethod::HLLP0_and_penalty:
1014 delta_T = multiphase_scratch_data.
phase_coupling.hllp0_and_penalty.delta_T;
1024 dealii::ExcNotImplemented(
"The given evaporation model is not implemented."));
1027 return {m_dot_evap, delta_T};