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
12
13#include <functional>
14#include <memory>
15#include <utility>
16
18{
23 template <int dim, typename number>
25 {
26 public:
27 using VectorType = dealii::LinearAlgebra::distributed::Vector<number>;
28
33
40 template <typename OperationType>
41 explicit OperationTypeErasure(std::unique_ptr<OperationType> &&operation)
42 : operation_pimpl(std::make_unique<OperationModel<OperationType>>(std::move(operation)))
43 {}
44
51 void
52 solve(const number current_time, const number time_step)
53 {
54 operation_pimpl->solve(current_time, time_step);
55 }
56
62 void
63 distribute_dofs(dealii::DoFHandler<dim> &dof_handler) const
64 {
65 operation_pimpl->distribute_dofs(dof_handler);
66 }
67
73 void
75 {
76 operation_pimpl->reinit();
77 }
78
86 std::vector<std::complex<number>>
87 estimate_jacobian_eigenvalues(const number time_step) const
88 {
89 return operation_pimpl->estimate_jacobian_eigenvalues(time_step);
90 }
91
97 void
99 {
100 operation_pimpl->attach_output_vectors(data_out);
101 }
102
111 number
112 compute_time_step_size(const bool do_print = false) const
113 {
114 return operation_pimpl->compute_time_step_size(do_print);
115 }
116
122 void
123 set_initial_condition(const dealii::Function<dim> &function)
124 {
125 operation_pimpl->set_initial_condition(function);
126 }
127
136 void
137 set_boundary_conditions(const std::shared_ptr<SimulationCaseBase<dim, number>> &simulation_case,
138 const std::string &operation_name)
139 {
140 operation_pimpl->set_boundary_conditions(simulation_case, operation_name);
141 }
142
150 void
151 set_body_force(std::unique_ptr<dealii::Function<dim>> body_force_in)
152 {
153 operation_pimpl->set_body_force(std::move(body_force_in));
154 }
155
176 bool
177 repartition(VectorType &level_set, const std::function<void()> &distribute_level_set_dofs)
178 {
179 return operation_pimpl->repartition(level_set, distribute_level_set_dofs);
180 }
181
182 void
184 std::shared_ptr<ExternalFlowForce<dim, number>> external_force_residuum,
185 std::shared_ptr<ExternalFlowForceJacobian<dim, number>> external_force_jacobian = nullptr);
186
192 const dealii::DoFHandler<dim> &
194 {
195 return operation_pimpl->get_dof_handler();
196 }
197
203 const VectorType &
205 {
206 return operation_pimpl->get_solution();
207 }
208
214 VectorType &
216 {
217 return operation_pimpl->get_solution();
218 }
219
228 bool
230 {
231 return (operation_pimpl != nullptr);
232 }
233
237 void
239 {
240 operation_pimpl.reset(nullptr);
241 }
242
243 private:
252 {
253 virtual ~OperationConcept() = default;
254
255 virtual void
256 solve(number current_time, number time_step) = 0;
257
258 virtual void
259 distribute_dofs(dealii::DoFHandler<dim> &dof_handler) const = 0;
260
261 virtual void
263
264 virtual void
265 reinit() = 0;
266
267 virtual number
268 compute_time_step_size(bool do_print = false) const = 0;
269
270 virtual void
271 set_initial_condition(const dealii::Function<dim> &function) = 0;
272
273 virtual void
275 const std::shared_ptr<SimulationCaseBase<dim, number>> &simulation_case,
276 const std::string &operation_name) = 0;
277
278 virtual void
279 set_body_force(std::unique_ptr<dealii::Function<dim>> body_force_in) = 0;
280
281 virtual bool
283 const std::function<void()> &distribute_level_set_dofs) = 0;
284
285 virtual const VectorType &
286 get_solution() const = 0;
287
288 virtual VectorType &
290
291 virtual const dealii::DoFHandler<dim> &
292 get_dof_handler() const = 0;
293
294 virtual std::vector<std::complex<number>>
295 estimate_jacobian_eigenvalues(const number time_step) const = 0;
296 };
297
309 template <typename OperationType>
310 struct OperationModel final : public OperationConcept
311 {
312 public:
313 explicit OperationModel(std::unique_ptr<OperationType> &&operation_in)
314 : operation(std::move(operation_in))
315 {}
316
317 void
318 solve(const number current_time, const number time_step) override
319 {
320 operation->solve(current_time, time_step);
321 }
322
323 void
324 distribute_dofs(dealii::DoFHandler<dim> &dof_handler) const override
325 {
326 operation->distribute_dofs(dof_handler);
327 }
328
329 void
330 reinit() override
331 {
332 operation->reinit();
333 }
334
335 void
337 {
338 operation->attach_output_vectors(data_out);
339 }
340
341 number
342 compute_time_step_size(const bool do_print = false) const override
343 {
344 return operation->compute_time_step_size(do_print);
345 }
346
347 void
348 set_initial_condition(const dealii::Function<dim> &function) override
349 {
350 operation->set_initial_condition(function);
351 }
352
353 void
355 const std::shared_ptr<SimulationCaseBase<dim, number>> &simulation_case,
356 const std::string &operation_name) override
357 {
358 operation->set_boundary_conditions(simulation_case, operation_name);
359 }
360
361 void
362 set_body_force(std::unique_ptr<dealii::Function<dim>> body_force_in) override
363 {
364 operation->set_body_force(std::move(body_force_in));
365 }
366
367 bool
369 const std::function<void()> &distribute_level_set_dofs) override
370 {
371 // repartitioning is only provided by operations implementing it (e.g. the compressible
372 // multiphase operation); further, it does only make sense for cut applications
373 if constexpr (requires { operation->repartition(level_set, distribute_level_set_dofs); })
374 return operation->repartition(level_set, distribute_level_set_dofs);
375 else
376 {
377 (void)level_set;
378 (void)distribute_level_set_dofs;
379 AssertThrow(false,
380 dealii::ExcMessage(
381 "Repartitioning is not supported by this compressible flow operation."));
382 return false;
383 }
384 }
385
386 const VectorType &
387 get_solution() const override
388 {
389 return operation->get_solution();
390 }
391
392 VectorType &
393 get_solution() override
394 {
395 return operation->get_solution();
396 }
397
398 const dealii::DoFHandler<dim> &
399 get_dof_handler() const override
400 {
401 return operation->get_dof_handler();
402 }
403
404 std::vector<std::complex<number>>
405 estimate_jacobian_eigenvalues(const number time_step) const override
406 {
407 return operation->estimate_jacobian_eigenvalues(time_step);
408 }
409
410 private:
412 std::unique_ptr<OperationType> operation;
413 };
414
417 std::unique_ptr<OperationConcept> operation_pimpl;
418 };
419} // namespace MeltPoolDG::CompressibleFlow
Common interface class for compressible flow operation classes based on the type erasure idiom.
Definition operation_type_erasure.hpp:25
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:52
std::vector< std::complex< number > > estimate_jacobian_eigenvalues(const number time_step) const
Estimate the eigenvalues of the Jacobian matrix.
Definition operation_type_erasure.hpp:87
dealii::LinearAlgebra::distributed::Vector< number > VectorType
Definition operation_type_erasure.hpp:27
std::unique_ptr< OperationConcept > operation_pimpl
Definition operation_type_erasure.hpp:417
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:63
void clear()
Delete the compressible flow operation object stored in this class.
Definition operation_type_erasure.hpp:238
void attach_output_vectors(GenericDataOut< dim, number > &data_out) const
Attach the solution to the passed data out object.
Definition operation_type_erasure.hpp:98
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:193
VectorType & get_solution()
Get a reference to the solution vector.
Definition operation_type_erasure.hpp:215
OperationTypeErasure()=default
Default constructor.
OperationTypeErasure(std::unique_ptr< OperationType > &&operation)
Constructor, takes ownership of the passed unique pointer.
Definition operation_type_erasure.hpp:41
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:74
bool is_initialized() const
Check if the compressible flow operation is initialized,.
Definition operation_type_erasure.hpp:229
number compute_time_step_size(const bool do_print=false) const
Compute the maximum time step size.
Definition operation_type_erasure.hpp:112
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:137
const VectorType & get_solution() const
Get a constant reference to the solution vector.
Definition operation_type_erasure.hpp:204
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:151
bool repartition(VectorType &level_set, const std::function< void()> &distribute_level_set_dofs)
Repartition the triangulation among the MPI processes with cell weights according to the location of ...
Definition operation_type_erasure.hpp:177
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:123
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:187
Abstract base class defining the interface for compressible flow operations.
Definition operation_type_erasure.hpp:252
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 bool repartition(VectorType &level_set, const std::function< void()> &distribute_level_set_dofs)=0
virtual std::vector< std::complex< number > > estimate_jacobian_eigenvalues(const number time_step) const =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:311
void solve(const number current_time, const number time_step) override
Definition operation_type_erasure.hpp:318
bool repartition(VectorType &level_set, const std::function< void()> &distribute_level_set_dofs) override
Definition operation_type_erasure.hpp:368
std::vector< std::complex< number > > estimate_jacobian_eigenvalues(const number time_step) const override
Definition operation_type_erasure.hpp:405
void set_body_force(std::unique_ptr< dealii::Function< dim > > body_force_in) override
Definition operation_type_erasure.hpp:362
void reinit() override
Definition operation_type_erasure.hpp:330
OperationModel(std::unique_ptr< OperationType > &&operation_in)
Definition operation_type_erasure.hpp:313
const dealii::DoFHandler< dim > & get_dof_handler() const override
Definition operation_type_erasure.hpp:399
void attach_output_vectors(GenericDataOut< dim, number > &data_out) const override
Definition operation_type_erasure.hpp:336
void distribute_dofs(dealii::DoFHandler< dim > &dof_handler) const override
Definition operation_type_erasure.hpp:324
std::unique_ptr< OperationType > operation
Pointer to the concrete compressible flow operation object.
Definition operation_type_erasure.hpp:412
void set_initial_condition(const dealii::Function< dim > &function) override
Definition operation_type_erasure.hpp:348
void set_boundary_conditions(const std::shared_ptr< SimulationCaseBase< dim, number > > &simulation_case, const std::string &operation_name) override
Definition operation_type_erasure.hpp:354
const VectorType & get_solution() const override
Definition operation_type_erasure.hpp:387
VectorType & get_solution() override
Definition operation_type_erasure.hpp:393
number compute_time_step_size(const bool do_print=false) const override
Definition operation_type_erasure.hpp:342