ryujin 2.1.1 revision 46bf70e400e423a8ffffe8300887eeb35b8dfb2c
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 <compile_time_options.h>
9
10#include "mpi_ensemble.h"
11#include "observer_pointer.h"
12#include "offline_data.h"
13
14#include <deal.II/base/parameter_acceptor.h>
15
16#include <random>
17
18namespace ryujin
19{
25 enum class AdaptationStrategy {
30
37
42 };
43
51 enum class MarkingStrategy {
58 };
59
70
75 };
76} // namespace ryujin
77
78#ifndef DOXYGEN
79DECLARE_ENUM(
81 LIST({ryujin::AdaptationStrategy::global_refinement, "global refinement"},
84 "smoothness indicators"}, ));
85
86DECLARE_ENUM(ryujin::MarkingStrategy,
88 "fixed threshold"}));
89
92 "fixed time points"},
94 "simulation cycle"}, ));
95#endif
96
97namespace ryujin
98{
105 template <typename Description, int dim, typename Number = double>
106 class MeshAdaptor final : public dealii::ParameterAcceptor
107 {
108 public:
113
116
117 using View =
118 typename Description::template HyperbolicSystemView<dim, Number>;
119
120 static constexpr auto problem_dimension = View::problem_dimension;
121
123 using InitialPrecomputedVector = typename View::InitialPrecomputedVector;
125
127
131
135 MeshAdaptor(const MPIEnsemble &mpi_ensemble,
136 const OfflineData<dim, Number> &offline_data,
137 const HyperbolicSystem &hyperbolic_system,
138 const ParabolicSystem &parabolic_system,
139 const InitialPrecomputedVector &initial_precomputed,
140 const ScalarVector &alpha,
141 const std::string &subsection = "/MeshAdaptor");
142
147 void prepare(const Number t);
148
154 void analyze(const StateVector &state_vector,
155 const Number t,
156 unsigned int cycle);
157
165
166
171 dealii::Triangulation<dim> &triangulation) const;
172
177
182 void compute_smoothness_indicators(const StateVector &state_vector) const;
183
189
190 private:
195
196 AdaptationStrategy adaptation_strategy_;
197 std::uint_fast64_t random_adaptation_mersenne_twister_seed_;
198
199 MarkingStrategy marking_strategy_;
200 double coarsening_threshold_;
201 double refinement_threshold_;
202 bool absolute_threshold_;
203 unsigned int min_refinement_level_;
204 unsigned int max_refinement_level_;
205
206 TimePointSelectionStrategy time_point_selection_strategy_;
207 std::vector<Number> adaptation_time_points_;
208 unsigned int adaptation_cycle_interval_;
209
210 std::vector<std::string> smoothness_selected_quantities_;
211 Number smoothness_local_global_ratio_;
212 Number smoothness_min_cutoff_;
213 Number smoothness_max_cutoff_;
214 unsigned int smoothness_widen_stencil_;
215
217
221
222 const MPIEnsemble &mpi_ensemble_;
223
224 dealii::ObserverPointer<const OfflineData<dim, Number>> offline_data_;
225 dealii::ObserverPointer<const HyperbolicSystem> hyperbolic_system_;
226 dealii::ObserverPointer<const ParabolicSystem> parabolic_system_;
227
228 const InitialPrecomputedVector &initial_precomputed_;
229 const ScalarVector &alpha_;
230
231 bool need_mesh_adaptation_;
232
233 mutable dealii::Vector<float> indicators_;
234
235 /* random adaptation: */
236
237 void populate_cell_indicators_with_random_values() const;
238
239 mutable std::mt19937_64 mersenne_twister_;
240
241 /* Smoothness indicator: */
242
243 void populate_cell_indicators_from_smoothness_indicators() const;
244
245 mutable ScalarVector smoothness_indicators_;
247 };
248
249} // namespace ryujin
void compute_smoothness_indicators(const StateVector &state_vector) const
typename View::StateVector StateVector
Definition: mesh_adaptor.h:122
Vectors::ScalarVector< Number > ScalarVector
Definition: mesh_adaptor.h:124
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:120
void analyze(const StateVector &state_vector, const Number t, unsigned int cycle)
const auto & smoothness_indicators() const
Definition: mesh_adaptor.h:188
typename View::InitialPrecomputedVector InitialPrecomputedVector
Definition: mesh_adaptor.h:123
typename Description::ParabolicSystem ParabolicSystem
Definition: mesh_adaptor.h:115
typename Description::HyperbolicSystem HyperbolicSystem
Definition: mesh_adaptor.h:114
void mark_cells_for_coarsening_and_refinement(dealii::Triangulation< dim > &triangulation) const
typename Description::template HyperbolicSystemView< dim, Number > View
Definition: mesh_adaptor.h:118
const auto & need_mesh_adaptation() const
Definition: mesh_adaptor.h:164
void prepare(const Number t)
const auto & indicators() const
Definition: mesh_adaptor.h:176
TimePointSelectionStrategy
Definition: mesh_adaptor.h:65
AdaptationStrategy
Definition: mesh_adaptor.h:25
MarkingStrategy
Definition: mesh_adaptor.h:51
#define ACCESSOR_READ_ONLY(member)
dealii::LinearAlgebra::distributed::Vector< Number > ScalarVector
Definition: state_vector.h:33
std::tuple< MultiComponentVector< Number, problem_dim >, MultiComponentVector< Number, prec_dim >, BlockVector< Number > > StateVector
Definition: state_vector.h:53
Euler::HyperbolicSystem HyperbolicSystem
Definition: description.h:34
ryujin::StubParabolicSystem ParabolicSystem
Definition: description.h:39