ryujin 2.1.1 revision 350e54cc11f3d21282bddcf3e6517944dbc508bf
mesh_adaptor.h
Go to the documentation of this file.
1//
2// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
3// Copyright (C) 2024 by the ryujin authors
4//
5
6#pragma once
7
8#include "mpi_ensemble.h"
9#include "offline_data.h"
10
11#include <deal.II/base/parameter_acceptor.h>
12#include <deal.II/base/smartpointer.h>
13
14#include <random>
15
16namespace ryujin
17{
23 enum class AdaptationStrategy {
28
35
40 };
41
49 enum class MarkingStrategy {
59 };
60
71
76 };
77} // namespace ryujin
78
79#ifndef DOXYGEN
80DECLARE_ENUM(
82 LIST({ryujin::AdaptationStrategy::global_refinement, "global refinement"},
84 {ryujin::AdaptationStrategy::kelly_estimator, "kelly estimator"}, ));
85
86DECLARE_ENUM(ryujin::MarkingStrategy,
87 LIST({ryujin::MarkingStrategy::fixed_number, "fixed number"},
89 "fixed fraction"}, ));
90
93 "fixed time points"},
95 "simulation cycle"}, ));
96#endif
97
98namespace ryujin
99{
106 template <typename Description, int dim, typename Number = double>
107 class MeshAdaptor final : public dealii::ParameterAcceptor
108 {
109 public:
114
117
118 using View =
119 typename Description::template HyperbolicSystemView<dim, Number>;
120
121 static constexpr auto problem_dimension = View::problem_dimension;
122
124 using InitialPrecomputedVector = typename View::InitialPrecomputedVector;
126
128
132
136 MeshAdaptor(const MPIEnsemble &mpi_ensemble,
137 const OfflineData<dim, Number> &offline_data,
138 const HyperbolicSystem &hyperbolic_system,
139 const ParabolicSystem &parabolic_system,
140 const InitialPrecomputedVector &initial_precomputed,
141 const ScalarVector &alpha,
142 const std::string &subsection = "/MeshAdaptor");
143
148 void prepare(const Number t);
149
155 void analyze(const StateVector &state_vector,
156 const Number t,
157 unsigned int cycle);
158
166
167
172 dealii::Triangulation<dim> &triangulation) const;
173
174 private:
179
180 AdaptationStrategy adaptation_strategy_;
181 std::uint_fast64_t random_adaptation_mersenne_twister_seed_;
182
183 MarkingStrategy marking_strategy_;
184 double refinement_fraction_;
185 double coarsening_fraction_;
186 unsigned int min_refinement_level_;
187 unsigned int max_refinement_level_;
188 unsigned int max_num_cells_;
189
190 TimePointSelectionStrategy time_point_selection_strategy_;
191 std::vector<Number> adaptation_time_points_;
192 unsigned int adaptation_cycle_interval_;
193
194 std::vector<std::string> kelly_quantities_;
195
197
201
202 const MPIEnsemble &mpi_ensemble_;
203
204 dealii::SmartPointer<const OfflineData<dim, Number>> offline_data_;
205 dealii::SmartPointer<const HyperbolicSystem> hyperbolic_system_;
206 dealii::SmartPointer<const ParabolicSystem> parabolic_system_;
207
208 bool need_mesh_adaptation_;
209
210 mutable dealii::Vector<float> indicators_;
211
212 /* random adaptation: */
213
214 void compute_random_indicators() const;
215
216 mutable std::mt19937_64 mersenne_twister_;
217
218 /* Kelly estimator: */
219
220 void populate_kelly_quantities(const StateVector &state_vector) const;
221 void compute_kelly_indicators() const;
222
223 const InitialPrecomputedVector &initial_precomputed_;
224 const ScalarVector &alpha_;
225
226 mutable std::vector<ScalarVector> kelly_components_;
228 };
229
230} // namespace ryujin
typename View::StateVector StateVector
Definition: mesh_adaptor.h:123
Vectors::ScalarVector< Number > ScalarVector
Definition: mesh_adaptor.h:125
MeshAdaptor(const MPIEnsemble &mpi_ensemble, const OfflineData< dim, Number > &offline_data, const HyperbolicSystem &hyperbolic_system, const ParabolicSystem &parabolic_system, const InitialPrecomputedVector &initial_precomputed, const ScalarVector &alpha, const std::string &subsection="/MeshAdaptor")
static constexpr auto problem_dimension
Definition: mesh_adaptor.h:121
void analyze(const StateVector &state_vector, const Number t, unsigned int cycle)
typename View::InitialPrecomputedVector InitialPrecomputedVector
Definition: mesh_adaptor.h:124
typename Description::ParabolicSystem ParabolicSystem
Definition: mesh_adaptor.h:116
typename Description::HyperbolicSystem HyperbolicSystem
Definition: mesh_adaptor.h:115
void mark_cells_for_coarsening_and_refinement(dealii::Triangulation< dim > &triangulation) const
typename Description::template HyperbolicSystemView< dim, Number > View
Definition: mesh_adaptor.h:119
const auto & need_mesh_adaptation() const
Definition: mesh_adaptor.h:165
void prepare(const Number t)
TimePointSelectionStrategy
Definition: mesh_adaptor.h:66
AdaptationStrategy
Definition: mesh_adaptor.h:23
MarkingStrategy
Definition: mesh_adaptor.h:49
#define ACCESSOR_READ_ONLY(member)
dealii::LinearAlgebra::distributed::Vector< Number > ScalarVector
Definition: state_vector.h:31
std::tuple< MultiComponentVector< Number, problem_dim >, MultiComponentVector< Number, prec_dim >, BlockVector< Number > > StateVector
Definition: state_vector.h:51
Euler::HyperbolicSystem HyperbolicSystem
Definition: description.h:32
ryujin::StubParabolicSystem ParabolicSystem
Definition: description.h:37