62class SourceTermCalculator
64 using This = SourceTermCalculator<dim, Number>;
65 using VectorType = dealii::LinearAlgebra::distributed::Vector<Number>;
67 using CellIntegratorScalar = CellIntegrator<dim, 1, Number>;
68 using CellIntegratorVector = CellIntegrator<dim, dim, Number>;
70 using scalar = dealii::VectorizedArray<Number>;
71 using qpoint = dealii::Point<dim, dealii::VectorizedArray<Number>>;
74 SourceTermCalculator() : matrix_free(
nullptr), time(std::numeric_limits<double>::min())
79 setup(dealii::MatrixFree<dim, Number>
const & matrix_free_in,
82 matrix_free = &matrix_free_in;
87 evaluate_integrate(VectorType & dst,
88 dealii::Function<dim> & analytical_source_term,
89 double const evaluation_time)
91 time = evaluation_time;
93 dst.zero_out_ghost_values();
95 analytical_source_term.set_time(time);
97 matrix_free->cell_loop(&This::compute_source_term,
this, dst, analytical_source_term,
true);
102 evaluate_integrate(VectorType & dst,
103 VectorType
const & velocity_cfd_in,
104 VectorType
const & pressure_cfd_in,
105 VectorType
const & pressure_cfd_time_derivative_in,
106 double const evaluation_time)
108 time = evaluation_time;
110 dst.zero_out_ghost_values();
112 if(data.consider_convection)
114 velocity_cfd.reset(velocity_cfd_in);
115 velocity_cfd->update_ghost_values();
117 pressure_cfd.reset(pressure_cfd_in);
118 pressure_cfd->update_ghost_values();
121 matrix_free->cell_loop(
122 &This::compute_source_term,
this, dst, pressure_cfd_time_derivative_in,
true);
127 compute_source_term(dealii::MatrixFree<dim, Number>
const & matrix_free_in,
129 VectorType
const & dp_cfd_dt,
130 std::pair<unsigned int, unsigned int>
const & cell_range)
const
132 CellIntegratorScalar dpdt(matrix_free_in, data.dof_index_pressure, data.quad_index);
133 CellIntegratorScalar p(matrix_free_in, data.dof_index_pressure, data.quad_index);
134 CellIntegratorVector u(matrix_free_in, data.dof_index_velocity, data.quad_index);
136 Number rho =
static_cast<Number
>(data.density);
138 auto get_scaling_factor = get_scaling_function();
140 for(
unsigned int cell = cell_range.first; cell < cell_range.second; ++cell)
143 dpdt.gather_evaluate(dp_cfd_dt, dealii::EvaluationFlags::values);
145 if(data.consider_convection)
148 p.gather_evaluate(*pressure_cfd, dealii::EvaluationFlags::gradients);
150 u.gather_evaluate(*velocity_cfd, dealii::EvaluationFlags::values);
152 for(
unsigned int q = 0; q < dpdt.n_q_points; ++q)
154 scalar flux = -rho * dpdt.get_value(q) + u.get_value(q) * p.get_gradient(q);
157 flux *= get_scaling_factor(dpdt.quadrature_point(q));
159 dpdt.submit_value(flux, q);
164 for(
unsigned int q = 0; q < dpdt.n_q_points; ++q)
166 scalar flux = -rho * dpdt.get_value(q);
169 flux *= get_scaling_factor(dpdt.quadrature_point(q));
171 dpdt.submit_value(flux, q);
175 dpdt.integrate_scatter(dealii::EvaluationFlags::values, dst);
180 compute_source_term(dealii::MatrixFree<dim, Number>
const & matrix_free_in,
182 dealii::Function<dim>
const & analytical_source_term,
183 std::pair<unsigned int, unsigned int>
const & cell_range)
const
185 CellIntegratorScalar dpdt(matrix_free_in, data.dof_index_pressure, data.quad_index);
187 Number rho =
static_cast<Number
>(data.density);
189 auto get_scaling_factor = get_scaling_function();
191 for(
unsigned int cell = cell_range.first; cell < cell_range.second; ++cell)
195 for(
unsigned int q = 0; q < dpdt.n_q_points; ++q)
197 scalar flux = -rho * FunctionEvaluator<0, dim, Number>::value(analytical_source_term,
198 dpdt.quadrature_point(q));
201 flux *= get_scaling_factor(dpdt.quadrature_point(q));
203 dpdt.submit_value(flux, q);
206 dpdt.integrate_scatter(dealii::EvaluationFlags::values, dst);
210 std::function<scalar(qpoint
const &)>
211 get_scaling_function()
const
218 AssertThrow(data.blend_in_function !=
nullptr,
219 dealii::ExcMessage(
"No blend-in function provided."));
222 bool const space_dependent_scaling =
223 data.blend_in_function !=
nullptr ? data.blend_in_function->varies_in_space(time) :
false;
224 Number
const pure_temporal_scaling_factor =
225 (not space_dependent_scaling) ? data.blend_in_function->compute_time_factor(time) : 1.0;
227 if(space_dependent_scaling)
229 return [&](qpoint
const & q) {
230 return FunctionEvaluator<0, dim, Number>::value(*data.blend_in_function, q, time);
237 [pure_temporal_scaling_factor](qpoint
const &) {
return pure_temporal_scaling_factor; };
242 dealii::MatrixFree<dim, Number>
const * matrix_free;