1#include <deal.II/base/vectorization.h>
8 template <
int dim,
typename number>
9 template <
typename DofReadView,
typename DofWriteView>
14 const dealii::Tensor<1, dim, dealii::VectorizedArray<number>> &normal)
const
17 w_p.density() = w_m.density();
18 w_p.grad_density() = -(w_m.grad_density());
22 for (
unsigned int d = 0; d < dim; ++d)
23 rho_u_dot_n += w_m.momentum(d) * normal[d];
25 for (
unsigned int d = 0; d < dim; ++d)
27 w_p.momentum(d) = w_m.momentum(d) - 2. * rho_u_dot_n * normal[d];
28 w_p.grad_momentum(d) =
29 w_m.grad_momentum(d) - 2. *
scalar_product(w_m.grad_momentum(d), normal) * normal;
32 w_p.grad_total_energy() = -(w_m.grad_total_energy());
33 w_p.total_energy() = w_m.total_energy();
36 template <
int dim,
typename number>
37 template <
typename DofReadView,
typename DofWriteView>
41 DofWriteView w_p)
const
44 w_p.density() = w_m.density();
45 w_p.grad_density() = -(w_m.grad_density());
48 for (
unsigned int d = 0; d < dim; ++d)
51 w_p.grad_momentum(d) = w_m.grad_momentum(d);
54 w_p.grad_total_energy() = -(w_m.grad_total_energy());
55 w_p.total_energy() = w_m.total_energy();
58 template <
int dim,
typename number>
59 template <
typename DofReadView,
typename DofWriteView,
typename DirichletValueInterpretation>
62 const dealii::types::boundary_id boundary_id,
63 const dealii::Point<dim, dealii::VectorizedArray<number>> &q_point,
68 w_p.density() = get_boundary_value(boundary_id,
71 DirichletValueInterpretation::density);
72 w_p.grad_density() = w_m.grad_density();
74 for (
unsigned int d = 0; d < dim; ++d)
76 w_p.momentum(d) = get_boundary_value(boundary_id,
79 DirichletValueInterpretation::velocity + d);
80 w_p.grad_momentum(d) = w_m.grad_momentum(d);
84 get_boundary_value(boundary_id, bc_value_type, q_point, DirichletValueInterpretation::energy);
85 w_p.grad_total_energy() = w_m.grad_total_energy();
88 template <
int dim,
typename number>
89 template <
typename DofReadView,
typename DofWriteView>
93 const dealii::types::boundary_id boundary_id,
94 const dealii::Point<dim, dealii::VectorizedArray<number>> &q_point,
96 DofWriteView w_p)
const
99 w_p.density() = w_m.density();
100 w_p.grad_density() = -(w_m.grad_density());
103 auto p_dyn = dealii::VectorizedArray<number>(0.);
104 for (
unsigned int i = 0; i < dim; ++i)
105 p_dyn += w_m.momentum(i) * w_m.momentum(i);
107 p_dyn /= (w_m.density() * 2.);
108 const dealii::VectorizedArray<number> pressure =
109 get_boundary_value(boundary_id, BoundaryType::subsonic_outflow_fixed_pressure, q_point, 0);
112 const dealii::VectorizedArray<number> inner_energy = w_m.inner_energy_from_pressure(pressure);
114 w_p.total_energy() = inner_energy + p_dyn;
115 w_p.grad_total_energy() = w_m.grad_total_energy();
118 template <
int dim,
typename number>
119 template <
typename DofReadView,
typename DofWriteView>
123 const dealii::types::boundary_id boundary_id,
124 const dealii::Point<dim, dealii::VectorizedArray<number>> &q_point,
126 DofWriteView w_p)
const
129 w_p.density() = w_m.density();
130 w_p.grad_density() = -(w_m.grad_density());
131 for (
unsigned int i = 0; i < dim; ++i)
133 w_p.momentum(i) = w_m.momentum(i);
134 w_p.grad_momentum(i) = -(w_m.grad_momentum(i));
139 get_boundary_value(boundary_id, BoundaryType::subsonic_outflow_fixed_energy, q_point, 0);
140 w_p.grad_total_energy() = w_m.grad_total_energy();
143 template <
int dim,
typename number>
144 template <
typename DofReadView,
typename DofWriteView>
148 const dealii::types::boundary_id boundary_id,
149 const dealii::Point<dim, dealii::VectorizedArray<number>> &q_point,
151 DofWriteView w_p)
const
153 dealii::VectorizedArray<number> is_inflow =
154 get_boundary_value(boundary_id,
155 BoundaryType::combined_inflow_no_slip_wall,
159 apply_inflow_boundary<DofReadView,
162 boundary_id, q_point, w_m, w_p, BoundaryType::combined_inflow_no_slip_wall);
164 auto inflow_density = w_p.
density();
165 auto inflow_momentum = w_p.momentum();
166 auto inflow_energy = w_p.total_energy();
168 auto inflow_grad_density = w_p.grad_density();
169 auto inflow_grad_momentum = w_p.grad_momentum();
170 auto inflow_grad_energy = w_p.grad_total_energy();
172 apply_no_slip_wall_boundary(w_m, w_p);
174 auto apply_mask = [](
auto mask,
auto true_value,
auto false_value) ->
auto {
175 return dealii::compare_and_apply_mask<dealii::SIMDComparison::equal>(
176 mask, dealii::VectorizedArray<number>(1.0), true_value, false_value);
179 w_p.density() = apply_mask(is_inflow, inflow_density, w_p.density());
180 for (
unsigned int d = 0; d < dim; ++d)
181 w_p.grad_density()[d] = apply_mask(is_inflow, inflow_grad_density[d], w_p.grad_density()[d]);
183 w_p.total_energy() = apply_mask(is_inflow, inflow_energy, w_p.total_energy());
184 for (
unsigned int d = 0; d < dim; ++d)
185 w_p.grad_total_energy()[d] =
186 apply_mask(is_inflow, inflow_grad_energy[d], w_p.grad_total_energy()[d]);
188 for (
unsigned int d = 0; d < dim; ++d)
190 w_p.momentum(d) = apply_mask(is_inflow, inflow_momentum[d], w_p.momentum(d));
191 for (
unsigned int d2 = 0; d2 < dim; ++d2)
192 w_p.grad_momentum(d)[d2] =
193 apply_mask(is_inflow, inflow_grad_momentum[d][d2], w_p.grad_momentum(d)[d2]);
198 template <
int dim,
typename number>
199 template <
typename DofReadView,
typename DofWriteView>
203 const dealii::Point<dim, dealii::VectorizedArray<number>> &q_point,
204 const dealii::Tensor<1, dim, dealii::VectorizedArray<number>> &normal,
205 dealii::types::boundary_id boundary_id,
206 const DofReadView &w_m,
207 const DofWriteView &w_p)
const
209 if (
const BoundaryType boundary_type = get_boundary_type(boundary_id);
210 boundary_type == BoundaryType::slip_wall)
212 apply_slip_wall_boundary(w_m, w_p, normal);
214 else if (boundary_type == BoundaryType::no_slip_wall)
216 apply_no_slip_wall_boundary(w_m, w_p);
218 else if (boundary_type == BoundaryType::inflow)
220 apply_inflow_boundary(boundary_id, q_point, w_m, w_p);
222 else if (boundary_type == BoundaryType::subsonic_outflow_fixed_pressure)
224 apply_subsonic_outflow_with_fixed_pressure_boundary(boundary_id, q_point, w_m, w_p);
226 else if (boundary_type == BoundaryType::subsonic_outflow_fixed_energy)
228 apply_subsonic_outflow_with_fixed_energy_boundary(boundary_id, q_point, w_m, w_p);
230 else if (boundary_type == BoundaryType::combined_inflow_no_slip_wall)
232 apply_combined_inflow_no_slip_wall_boundary(boundary_id, q_point, w_m, w_p);
236 std::cout <<
"ID: " << boundary_id << std::endl;
237 std::cout <<
"Condition:" << boundary_type << std::endl;
239 dealii::ExcMessage(
"Unknown boundary id, did "
240 "you set a boundary condition for "
241 "this part of the domain boundary?"));
245 template <
int dim,
typename number>
246 template <
int n_species,
typename DofReadView,
typename DofWriteView>
250 const dealii::Point<dim, dealii::VectorizedArray<number>> &q_point,
251 dealii::types::boundary_id boundary_id,
252 const DofReadView &w_m,
253 const DofWriteView &w_p)
const
255 if (
const BoundaryType boundary_type = get_boundary_type(boundary_id);
256 boundary_type == BoundaryType::inflow)
262 std::array<dealii::VectorizedArray<number>, n_species - 1> dirichlet_boundary_values;
264 for (
unsigned int species = 0; species < n_species - 1; ++species)
266 dirichlet_boundary_values[species] =
267 get_boundary_value(boundary_id,
268 BoundaryType::inflow,
270 CompressibleFlow::n_conserved_variables<dim, 1> + species);
277 else if (boundary_type == BoundaryType::combined_inflow_no_slip_wall)
280 get_boundary_value(boundary_id,
281 BoundaryType::combined_inflow_no_slip_wall,
285 std::array<dealii::VectorizedArray<number>, n_species - 1> dirichlet_boundary_values;
286 for (
unsigned int species = 0; species < n_species - 1; ++species)
288 dirichlet_boundary_values[species] =
289 get_boundary_value(boundary_id,
290 BoundaryType::combined_inflow_no_slip_wall,
299 std::vector<dealii::VectorizedArray<number>> w_p_partial_densities(n_species - 1);
300 for (
unsigned int species = 0; species < n_species - 1; ++species)
301 w_p_partial_densities[species] = w_p.partial_density(species);
303 std::vector<dealii::Tensor<1, dim, dealii::VectorizedArray<number>>>
304 w_p_partial_density_gradients(n_species - 1);
305 for (
unsigned int species = 0; species < n_species - 1; ++species)
306 w_p_partial_density_gradients[species] = w_p.grad_partial_density(species);
309 dealii::VectorizedArray<number>,
314 for (
unsigned int species = 0; species < n_species - 1; ++species)
316 w_p.partial_density(species) =
317 dealii::compare_and_apply_mask<dealii::SIMDComparison::equal>(
319 dealii::VectorizedArray<number>(1.0),
320 w_p_partial_densities[species],
321 w_p.partial_density(species));
323 for (
unsigned int d = 0; d < dim; ++d)
324 w_p.grad_partial_density(species)[d] =
325 dealii::compare_and_apply_mask<dealii::SIMDComparison::equal>(
327 dealii::VectorizedArray<number>(1.0),
328 w_p_partial_density_gradients[species][d],
329 w_p.grad_partial_density(species)[d]);
337 dealii::VectorizedArray<number>,
void set_partial_density_boundary_value_and_gradient(const dealii::Point< dim, dealii::VectorizedArray< number > > &q_point, dealii::types::boundary_id boundary_id, const DofReadView &w_m, const DofWriteView &w_p) const
Definition boundary_conditions.templates.hpp:249
dealii::VectorizedArray< number > VectorizedArrayType
Definition boundary_conditions.hpp:100
void apply_no_slip_wall_boundary(DofReadView w_m, DofWriteView w_p) const
Definition boundary_conditions.templates.hpp:39
void apply_subsonic_outflow_with_fixed_energy_boundary(const dealii::types::boundary_id boundary_id, const dealii::Point< dim, dealii::VectorizedArray< number > > &q_point, DofReadView w_m, DofWriteView w_p) const
Definition boundary_conditions.templates.hpp:122
void apply_inflow_boundary(const dealii::types::boundary_id boundary_id, const dealii::Point< dim, dealii::VectorizedArray< number > > &q_point, DofReadView w_m, DofWriteView w_p, const BoundaryType bc_value_type=BoundaryType::inflow) const
Definition boundary_conditions.templates.hpp:61
void apply_subsonic_outflow_with_fixed_pressure_boundary(const dealii::types::boundary_id boundary_id, const dealii::Point< dim, dealii::VectorizedArray< number > > &q_point, DofReadView w_m, DofWriteView w_p) const
Definition boundary_conditions.templates.hpp:92
void apply_slip_wall_boundary(DofReadView w_m, DofWriteView w_p, const dealii::Tensor< 1, dim, dealii::VectorizedArray< number > > &normal) const
Definition boundary_conditions.templates.hpp:11
void apply_combined_inflow_no_slip_wall_boundary(const dealii::types::boundary_id boundary_id, const dealii::Point< dim, dealii::VectorizedArray< number > > &q_point, DofReadView w_m, DofWriteView w_p) const
Definition boundary_conditions.templates.hpp:147
void set_conserved_variables_boundary_value_and_gradient(const dealii::Point< dim, dealii::VectorizedArray< number > > &q_point, const dealii::Tensor< 1, dim, dealii::VectorizedArray< number > > &normal, dealii::types::boundary_id boundary_id, const DofReadView &w_m, const DofWriteView &w_p) const
Definition boundary_conditions.templates.hpp:202
BoundaryConditionType BoundaryType
Definition boundary_conditions.hpp:98
This file contains various functions that can be used to set and evaluate boundary conditions for the...
Definition boundary_condition_functions.hpp:17
void set_boundary_value_and_gradient(const WritableDofView &w_p, const ReadOnlyDofView &w_m, const BoundaryConditionType boundary_type, const std::array< VectorizedArrayType, n_partial_densities > &dirichlet_boundary_values={})
Definition boundary_conditions.hpp:35
dealii::VectorizedArray< number, N > scalar_product(const dealii::VectorizedArray< number, N > &scalar, const dealii::Tensor< 1, 1, dealii::VectorizedArray< number, N > > &vec)
Definition dealii_tensor.hpp:60
Definition boundary_conditions.hpp:47
@ density
Definition boundary_conditions.hpp:51