include/meltpooldg/time_integration/one_step_theta.hpp Source File

Developer Documentation: include/meltpooldg/time_integration/one_step_theta.hpp Source File
Developer Documentation
one_step_theta.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <deal.II/base/config.h>
4
5#include <deal.II/lac/la_parallel_vector.h>
6
12
14
15#include <functional>
16#include <ostream>
17
19{
20 inline static constexpr std::array<TimeIntegratorSchemes, 3> one_step_theta_supported_schemes{
21 {TimeIntegratorSchemes::explicit_euler,
22 TimeIntegratorSchemes::implicit_euler,
23 TimeIntegratorSchemes::crank_nicolson}};
24
25 template <typename number, typename PDEOperator>
26 class OneStepTheta final : public TimeIntegratorBase<number>
27 {
28 public:
29 using VectorType = dealii::LinearAlgebra::distributed::Vector<number>;
30 using BlockVectorType = dealii::LinearAlgebra::distributed::BlockVector<number>;
31
32 OneStepTheta(const PDEOperator &pde_operator,
33 const TimeIntegratorData<number> &time_integrator_data_in,
34 const LinearSolverData<number> &linear_solver_data_in)
35 : TimeIntegratorBase<number>(time_integrator_data_in)
37 , linear_solver_data(linear_solver_data_in)
38 {
39 switch (this->time_integrator_data.integrator_type)
40 {
41 case TimeIntegratorSchemes::explicit_euler: {
42 Theta_ = 0.0;
43 break;
44 }
45
46 case TimeIntegratorSchemes::implicit_euler: {
47 Theta_ = 1.0;
48 break;
49 }
50
51 case TimeIntegratorSchemes::crank_nicolson: {
52 Theta_ = 0.5;
53 break;
54 }
55 default: {
56 AssertThrow(
57 false,
58 dealii::ExcMessage(
59 "The chosen time integration scheme is not supported by the OneStepTheta class."));
60 }
61 }
62 };
63
64 unsigned int
66 {
67 return 1;
68 }
69
94 void
96 const number current_time,
97 const number time_step,
98 SolutionHistory<VectorType> &solution_history,
99 const std::function<void(number, number, VectorType &, const VectorType &)> &pre_processing,
100 const std::function<void(number, number, VectorType &, const VectorType &)> &post_processing)
101 override
102 {
103 Assert(solution_history.size() >= required_solution_history_size(),
104 dealii::ExcMessage(
105 "The size of the solution history object does not fit the requirements of the "
106 "chosen time integration scheme."));
107 if (pre_processing)
108 pre_processing(current_time,
109 time_step,
111 solution_history.get_recent_old_solution());
112 dt_ = time_step;
113 old_time_ = current_time - time_step;
114 // Create the right hand side
115 right_hand_side_.reinit(solution_history.get_recent_old_solution());
116 pde_operator.apply_operator(old_time_,
118 solution_history.get_recent_old_solution(),
119 std::function<void(unsigned int, unsigned int)>());
120 right_hand_side_ *= (1.0 - Theta_);
121 buffer = 0.;
122 pde_operator.apply_dirichlet_boundary_operator(old_time_,
123 buffer,
124 solution_history.get_recent_old_solution());
125 right_hand_side_.add(1.0 - Theta_, buffer);
126 buffer = 0.;
127 pde_operator.apply_dirichlet_boundary_operator(old_time_ + dt_,
128 buffer,
129 solution_history.get_recent_old_solution());
132 right_hand_side_.add(1.0, solution_history.get_recent_old_solution());
133
134 if (this->monitoring_vector != nullptr)
136
137 const MatrixTypeObject<VectorType> linear_solver_matrix(
138 [&](VectorType &dst, const VectorType &src) -> void {
139 dst = 0.; // TODO: Initial guess
140 pde_operator.apply_operator(old_time_ + dt_,
141 dst,
142 src,
143 std::function<void(unsigned int, unsigned int)>());
144 dst *= -1.0;
145 dst *= Theta_ * dt_;
146 dst.add(1.0, src);
147 });
148
149
150 /* TODO: add preconditioner*/
151 LinearSolver::solve<VectorType>(linear_solver_matrix,
152 solution_history.get_current_solution(),
155
156 if (post_processing)
157 post_processing(current_time + time_step,
158 time_step,
159 solution_history.get_current_solution(),
160 solution_history.get_current_solution());
161 }
162
163
171 void
172 reinit(const VectorType &vector_template) override
173 {
174 buffer.reinit(vector_template);
175 }
176
181 void
182 reinit(const SolutionHistory<VectorType> &solution_history) override
183 {
184 reinit(solution_history.get_current_solution());
185 }
186
187
188 private:
189 number Theta_;
190
191 mutable number dt_;
192 mutable number old_time_;
193
197
198 const PDEOperator &pde_operator;
199 const LinearSolverData<number> &linear_solver_data;
200 };
201} // namespace MeltPoolDG::TimeIntegration
Definition one_step_theta.hpp:27
unsigned int required_solution_history_size() const override
Definition one_step_theta.hpp:65
const PDEOperator & pde_operator
Definition one_step_theta.hpp:198
number old_time_
Definition one_step_theta.hpp:192
void reinit(const SolutionHistory< VectorType > &solution_history) override
Definition one_step_theta.hpp:182
const LinearSolverData< number > & linear_solver_data
Definition one_step_theta.hpp:199
void perform_time_step(const number current_time, const number time_step, SolutionHistory< VectorType > &solution_history, const std::function< void(number, number, VectorType &, const VectorType &)> &pre_processing, const std::function< void(number, number, VectorType &, const VectorType &)> &post_processing) override
Definition one_step_theta.hpp:95
number dt_
Definition one_step_theta.hpp:191
void reinit(const VectorType &vector_template) override
Definition one_step_theta.hpp:172
VectorType right_hand_side_
Definition one_step_theta.hpp:195
dealii::LinearAlgebra::distributed::BlockVector< number > BlockVectorType
Definition one_step_theta.hpp:30
OneStepTheta(const PDEOperator &pde_operator, const TimeIntegratorData< number > &time_integrator_data_in, const LinearSolverData< number > &linear_solver_data_in)
Definition one_step_theta.hpp:32
number Theta_
Definition one_step_theta.hpp:189
VectorType old_solution_
Definition one_step_theta.hpp:194
dealii::LinearAlgebra::distributed::Vector< number > VectorType
Definition one_step_theta.hpp:29
VectorType buffer
Definition one_step_theta.hpp:196
Definition solution_history.hpp:21
const VectorType & get_recent_old_solution() const
Definition solution_history.hpp:88
const VectorType & get_current_solution() const
Definition solution_history.hpp:102
unsigned int size() const
Definition solution_history.hpp:138
Definition time_integrator_base.hpp:17
const TimeIntegratorData< number > time_integrator_data
Definition time_integrator_base.hpp:105
VectorType * monitoring_vector
Definition time_integrator_base.hpp:106
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, 3 > one_step_theta_supported_schemes
Definition one_step_theta.hpp:20
Definition matrix_type_wrapper.h:16