ryujin 2.1.1 revision 71cdc42292164f8095c0bd62c4ea75ebcfac58fa
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"
14
15#include <deal.II/base/parameter_acceptor.h>
16
17#include <random>
18
19namespace ryujin
20{
44
52 enum class MarkingStrategy {
59 };
60
77} // namespace ryujin
78
79#ifndef DOXYGEN
80DECLARE_ENUM(
82 LIST({ryujin::AdaptationStrategy::global_refinement, "global refinement"},
85 "smoothness indicators"}, ));
86
87DECLARE_ENUM(ryujin::MarkingStrategy,
89 "fixed threshold"}));
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 = typename HyperbolicSystem::template View<dim, Number>;
119
120 static constexpr auto problem_dimension = View::problem_dimension;
121
122 using StateVector = typename View::StateVector;
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
150
154
160 void analyze(const StateVector &state_vector,
161 const Number t,
162 unsigned int cycle);
163
169 dealii::Triangulation<dim> &triangulation) const;
170
175 void compute_smoothness_indicators(const StateVector &state_vector) const;
176
178
182
190
191
195
201
202 private:
204
208
209 AdaptationStrategy adaptation_strategy_;
210 std::uint_fast64_t random_adaptation_mersenne_twister_seed_;
211
212 MarkingStrategy marking_strategy_;
213 double coarsening_threshold_;
214 double refinement_threshold_;
215 bool absolute_threshold_;
216 unsigned int min_refinement_level_;
217 unsigned int max_refinement_level_;
218
219 TimePointSelectionStrategy time_point_selection_strategy_;
220 std::vector<Number> adaptation_time_points_;
221 unsigned int adaptation_cycle_interval_;
222
223 std::vector<std::string> smoothness_selected_quantities_;
224 Number smoothness_local_global_ratio_;
225 Number smoothness_min_cutoff_;
226 Number smoothness_max_cutoff_;
227 unsigned int smoothness_widen_stencil_;
228
230
234
235 const MPIEnsemble &mpi_ensemble_;
236
237 dealii::ObserverPointer<const OfflineData<dim, Number>> offline_data_;
238
240 selected_components_extractor_;
241
242 bool need_mesh_adaptation_;
243
244 mutable dealii::Vector<float> indicators_;
245
246 /* random adaptation: */
247 mutable std::mt19937_64 mersenne_twister_;
248
249 /* smoothness indicators: */
250 mutable ScalarVector smoothness_indicators_;
251
253
257
258 /* random adaptation: */
259 void populate_cell_indicators_with_random_values() const;
260
261 /* smoothness indicators: */
262 void populate_cell_indicators_from_smoothness_indicators() const;
263
265 };
266
267} // 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