ryujin 2.1.1 revision ee5cbcbf2346c1299c942d0e1f13b46449973c18
Loading...
Searching...
No Matches
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 - 2026 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{
43
51 enum class MarkingStrategy {
58 };
59
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 = typename HyperbolicSystem::template View<dim, Number>;
118
119 static constexpr auto problem_dimension = View::problem_dimension;
120
121 using StateVector = typename View::StateVector;
122 using InitialPrecomputedVector = typename View::InitialPrecomputedVector;
124
126
130
134 MeshAdaptor(const MPIEnsemble &mpi_ensemble,
135 const OfflineData<dim, Number> &offline_data,
136 const HyperbolicSystem &hyperbolic_system,
137 const ParabolicSystem &parabolic_system,
138 const InitialPrecomputedVector &initial_precomputed,
139 const ScalarVector &alpha,
140 const std::string &subsection = "/MeshAdaptor");
141
146 void prepare(const Number t);
147
149
153
159 void analyze(const StateVector &state_vector,
160 const Number t,
161 unsigned int cycle);
162
168 dealii::Triangulation<dim> &triangulation) const;
169
174 void compute_smoothness_indicators(const StateVector &state_vector) const;
175
177
181
189
190
194
200
201 private:
203
207
208 AdaptationStrategy adaptation_strategy_;
209 std::uint_fast64_t random_adaptation_mersenne_twister_seed_;
210
211 MarkingStrategy marking_strategy_;
212 double coarsening_threshold_;
213 double refinement_threshold_;
214 bool absolute_threshold_;
215 unsigned int min_refinement_level_;
216 unsigned int max_refinement_level_;
217
218 TimePointSelectionStrategy time_point_selection_strategy_;
219 std::vector<Number> adaptation_time_points_;
220 unsigned int adaptation_cycle_interval_;
221
222 std::vector<std::string> smoothness_selected_quantities_;
223 Number smoothness_local_global_ratio_;
224 Number smoothness_min_cutoff_;
225 Number smoothness_max_cutoff_;
226 unsigned int smoothness_widen_stencil_;
227
229
233
234 const MPIEnsemble &mpi_ensemble_;
235
236 dealii::ObserverPointer<const OfflineData<dim, Number>> offline_data_;
237 dealii::ObserverPointer<const HyperbolicSystem> hyperbolic_system_;
238 dealii::ObserverPointer<const ParabolicSystem> parabolic_system_;
239
240 const InitialPrecomputedVector &initial_precomputed_;
241 const ScalarVector &alpha_;
242
243 bool need_mesh_adaptation_;
244
245 mutable dealii::Vector<float> indicators_;
246
247 /* random adaptation: */
248 mutable std::mt19937_64 mersenne_twister_;
249
250 /* smoothness indicators: */
251 mutable ScalarVector smoothness_indicators_;
252
254
258
259 /* random adaptation: */
260 void populate_cell_indicators_with_random_values() const;
261
262 /* smoothness indicators: */
263 void populate_cell_indicators_from_smoothness_indicators() const;
264
266 };
267
268} // namespace ryujin
void compute_smoothness_indicators(const StateVector &state_vector) const
typename View::StateVector StateVector
static constexpr auto problem_dimension
void analyze(const StateVector &state_vector, const Number t, unsigned int cycle)
const auto & smoothness_indicators() const
typename View::InitialPrecomputedVector InitialPrecomputedVector
typename Description::ParabolicSystem ParabolicSystem
typename Description::HyperbolicSystem HyperbolicSystem
void mark_cells_for_coarsening_and_refinement(dealii::Triangulation< dim > &triangulation) const
typename HyperbolicSystem::template View< dim, Number > View
const auto & need_mesh_adaptation() const
void prepare(const Number t)
const auto & indicators() const
TimePointSelectionStrategy
AdaptationStrategy
#define ACCESSOR_READ_ONLY(member)
SmartPointer< T, P > ObserverPointer
Euler::HyperbolicSystem HyperbolicSystem
Definition description.h:34
ryujin::StubParabolicSystem ParabolicSystem
Definition description.h:36