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 {
72 params, std::bind_front(&PDEOperator::apply_operator, &pde_operator));
73 return integrator;
74 }
75 return nullptr;
76 }
77
92 template <int dim, typename number, typename PDEOperator>
93 TimeIntegratorBase<number> *
94 implicit_time_integrator_factory(const PDEOperator &pde_operator,
95 const ScratchData<dim, dim, number> &scratch_data,
96 const unsigned int dof_idx,
97 const TimeIntegratorData<number> &params)
98 {
99 using VectorType = typename BDFIntegrator<dim, number>::VectorType;
100
101 if (Utils::contains(bdf_supported_schemes, params.integrator_type))
102 {
103 auto preconditioner = make_preconditioner<dim, number, PDEOperator, VectorType>(
104 params.linear_solver_data.preconditioner_type,
105 &pde_operator,
106 scratch_data,
107 dof_idx,
108 true);
109
111 bdf_solver_functions{.compute_jacobian =
112 std::bind_front(&PDEOperator::apply_jacobian, &pde_operator),
113 .compute_residual =
114 std::bind_front(&PDEOperator::compute_residual, &pde_operator),
115 .distribute_constraints = std::function<void(VectorType &)>()};
116
117 auto integrator =
118 new BDFIntegrator<dim, number>(params, bdf_solver_functions, std::move(preconditioner));
119 return integrator;
120 }
121 return nullptr;
122 }
123
124
139 template <typename number,
140 typename PDEOperator,
141 typename VectorType = dealii::LinearAlgebra::distributed::Vector<number>>
142 TimeIntegratorBase<number> *
143 time_integrator_factory(const PDEOperator &pde_operator,
144 const TimeIntegratorData<number> &params,
145 const LinearSolverData<number> &linear_solver_data,
146 dealii::TimerOutput &)
147 {
148 if (Utils::contains(explicit_lsrk_supported_schemes, params.integrator_type))
149 {
151 params,
152 [&pde_operator](number time,
153 number,
154 dealii::LinearAlgebra::distributed::Vector<number> &dst,
155 const dealii::LinearAlgebra::distributed::Vector<number> &src,
156 std::function<void(unsigned, unsigned)> post) {
157 pde_operator.apply_operator(time, dst, src, post);
158 });
159 return integrator;
160 }
161 if (Utils::contains(one_step_theta_supported_schemes, params.integrator_type))
162 return new OneStepTheta<number, PDEOperator>(pde_operator, params, linear_solver_data);
163 DEAL_II_NOT_IMPLEMENTED();
164 }
165} // namespace MeltPoolDG::TimeIntegration
Container for shared scratch data between operations/operators.
Definition scratch_data.hpp:61
Definition bdf_time_integration.hpp:31
dealii::LinearAlgebra::distributed::Vector< number > VectorType
Definition bdf_time_integration.hpp:33
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:19
static constexpr std::array< TimeIntegratorSchemes, 6 > bdf_supported_schemes
The time integrator schemes supported by the bdf time integrator.
Definition bdf_time_integration.hpp:21
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:143
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:94
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
JacobianType compute_jacobian
Function that applies the Jacobian of the residual operator to a given vector.
Definition bdf_time_integration.hpp:53