ryujin 2.1.1 revision 0b194b984a74af675d09b5e928529ca8c7b634f2
mesh_adaptor.template.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 "mesh_adaptor.h"
9
10#include <deal.II/grid/grid_refinement.h>
11
12namespace ryujin
13{
14 template <typename Description, int dim, typename Number>
16 const MPI_Comm &mpi_communicator,
17 const OfflineData<dim, Number> &offline_data,
18 const HyperbolicSystem &hyperbolic_system,
19 const ParabolicSystem &parabolic_system,
20 const std::string &subsection /*= "MeshAdaptor"*/)
21 : ParameterAcceptor(subsection)
22 , mpi_communicator_(mpi_communicator)
23 , offline_data_(&offline_data)
24 , hyperbolic_system_(&hyperbolic_system)
25 , parabolic_system_(&parabolic_system)
26 , need_mesh_adaptation_(false)
27 {
28 adaptation_strategy_ = AdaptationStrategy::global_refinement;
29 add_parameter("adaptation strategy",
30 adaptation_strategy_,
31 "The chosen adaptation strategy. Possible values are: global "
32 "refinement, random adaptation");
33
34 marking_strategy_ = MarkingStrategy::fixed_number;
35 add_parameter(
36 "marking strategy",
37 marking_strategy_,
38 "The chosen marking strategy. Possible values are: fixed number");
39
40 time_point_selection_strategy_ =
42 add_parameter("time point selection strategy",
43 time_point_selection_strategy_,
44 "The chosen time point selection strategy. Possible values "
45 "are: fixed adaptation time points");
46
47 /* Options for various adaptation strategies: */
48 enter_subsection("adaptation strategies");
49 random_adaptation_mersenne_twister_seed_ = 42u;
50 add_parameter("random adaptation: mersenne_twister_seed",
51 random_adaptation_mersenne_twister_seed_,
52 "Seed for 64bit Mersenne Twister used for random refinement");
53 leave_subsection();
54
55 /* Options for various marking strategies: */
56
57 enter_subsection("marking strategies");
58 fixed_number_refinement_fraction_ = 0.3;
59 add_parameter(
60 "fixed number: refinement fraction",
61 fixed_number_refinement_fraction_,
62 "Fixed number strategy: fraction of cells selected for refinement.");
63
64 fixed_number_coarsening_fraction_ = 0.3;
65 add_parameter(
66 "fixed number: coarsening fraction",
67 fixed_number_coarsening_fraction_,
68 "Fixed number strategy: fraction of cells selected for coarsening.");
69 leave_subsection();
70
71 /* Options for various time point selection strategies: */
72
73 enter_subsection("time point selection strategies");
74 adaptation_time_points_ = {};
75 add_parameter("adaptation timepoints",
76 adaptation_time_points_,
77 "List of time points in (simulation) time at which we will "
78 "perform a mesh adaptation cycle.");
79 leave_subsection();
80
81 const auto call_back = [this] {
82 /* Initialize Mersenne Twister with configured seed: */
83 mersenne_twister_.seed(random_adaptation_mersenne_twister_seed_);
84 };
85
86 call_back();
87 ParameterAcceptor::parse_parameters_call_back.connect(call_back);
88 }
89
90
91 template <typename Description, int dim, typename Number>
93 {
94#ifdef DEBUG_OUTPUT
95 std::cout << "MeshAdaptor<dim, Number>::prepare()" << std::endl;
96#endif
97
98 switch (time_point_selection_strategy_) {
100 /* Remove outdated refinement timestamps: */
101 const auto new_end = std::remove_if(
102 adaptation_time_points_.begin(),
103 adaptation_time_points_.end(),
104 [&](const Number &t_refinement) { return (t > t_refinement); });
105 adaptation_time_points_.erase(new_end, adaptation_time_points_.end());
106 } break;
107
108 default:
109 // do nothing
110 break;
111 }
112
113 /* toggle mesh adaptation flag to off. */
114 need_mesh_adaptation_ = false;
115 }
117
118 template <typename Description, int dim, typename Number>
120 const StateVector & /*state_vector*/,
121 const Number t,
122 unsigned int /*cycle*/)
123 {
124#ifdef DEBUG_OUTPUT
125 std::cout << "MeshAdaptor<dim, Number>::analyze()" << std::endl;
126#endif
127
128 switch (time_point_selection_strategy_) {
130 /* Remove all refinement points from the vector that lie in the past: */
131 const auto new_end = std::remove_if( //
132 adaptation_time_points_.begin(),
133 adaptation_time_points_.end(),
134 [&](const Number &t_refinement) {
135 if (t < t_refinement)
136 return false;
137 need_mesh_adaptation_ = true;
138 return true;
139 });
140 adaptation_time_points_.erase(new_end, adaptation_time_points_.end());
141 } break;
142
143 default:
144 AssertThrow(false, dealii::ExcInternalError());
145 __builtin_trap();
146 }
147 }
149
150 template <typename Description, int dim, typename Number>
153 dealii::Triangulation<dim> &triangulation) const
154 {
155 auto &discretization [[maybe_unused]] = offline_data_->discretization();
156 Assert(&triangulation == &discretization.triangulation(),
157 dealii::ExcInternalError());
158
159 /*
160 * Compute an indicator with the chosen adaptation strategy:
161 */
162
163 dealii::Vector<float> indicators;
164
165 switch (adaptation_strategy_) {
167 /* Simply mark all cells for refinement and return: */
168 for (auto &cell : triangulation.active_cell_iterators())
169 cell->set_refine_flag();
170 return;
171 } break;
172
174 indicators.reinit(triangulation.n_active_cells());
175 std::generate(std::begin(indicators), std::end(indicators), [&]() {
176 static std::uniform_real_distribution<double> distribution(0.0, 10.0);
177 return distribution(mersenne_twister_);
178 });
179 } break;
180
181 default:
182 AssertThrow(false, dealii::ExcInternalError());
183 __builtin_trap();
184 }
185
186 /*
187 * Mark cells with chosen marking strategy:
188 */
189
190 switch (marking_strategy_) {
192 dealii::GridRefinement::refine_and_coarsen_fixed_number(
193 triangulation,
194 indicators,
195 fixed_number_refinement_fraction_,
196 fixed_number_coarsening_fraction_);
197 } break;
198
199 default:
200 AssertThrow(false, dealii::ExcInternalError());
201 __builtin_trap();
202 }
203 }
204} // namespace ryujin
typename View::StateVector StateVector
Definition: mesh_adaptor.h:103
void analyze(const StateVector &state_vector, const Number t, unsigned int cycle)
typename Description::ParabolicSystem ParabolicSystem
Definition: mesh_adaptor.h:96
typename Description::HyperbolicSystem HyperbolicSystem
Definition: mesh_adaptor.h:95
void mark_cells_for_coarsening_and_refinement(dealii::Triangulation< dim > &triangulation) const
void prepare(const Number t)
MeshAdaptor(const MPI_Comm &mpi_communicator, const OfflineData< dim, Number > &offline_data, const HyperbolicSystem &hyperbolic_system, const ParabolicSystem &parabolic_system, const std::string &subsection="/MeshAdaptor")