ryujin 2.5.0 revision c64172211cf21344cb9b9b0f3a1266aa6400d392
Loading...
Searching...
No Matches
parabolic_module.h
Go to the documentation of this file.
1//
2// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
3// Copyright (C) 2023 - 2026 by the ryujin authors
4//
5
6#pragma once
7
8#include <ryujin/base/compile_time_options.h>
12#include <ryujin/base/simd.h>
17
18#include <deal.II/base/mg_level_object.h>
19#include <deal.II/base/parameter_acceptor.h>
20#include <deal.II/lac/la_parallel_block_vector.h>
21#include <deal.II/lac/precondition.h>
22#include <deal.II/lac/sparse_matrix.templates.h>
23#include <deal.II/lac/vector.h>
24#include <deal.II/matrix_free/matrix_free.h>
25#include <deal.II/multigrid/mg_base.h>
26#include <deal.II/multigrid/mg_smoother.h>
27#include <deal.II/multigrid/mg_transfer_matrix_free.h>
28
29#include <limits>
30
31namespace ryujin
32{
33 namespace Euler
34 {
35 struct HyperbolicDescription;
36 } // namespace Euler
37
38 namespace NavierStokes
39 {
40 template <int, typename>
41 class DiagonalMatrix;
42
115 template <int dim, typename Number = double>
116 class ParabolicModule final : public Interface::ParabolicModule<dim, Number>
117 {
118 public:
123
125 typename Interface::ParabolicModule<dim, Number>::StageVectors;
126
128 typename Interface::ParabolicModule<dim, Number>::StageWeights;
129
131
133
135
137
139 dealii::LinearAlgebra::distributed::BlockVector<Number>;
140
142
144
145 using state_type = typename View::state_type;
146
148
152
156 ParabolicModule(const MPIEnsemble &mpi_ensemble,
157 const OfflineData<dim, Number> &offline_data,
158 const HyperbolicSystem &hyperbolic_system,
159 const ParabolicSystem &parabolic_system,
161 &initial_values,
162 const std::string &subsection = "ParabolicModule");
163
169 void prepare() override;
170
172
176
184 void
185 reinit_state_vector(StateVector<Number> & /*state_vector*/) const override
186 {
187 // do nothing
188 }
189
194 void prepare_state_vector(StateVector<Number> &state_vector,
195 Number t) const override;
196
207 Number backward_euler_step(
208 const StateVector<Number> &old_state_vector,
209 StageVectors stage_state_vectors,
210 StageWeights stage_weights,
211 StateVector<Number> &new_state_vector,
212 Number t,
213 Number tau,
214 Number tau_max = std::numeric_limits<Number>::max()) const override;
215
221 Number crank_nicolson_step(
222 const StateVector<Number> &old_state_vector,
223 StateVector<Number> &new_state_vector,
224 Number t,
225 Number tau,
226 Number tau_max = std::numeric_limits<Number>::max()) const override;
227
229
233
239 void print_solver_statistics(std::ostream &output) const override;
240
241 private:
243
247
248 bool use_gmg_velocity_;
249 bool use_gmg_internal_energy_;
250
251 Number tolerance_;
252 bool tolerance_linfty_norm_;
253
254 unsigned int gmg_max_iter_vel_;
255 unsigned int gmg_max_iter_en_;
256 double gmg_smoother_range_vel_;
257 double gmg_smoother_range_en_;
258 double gmg_smoother_max_eig_vel_;
259 double gmg_smoother_max_eig_en_;
260 unsigned int gmg_smoother_degree_;
261 unsigned int gmg_smoother_n_cg_iter_;
262 unsigned int gmg_min_level_;
263
265
269
270 // FIXME: refactor
271 static constexpr unsigned int order_fe = 1;
272 static constexpr unsigned int order_quad = 2;
273
274 const MPIEnsemble &mpi_ensemble_;
275
276 dealii::ObserverPointer<const HyperbolicSystem> hyperbolic_system_;
277 dealii::ObserverPointer<const ParabolicSystem> parabolic_system_;
278 dealii::ObserverPointer<const ryujin::OfflineData<dim, Number>>
279 offline_data_;
280 dealii::ObserverPointer<
282 initial_values_;
283
284 mutable unsigned int cycle_;
285 mutable double n_iterations_velocity_;
286 mutable double n_iterations_internal_energy_;
287
288 mutable dealii::MatrixFree<dim, Number> matrix_free_;
289
290 mutable BlockHostVector velocity_;
291 mutable BlockHostVector velocity_rhs_;
292 mutable ScalarHostVector<Number> internal_energy_;
293 mutable ScalarHostVector<Number> internal_energy_rhs_;
294 mutable ScalarHostVector<Number> density_;
295
296 mutable dealii::MGLevelObject<dealii::MatrixFree<dim, float>>
297 level_matrix_free_;
298 mutable dealii::MGConstrainedDoFs mg_constrained_dofs_;
299 mutable dealii::MGLevelObject<
300 dealii::LinearAlgebra::distributed::Vector<float>>
301 level_density_;
302 mutable MGTransferVelocity<dim, float> mg_transfer_velocity_;
303 mutable dealii::MGLevelObject<VelocityMatrix<dim, float, Number>>
304 level_velocity_matrices_;
305 mutable MGTransferEnergy<dim, float> mg_transfer_energy_;
306 mutable dealii::MGLevelObject<EnergyMatrix<dim, float, Number>>
307 level_energy_matrices_;
308
309 mutable dealii::mg::SmootherRelaxation<
310 dealii::PreconditionChebyshev<
312 dealii::LinearAlgebra::distributed::BlockVector<float>,
314 dealii::LinearAlgebra::distributed::BlockVector<float>>
315 mg_smoother_velocity_;
316
317 mutable dealii::mg::SmootherRelaxation<
318 dealii::PreconditionChebyshev<
320 dealii::LinearAlgebra::distributed::Vector<float>>,
321 dealii::LinearAlgebra::distributed::Vector<float>>
322 mg_smoother_energy_;
323
325
329
336 template <int stages>
337 void backward_euler_step(const StateVector<Number> &old_state_vector,
338 StageVectors stage_state_vectors,
339 StageWeights stage_weights,
340 StateVector<Number> &new_state_vector,
341 Number t,
342 Number tau) const;
343
353 void step(const StateVector<Number> &old_state_vector,
354 StateVector<Number> &new_state_vector,
355 Number t,
356 Number tau,
357 const bool crank_nicolson_extrapolation) const;
358
360 };
361
362 } // namespace NavierStokes
363} // namespace ryujin
dealii::Tensor< 1, problem_dimension, Number > state_type
static constexpr unsigned int problem_dimension
typename get_value_type< Number >::type ScalarNumber
typename Interface::ParabolicModule< dim, Number >::StageWeights StageWeights
Number crank_nicolson_step(const StateVector< Number > &old_state_vector, StateVector< Number > &new_state_vector, Number t, Number tau, Number tau_max=std::numeric_limits< Number >::max()) const override
Number backward_euler_step(const StateVector< Number > &old_state_vector, StageVectors stage_state_vectors, StageWeights stage_weights, StateVector< Number > &new_state_vector, Number t, Number tau, Number tau_max=std::numeric_limits< Number >::max()) const override
typename Interface::ParabolicModule< dim, Number >::StageVectors StageVectors
void prepare_state_vector(StateVector< Number > &state_vector, Number t) const override
void print_solver_statistics(std::ostream &output) const override
void reinit_state_vector(StateVector< Number > &) const override
dealii::LinearAlgebra::distributed::BlockVector< Number > BlockHostVector
typename View::ScalarNumber ScalarNumber
dealii::LinearAlgebra::distributed::Vector< Number > ScalarHostVector