40class SourceTermCalculator
42 using This = SourceTermCalculator<dim, Number>;
43 using VectorType = dealii::LinearAlgebra::distributed::Vector<Number>;
45 using CellIntegratorScalar = CellIntegrator<dim, 1, Number>;
46 using CellIntegratorVector = CellIntegrator<dim, dim, Number>;
48 using scalar = dealii::VectorizedArray<Number>;
49 using qpoint = dealii::Point<dim, dealii::VectorizedArray<Number>>;
52 SourceTermCalculator() : matrix_free(
nullptr), time(std::numeric_limits<double>::min())
57 setup(dealii::MatrixFree<dim, Number>
const & matrix_free_in,
60 matrix_free = &matrix_free_in;
65 evaluate_integrate(VectorType & dst,
66 dealii::Function<dim> & analytical_source_term,
67 double const evaluation_time)
69 time = evaluation_time;
71 dst.zero_out_ghost_values();
73 analytical_source_term.set_time(time);
75 matrix_free->cell_loop(&This::compute_source_term,
this, dst, analytical_source_term,
true);
80 evaluate_integrate(VectorType & dst,
81 VectorType
const & velocity_cfd_in,
82 VectorType
const & pressure_cfd_in,
83 VectorType
const & pressure_cfd_time_derivative_in,
84 double const evaluation_time)
86 time = evaluation_time;
88 dst.zero_out_ghost_values();
90 if(data.consider_convection)
92 velocity_cfd.reset(velocity_cfd_in);
93 velocity_cfd->update_ghost_values();
95 pressure_cfd.reset(pressure_cfd_in);
96 pressure_cfd->update_ghost_values();
99 matrix_free->cell_loop(
100 &This::compute_source_term,
this, dst, pressure_cfd_time_derivative_in,
true);
105 compute_source_term(dealii::MatrixFree<dim, Number>
const & matrix_free_in,
107 VectorType
const & dp_cfd_dt,
108 std::pair<unsigned int, unsigned int>
const & cell_range)
const
110 CellIntegratorScalar dpdt(matrix_free_in, data.dof_index_pressure, data.quad_index);
111 CellIntegratorScalar p(matrix_free_in, data.dof_index_pressure, data.quad_index);
112 CellIntegratorVector u(matrix_free_in, data.dof_index_velocity, data.quad_index);
114 Number rho =
static_cast<Number
>(data.density);
116 auto get_scaling_factor = get_scaling_function();
118 for(
unsigned int cell = cell_range.first; cell < cell_range.second; ++cell)
121 dpdt.gather_evaluate(dp_cfd_dt, dealii::EvaluationFlags::values);
123 if(data.consider_convection)
126 p.gather_evaluate(*pressure_cfd, dealii::EvaluationFlags::gradients);
128 u.gather_evaluate(*velocity_cfd, dealii::EvaluationFlags::values);
130 for(
unsigned int q = 0; q < dpdt.n_q_points; ++q)
132 scalar flux = -rho * dpdt.get_value(q) + u.get_value(q) * p.get_gradient(q);
135 flux *= get_scaling_factor(dpdt.quadrature_point(q));
137 dpdt.submit_value(flux, q);
142 for(
unsigned int q = 0; q < dpdt.n_q_points; ++q)
144 scalar flux = -rho * dpdt.get_value(q);
147 flux *= get_scaling_factor(dpdt.quadrature_point(q));
149 dpdt.submit_value(flux, q);
153 dpdt.integrate_scatter(dealii::EvaluationFlags::values, dst);
158 compute_source_term(dealii::MatrixFree<dim, Number>
const & matrix_free_in,
160 dealii::Function<dim>
const & analytical_source_term,
161 std::pair<unsigned int, unsigned int>
const & cell_range)
const
163 CellIntegratorScalar dpdt(matrix_free_in, data.dof_index_pressure, data.quad_index);
165 Number rho =
static_cast<Number
>(data.density);
167 auto get_scaling_factor = get_scaling_function();
169 for(
unsigned int cell = cell_range.first; cell < cell_range.second; ++cell)
173 for(
unsigned int q = 0; q < dpdt.n_q_points; ++q)
175 scalar flux = -rho * FunctionEvaluator<0, dim, Number>::value(analytical_source_term,
176 dpdt.quadrature_point(q));
179 flux *= get_scaling_factor(dpdt.quadrature_point(q));
181 dpdt.submit_value(flux, q);
184 dpdt.integrate_scatter(dealii::EvaluationFlags::values, dst);
188 std::function<scalar(qpoint
const &)>
189 get_scaling_function()
const
196 AssertThrow(data.blend_in_function !=
nullptr,
197 dealii::ExcMessage(
"No blend-in function provided."));
200 bool const space_dependent_scaling =
201 data.blend_in_function !=
nullptr ? data.blend_in_function->varies_in_space(time) :
false;
202 Number
const pure_temporal_scaling_factor =
203 (not space_dependent_scaling) ? data.blend_in_function->compute_time_factor(time) : 1.0;
205 if(space_dependent_scaling)
207 return [&](qpoint
const & q) {
208 return FunctionEvaluator<0, dim, Number>::value(*data.blend_in_function, q, time);
215 [pure_temporal_scaling_factor](qpoint
const &) {
return pure_temporal_scaling_factor; };
220 dealii::MatrixFree<dim, Number>
const * matrix_free;