include/meltpooldg/compressible_flow/operation_type_erasure.hpp Source File

Developer Documentation: include/meltpooldg/compressible_flow/operation_type_erasure.hpp Source File
Developer Documentation
operation_type_erasure.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <deal.II/base/function.h>
4
5#include <deal.II/dofs/dof_handler.h>
6
7#include <deal.II/lac/la_parallel_vector.h>
8
10
11#include <memory>
12#include <utility>
13
15{
20 template <int dim, typename number>
22 {
23 public:
24 using VectorType = dealii::LinearAlgebra::distributed::Vector<number>;
25
30
37 template <typename OperationType>
38 explicit OperationTypeErasure(std::unique_ptr<OperationType> &&operation)
39 : operation_pimpl(std::make_unique<OperationModel<OperationType>>(std::move(operation)))
40 {}
41
48 void
49 solve(const number current_time, const number time_step)
50 {
51 operation_pimpl->solve(current_time, time_step);
52 }
53
59 void
60 distribute_dofs(dealii::DoFHandler<dim> &dof_handler) const
61 {
62 operation_pimpl->distribute_dofs(dof_handler);
63 }
64
70 void
72 {
73 operation_pimpl->reinit();
74 }
75
81 void
83 {
84 operation_pimpl->attach_output_vectors(data_out);
85 }
86
95 number
96 compute_time_step_size(const bool do_print = false) const
97 {
98 return operation_pimpl->compute_time_step_size(do_print);
99 }
100
106 void
107 set_initial_condition(const dealii::Function<dim> &function)
108 {
109 operation_pimpl->set_initial_condition(function);
110 }
111
120 void
121 set_boundary_conditions(const std::shared_ptr<SimulationCaseBase<dim, number>> &simulation_case,
122 const std::string &operation_name)
123 {
124 operation_pimpl->set_boundary_conditions(simulation_case, operation_name);
125 }
126
134 void
135 set_body_force(std::unique_ptr<dealii::Function<dim>> body_force_in)
136 {
137 operation_pimpl->set_body_force(std::move(body_force_in));
138 }
139
140 void
142 std::shared_ptr<ExternalFlowForce<dim, number>> external_force_residuum,
143 std::shared_ptr<ExternalFlowForceJacobian<dim, number>> external_force_jacobian = nullptr);
144
150 const dealii::DoFHandler<dim> &
152 {
153 return operation_pimpl->get_dof_handler();
154 }
155
161 const VectorType &
163 {
164 return operation_pimpl->get_solution();
165 }
166
172 VectorType &
174 {
175 return operation_pimpl->get_solution();
176 }
177
186 bool
188 {
189 return (operation_pimpl != nullptr);
190 }
191
195 void
197 {
198 operation_pimpl.reset(nullptr);
199 }
200
201 private:
210 {
211 virtual ~OperationConcept() = default;
212
213 virtual void
214 solve(number current_time, number time_step) = 0;
215
216 virtual void
217 distribute_dofs(dealii::DoFHandler<dim> &dof_handler) const = 0;
218
219 virtual void
221
222 virtual void
223 reinit() = 0;
224
225 virtual number
226 compute_time_step_size(bool do_print = false) const = 0;
227
228 virtual void
229 set_initial_condition(const dealii::Function<dim> &function) = 0;
230
231 virtual void
233 const std::shared_ptr<SimulationCaseBase<dim, number>> &simulation_case,
234 const std::string &operation_name) = 0;
235
236 virtual void
237 set_body_force(std::unique_ptr<dealii::Function<dim>> body_force_in) = 0;
238
239 virtual const VectorType &
240 get_solution() const = 0;
241
242 virtual VectorType &
244
245 virtual const dealii::DoFHandler<dim> &
246 get_dof_handler() const = 0;
247 };
248
260 template <typename OperationType>
261 struct OperationModel final : public OperationConcept
262 {
263 public:
264 explicit OperationModel(std::unique_ptr<OperationType> &&operation_in)
265 : operation(std::move(operation_in))
266 {}
267
268 void
269 solve(const number current_time, const number time_step) override
270 {
271 operation->solve(current_time, time_step);
272 }
273
274 void
275 distribute_dofs(dealii::DoFHandler<dim> &dof_handler) const override
276 {
277 operation->distribute_dofs(dof_handler);
278 }
279
280 void
281 reinit() override
282 {
283 operation->reinit();
284 }
285
286 void
288 {
289 operation->attach_output_vectors(data_out);
290 }
291
292 number
293 compute_time_step_size(const bool do_print = false) const override
294 {
295 return operation->compute_time_step_size(do_print);
296 }
297
298 void
299 set_initial_condition(const dealii::Function<dim> &function) override
300 {
301 operation->set_initial_condition(function);
302 }
303
304 void
306 const std::shared_ptr<SimulationCaseBase<dim, number>> &simulation_case,
307 const std::string &operation_name) override
308 {
309 operation->set_boundary_conditions(simulation_case, operation_name);
310 }
311
312 void
313 set_body_force(std::unique_ptr<dealii::Function<dim>> body_force_in) override
314 {
315 operation->set_body_force(std::move(body_force_in));
316 }
317
318 const VectorType &
319 get_solution() const override
320 {
321 return operation->get_solution();
322 }
323
324 VectorType &
325 get_solution() override
326 {
327 return operation->get_solution();
328 }
329
330 const dealii::DoFHandler<dim> &
331 get_dof_handler() const override
332 {
333 return operation->get_dof_handler();
334 }
335
336 private:
338 std::unique_ptr<OperationType> operation;
339 };
340
343 std::unique_ptr<OperationConcept> operation_pimpl;
344 };
345} // namespace MeltPoolDG::CompressibleFlow
Common interface class for compressible flow operation classes based on the type erasure idiom.
Definition operation_type_erasure.hpp:22
void solve(const number current_time, const number time_step)
Solves the compressible Navier-Stokes equations for a single time step.
Definition operation_type_erasure.hpp:49
dealii::LinearAlgebra::distributed::Vector< number > VectorType
Definition operation_type_erasure.hpp:24
std::unique_ptr< OperationConcept > operation_pimpl
Definition operation_type_erasure.hpp:343
void distribute_dofs(dealii::DoFHandler< dim > &dof_handler) const
Distribute the degrees of freedom to the passed dof handler object.
Definition operation_type_erasure.hpp:60
void clear()
Delete the compressible flow operation object stored in this class.
Definition operation_type_erasure.hpp:196
void attach_output_vectors(GenericDataOut< dim, number > &data_out) const
Attach the solution to the passed data out object.
Definition operation_type_erasure.hpp:82
const dealii::DoFHandler< dim > & get_dof_handler() const
Get a constant reference to the DoFHandler used in the current operation.
Definition operation_type_erasure.hpp:151
VectorType & get_solution()
Get a reference to the solution vector.
Definition operation_type_erasure.hpp:173
OperationTypeErasure()=default
Default constructor.
OperationTypeErasure(std::unique_ptr< OperationType > &&operation)
Constructor, takes ownership of the passed unique pointer.
Definition operation_type_erasure.hpp:38
void add_external_force(std::shared_ptr< ExternalFlowForce< dim, number > > external_force_residuum, std::shared_ptr< ExternalFlowForceJacobian< dim, number > > external_force_jacobian=nullptr)
void reinit()
Set up the required internal data structures.
Definition operation_type_erasure.hpp:71
bool is_initialized() const
Check if the compressible flow operation is initialized,.
Definition operation_type_erasure.hpp:187
number compute_time_step_size(const bool do_print=false) const
Compute the maximum time step size.
Definition operation_type_erasure.hpp:96
void set_boundary_conditions(const std::shared_ptr< SimulationCaseBase< dim, number > > &simulation_case, const std::string &operation_name)
Set the boundary conditions.
Definition operation_type_erasure.hpp:121
const VectorType & get_solution() const
Get a constant reference to the solution vector.
Definition operation_type_erasure.hpp:162
void set_body_force(std::unique_ptr< dealii::Function< dim > > body_force_in)
Set a body force, e.g. gravity, specified by the passed function.
Definition operation_type_erasure.hpp:135
void set_initial_condition(const dealii::Function< dim > &function)
Set the solution vector to the passed initial flow field state.
Definition operation_type_erasure.hpp:107
A generic utility for managing simulation output data in the MeltPoolDG context.
Definition generic_data_out.hpp:32
Base class for managing a simulation case in a parallel computing environment.
Definition simulation_case_base.hpp:44
This file contains various functions that can be used to set and evaluate boundary conditions for the...
Definition boundary_condition_functions.hpp:17
An abstract interface for defining external forces acting on the fluid that must be evaluated and inc...
Definition utils.hpp:117
Abstract base class defining the interface for compressible flow operations.
Definition operation_type_erasure.hpp:210
virtual void solve(number current_time, number time_step)=0
virtual void attach_output_vectors(GenericDataOut< dim, number > &data_out) const =0
virtual void set_initial_condition(const dealii::Function< dim > &function)=0
virtual void distribute_dofs(dealii::DoFHandler< dim > &dof_handler) const =0
virtual void set_boundary_conditions(const std::shared_ptr< SimulationCaseBase< dim, number > > &simulation_case, const std::string &operation_name)=0
virtual number compute_time_step_size(bool do_print=false) const =0
virtual void set_body_force(std::unique_ptr< dealii::Function< dim > > body_force_in)=0
virtual const dealii::DoFHandler< dim > & get_dof_handler() const =0
Concrete implementation of OperationConcept using a specific compressible flow operation type.
Definition operation_type_erasure.hpp:262
void solve(const number current_time, const number time_step) override
Definition operation_type_erasure.hpp:269
void set_body_force(std::unique_ptr< dealii::Function< dim > > body_force_in) override
Definition operation_type_erasure.hpp:313
void reinit() override
Definition operation_type_erasure.hpp:281
OperationModel(std::unique_ptr< OperationType > &&operation_in)
Definition operation_type_erasure.hpp:264
const dealii::DoFHandler< dim > & get_dof_handler() const override
Definition operation_type_erasure.hpp:331
void attach_output_vectors(GenericDataOut< dim, number > &data_out) const override
Definition operation_type_erasure.hpp:287
void distribute_dofs(dealii::DoFHandler< dim > &dof_handler) const override
Definition operation_type_erasure.hpp:275
std::unique_ptr< OperationType > operation
Pointer to the concrete compressible flow operation object.
Definition operation_type_erasure.hpp:338
void set_initial_condition(const dealii::Function< dim > &function) override
Definition operation_type_erasure.hpp:299
void set_boundary_conditions(const std::shared_ptr< SimulationCaseBase< dim, number > > &simulation_case, const std::string &operation_name) override
Definition operation_type_erasure.hpp:305
const VectorType & get_solution() const override
Definition operation_type_erasure.hpp:319
VectorType & get_solution() override
Definition operation_type_erasure.hpp:325
number compute_time_step_size(const bool do_print=false) const override
Definition operation_type_erasure.hpp:293