87 std::cout <<
"Discretization<dim>::prepare()" << std::endl;
93 bool initialized =
false;
94 for (
auto &it : geometry_list_)
95 if (it->name() == geometry_) {
96 selected_geometry_ = it;
103 ExcMessage(
"Could not find a geometry description with name \"" +
109 const auto smoothing =
110 dealii::Triangulation<dim>::limit_level_difference_at_vertices;
112 switch (mesh_type_) {
114 triangulation_ = std::make_unique<
115 dealii::parallel::fullydistributed::Triangulation<dim>>(
116 mpi_ensemble_.ensemble_communicator());
117 triangulation_->set_mesh_smoothing(smoothing);
121 const auto settings = dealii::parallel::distributed::Triangulation<
122 dim>::Settings::construct_multigrid_hierarchy;
124 std::make_unique<dealii::parallel::distributed::Triangulation<dim>>(
125 mpi_ensemble_.ensemble_communicator(), smoothing, settings);
129 const auto settings =
static_cast<
130 typename dealii::parallel::shared::Triangulation<dim>::Settings
>(
131 dealii::parallel::shared::Triangulation<dim>::partition_auto |
132 dealii::parallel::shared::Triangulation<
133 dim>::construct_multigrid_hierarchy);
136 std::make_unique<dealii::parallel::shared::Triangulation<dim>>(
137 mpi_ensemble_.ensemble_communicator(),
145 mpi_ensemble_.n_ensemble_ranks() == 1,
147 "The serial triangulation can only be used for serial "
148 "computations. If you want to run simulations with more than one "
149 "rank per ensemble, then please set \"mesh type\" to one of the "
150 "parallel triangulations supported by deal.II"));
152 triangulation_ = std::make_unique<dealii::Triangulation<dim>>(smoothing);
162 auto &triangulation = *triangulation_;
163 selected_geometry_->create_coarse_triangulation(triangulation);
165 if (mesh_writeout_ && dealii::Utilities::MPI::this_mpi_process(
166 mpi_ensemble_.ensemble_communicator()) == 0) {
167#ifdef DEAL_II_GMSH_WITH_API
169 grid_out.write_msh(triangulation, base_name +
"-coarse_grid.msh");
172 GridOutFlags::Msh flags(
true,
true);
173 grid_out.set_flags(flags);
174 std::ofstream file(base_name +
"-coarse_grid.msh");
175 grid_out.write_msh(triangulation, file);
179 triangulation.refine_global(refinement_);
181 if (std::abs(mesh_distortion_) > 1.0e-10)
182 GridTools::distort_random(
183 mesh_distortion_, triangulation,
false, std::random_device()());
185 const auto fe_degree = polynomial_degree();
186 const auto mapping_degree = fe_degree;
187 const auto quadrature_degree = fe_degree + 1;
195 const auto collection_type =
196 selected_geometry_->populate_hp_collections(fe_degree, collection_);
198 switch (collection_type) {
204 Assert(collection_.mapping, dealii::ExcInternalError());
205 Assert(collection_.finite_element_cg, dealii::ExcInternalError());
206 Assert(collection_.finite_element_dg, dealii::ExcInternalError());
207 Assert(collection_.quadrature, dealii::ExcInternalError());
208 Assert(collection_.quadrature_high_order, dealii::ExcInternalError());
209 Assert(collection_.nodal_quadrature, dealii::ExcInternalError());
210 Assert(collection_.quadrature_1d, dealii::ExcInternalError());
211 Assert(collection_.nodal_quadrature_1d, dealii::ExcInternalError());
212 Assert(collection_.face_quadrature, dealii::ExcInternalError());
213 Assert(collection_.face_nodal_quadrature, dealii::ExcInternalError());
222 collection_.finite_element_cg =
223 std::make_unique<hp::FECollection<dim>>(FE_Q<dim>(fe_degree));
224 collection_.finite_element_dg =
225 std::make_unique<hp::FECollection<dim>>(FE_DGQ<dim>(fe_degree));
227 collection_.mapping =
228 std::make_unique<dealii::hp::MappingCollection<dim>>(
229 MappingQ<dim>(mapping_degree));
231 collection_.quadrature = std::make_unique<hp::QCollection<dim>>(
232 QGauss<dim>(quadrature_degree));
233 collection_.quadrature_high_order =
234 std::make_unique<hp::QCollection<dim>>(
235 QGauss<dim>(quadrature_degree + 1));
236 collection_.nodal_quadrature = std::make_unique<hp::QCollection<dim>>(
237 QGaussLobatto<dim>(quadrature_degree));
238 collection_.quadrature_1d =
239 std::make_unique<hp::QCollection<1>>(QGauss<1>(quadrature_degree));
240 collection_.nodal_quadrature_1d = std::make_unique<hp::QCollection<1>>(
241 QGaussLobatto<1>(quadrature_degree));
242 collection_.face_quadrature = std::make_unique<hp::QCollection<dim - 1>>(
243 QGauss<dim - 1>(quadrature_degree));
244 collection_.face_nodal_quadrature =
245 std::make_unique<hp::QCollection<dim - 1>>(
246 QGaussLobatto<dim - 1>(quadrature_degree));
255 collection_.finite_element_cg =
256 std::make_unique<hp::FECollection<dim>>(FE_SimplexP<dim>(fe_degree));
257 collection_.finite_element_dg = std::make_unique<hp::FECollection<dim>>(
258 FE_SimplexDGP<dim>(fe_degree));
260 if (mapping_degree == 1) {
261#if DEAL_II_VERSION_GTE(9, 7, 0)
262 collection_.mapping =
263 std::make_unique<hp::MappingCollection<dim>>(MappingP1<dim>());
265 collection_.mapping = std::make_unique<hp::MappingCollection<dim>>(
266 MappingFE<dim>(FE_SimplexP<dim>(fe_degree)));
269 collection_.mapping = std::make_unique<hp::MappingCollection<dim>>(
270 MappingFE<dim>(FE_SimplexP<dim>(fe_degree)));
273 collection_.quadrature = std::make_unique<hp::QCollection<dim>>(
274 QGaussSimplex<dim>(quadrature_degree));
275 collection_.quadrature_high_order =
276 std::make_unique<hp::QCollection<dim>>(
277 QGaussSimplex<dim>(quadrature_degree + 1));
278#if DEAL_II_VERSION_GTE(9, 7, 0)
279 collection_.nodal_quadrature = std::make_unique<hp::QCollection<dim>>(
280 FETools::compute_nodal_quadrature(
281 FE_SimplexP<dim>(quadrature_degree)));
284 dealii::ExcMessage(
"Discretization: Simplex support requires "
285 "deal.II version 9.7.0 or newer"));
288 collection_.quadrature_1d = std::make_unique<hp::QCollection<1>>(
289 QGaussSimplex<1>(quadrature_degree));
290#if DEAL_II_VERSION_GTE(9, 7, 0)
291 collection_.nodal_quadrature_1d = std::make_unique<hp::QCollection<1>>(
292 QGaussLobatto<1>(quadrature_degree));
294 collection_.face_quadrature = std::make_unique<hp::QCollection<dim - 1>>(
295 QGaussSimplex<dim - 1>(quadrature_degree));
296 if constexpr (dim == 1) {
297 collection_.face_nodal_quadrature =
298 std::make_unique<hp::QCollection<dim - 1>>(
299 QGaussLobatto<dim - 1>(quadrature_degree));
301#if DEAL_II_VERSION_GTE(9, 7, 0)
302 collection_.face_nodal_quadrature =
303 std::make_unique<hp::QCollection<dim - 1>>(
304 FETools::compute_nodal_quadrature(
305 FE_SimplexP<dim - 1>(quadrature_degree)));