ryujin 2.1.1 revision 955e869188d49b3c97ca7b1cf4fd9ceb0e6f46ef
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
119
120 using View =
121 typename Description::template HyperbolicSystemView<dim, Number>;
122
123 static constexpr auto problem_dimension = View::problem_dimension;
124
126 using InitialPrecomputedVector = typename View::InitialPrecomputedVector;
128
130
134
138 MeshAdaptor(const MPIEnsemble &mpi_ensemble,
139 const OfflineData<dim, Number> &offline_data,
140 const HyperbolicSystem &hyperbolic_system,
141 const ParabolicSystem &parabolic_system,
142 const InitialPrecomputedVector &initial_precomputed,
143 const ScalarVector &alpha,
144 const std::string &subsection = "/MeshAdaptor");
145
150 void prepare(const Number t);
151
157 void analyze(const StateVector &state_vector,
158 const Number t,
159 unsigned int cycle);
160
168
169
174 Triangulation &triangulation) const;
175
176 private:
181
182 AdaptationStrategy adaptation_strategy_;
183 std::uint_fast64_t random_adaptation_mersenne_twister_seed_;
184
185 MarkingStrategy marking_strategy_;
186 double refinement_fraction_;
187 double coarsening_fraction_;
188 unsigned int min_refinement_level_;
189 unsigned int max_refinement_level_;
190 unsigned int max_num_cells_;
191
192 TimePointSelectionStrategy time_point_selection_strategy_;
193 std::vector<Number> adaptation_time_points_;
194 unsigned int adaptation_cycle_interval_;
195
196 std::vector<std::string> kelly_quantities_;
197
199
203
204 const MPIEnsemble &mpi_ensemble_;
205
206 dealii::SmartPointer<const OfflineData<dim, Number>> offline_data_;
207 dealii::SmartPointer<const HyperbolicSystem> hyperbolic_system_;
208 dealii::SmartPointer<const ParabolicSystem> parabolic_system_;
209
210 bool need_mesh_adaptation_;
211
212 mutable dealii::Vector<float> indicators_;
213
214 /* random adaptation: */
215
216 void compute_random_indicators() const;
217
218 mutable std::mt19937_64 mersenne_twister_;
219
220 /* Kelly estimator: */
221
222 void populate_kelly_quantities(const StateVector &state_vector) const;
223 void compute_kelly_indicators() const;
224
225 const InitialPrecomputedVector &initial_precomputed_;
226 const ScalarVector &alpha_;
227
228 mutable std::vector<ScalarVector> kelly_components_;
230 };
231
232} // namespace ryujin
typename Proxy< dim >::Triangulation Triangulation
typename View::StateVector StateVector
Definition: mesh_adaptor.h:125
typename Discretization< dim >::Triangulation Triangulation
Definition: mesh_adaptor.h:118
Vectors::ScalarVector< Number > ScalarVector
Definition: mesh_adaptor.h:127
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:123
void analyze(const StateVector &state_vector, const Number t, unsigned int cycle)
typename View::InitialPrecomputedVector InitialPrecomputedVector
Definition: mesh_adaptor.h:126
typename Description::ParabolicSystem ParabolicSystem
Definition: mesh_adaptor.h:116
typename Description::HyperbolicSystem HyperbolicSystem
Definition: mesh_adaptor.h:115
typename Description::template HyperbolicSystemView< dim, Number > View
Definition: mesh_adaptor.h:121
const auto & need_mesh_adaptation() const
Definition: mesh_adaptor.h:167
void prepare(const Number t)
void mark_cells_for_coarsening_and_refinement(Triangulation &triangulation) const
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