include/meltpooldg/time_integration/time_integrator_util.hpp Source File

Developer Documentation: include/meltpooldg/time_integration/time_integrator_util.hpp Source File
Developer Documentation
time_integrator_util.hpp
Go to the documentation of this file.
1
2#pragma once
3
13
15
16#include <functional>
17
19{
28 inline bool
29 time_integrator_scheme_is_explicit(const TimeIntegratorSchemes scheme)
30 {
32 return true;
33 return false;
34 }
35
44 inline bool
45 time_integrator_scheme_is_implicit(const TimeIntegratorSchemes scheme)
46 {
48 return true;
49 return false;
50 }
51
64 template <typename number, typename PDEOperator>
65 TimeIntegratorBase<number> *
66 explicit_time_integrator_factory(const PDEOperator &pde_operator,
67 const TimeIntegratorData<number> &params)
68 {
69 if (Utils::contains(explicit_lsrk_supported_schemes, params.integrator_type))
70 {
71 auto integrator = new LowStorageExplicitRungeKuttaIntegrator<number>(params);
72 integrator->configure_rhs(
73 [&pde_operator](number time,
74 number,
75 dealii::LinearAlgebra::distributed::Vector<number> &dst,
76 const dealii::LinearAlgebra::distributed::Vector<number> &src,
77 std::function<void(unsigned, unsigned)> post) {
78 pde_operator.apply_operator(time, dst, src, post);
79 });
80 return integrator;
81 }
82 return nullptr;
83 }
84
99 template <int dim, typename number, typename PDEOperator>
100 TimeIntegratorBase<number> *
101 implicit_time_integrator_factory(const PDEOperator &pde_operator,
102 const ScratchData<dim, dim, number> &scratch_data,
103 const unsigned int dof_idx,
104 const TimeIntegratorData<number> &params)
105 {
106 using VectorType = typename BDFIntegrator<dim, number>::VectorType;
107
108 if (Utils::contains(bdf_supported_schemes, params.integrator_type))
109 {
110 auto preconditioner = make_preconditioner<dim, number, PDEOperator, VectorType>(
111 params.linear_solver_data.preconditioner_type,
112 &pde_operator,
113 scratch_data,
114 dof_idx,
115 true);
116 auto integrator = new BDFIntegrator<dim, number>(params);
117 integrator->set_preconditioner(std::move(preconditioner));
118 integrator->configure_solver_functions(
119 std::bind_front(&PDEOperator::apply_jacobian, pde_operator),
120 std::bind_front(&PDEOperator::compute_residual, pde_operator));
121 return integrator;
122 }
123 return nullptr;
124 }
125
126
141 template <typename number,
142 typename PDEOperator,
143 typename VectorType = dealii::LinearAlgebra::distributed::Vector<number>>
144 TimeIntegratorBase<number> *
145 time_integrator_factory(const PDEOperator &pde_operator,
146 const TimeIntegratorData<number> &params,
147 const LinearSolverData<number> &linear_solver_data,
148 dealii::TimerOutput &)
149 {
150 if (Utils::contains(explicit_lsrk_supported_schemes, params.integrator_type))
151 {
152 auto integrator = new LowStorageExplicitRungeKuttaIntegrator<number>(params);
153 integrator->configure_rhs(
154 [&pde_operator](number time,
155 number,
156 dealii::LinearAlgebra::distributed::Vector<number> &dst,
157 const dealii::LinearAlgebra::distributed::Vector<number> &src,
158 std::function<void(unsigned, unsigned)> post) {
159 pde_operator.apply_operator(time, dst, src, post);
160 });
161 return integrator;
162 }
163 if (Utils::contains(one_step_theta_supported_schemes, params.integrator_type))
164 return new OneStepTheta<number, PDEOperator>(pde_operator, params, linear_solver_data);
165 DEAL_II_NOT_IMPLEMENTED();
166 }
167} // namespace MeltPoolDG::TimeIntegration
Container for shared scratch data between operations/operators.
Definition scratch_data.hpp:61
Definition bdf_time_integration.hpp:30
dealii::LinearAlgebra::distributed::Vector< number > VectorType
Definition bdf_time_integration.hpp:32
Definition explicit_low_storage_runge_kutta_integrator.hpp:33
Definition one_step_theta.hpp:27
Class providing different low storage explicit Runge-Kutta schemes. The schemes implemented in this c...
Definition bdf_time_integration.hpp:18
static constexpr std::array< TimeIntegratorSchemes, 6 > bdf_supported_schemes
The time integrator schemes supported by the bdf time integrator.
Definition bdf_time_integration.hpp:20
static constexpr std::array< TimeIntegratorSchemes, 3 > one_step_theta_supported_schemes
Definition one_step_theta.hpp:20
TimeIntegratorBase< number > * time_integrator_factory(const PDEOperator &pde_operator, const TimeIntegratorData< number > &params, const LinearSolverData< number > &linear_solver_data, dealii::TimerOutput &)
Definition time_integrator_util.hpp:145
bool time_integrator_scheme_is_explicit(const TimeIntegratorSchemes scheme)
Definition time_integrator_util.hpp:29
TimeIntegratorBase< number > * implicit_time_integrator_factory(const PDEOperator &pde_operator, const ScratchData< dim, dim, number > &scratch_data, const unsigned int dof_idx, const TimeIntegratorData< number > &params)
Definition time_integrator_util.hpp:101
bool time_integrator_scheme_is_implicit(const TimeIntegratorSchemes scheme)
Definition time_integrator_util.hpp:45
TimeIntegratorBase< number > * explicit_time_integrator_factory(const PDEOperator &pde_operator, const TimeIntegratorData< number > &params)
Definition time_integrator_util.hpp:66
static constexpr std::array< TimeIntegratorSchemes, 5 > explicit_lsrk_supported_schemes
The time integrator schemes supported by the low storage explicit Runge-Kutta time integrator.
Definition explicit_low_storage_runge_kutta_integrator.hpp:23
bool contains(const Container &c, typename Container::value_type const value)
Definition cpp23_functions.h:26