8#include <compile_time_options.h>
13#include <deal.II/base/quadrature_lib.h>
14#include <deal.II/fe/fe_q.h>
15#include <deal.II/fe/mapping_q.h>
22 using namespace dealii;
26 const std::string &subsection)
27 : ParameterAcceptor(subsection)
28 , mpi_communicator_(mpi_communicator)
30 const auto smoothing =
31 dealii::Triangulation<dim>::limit_level_difference_at_vertices;
33 if constexpr (have_distributed_triangulation<dim>) {
35 Triangulation::Settings::construct_multigrid_hierarchy;
40 const auto settings =
static_cast<typename Triangulation::Settings
>(
41 Triangulation::partition_auto |
42 Triangulation::construct_multigrid_hierarchy);
51 geometry_ =
"cylinder";
52 add_parameter(
"geometry",
54 "Name of the geometry used to create the mesh. Valid names "
55 "are given by any of the subsections defined below.");
58 add_parameter(
"mesh refinement",
60 "number of refinement of global refinement steps");
62 mesh_distortion_ = 0.;
64 "mesh distortion", mesh_distortion_,
"Strength of mesh distortion");
66 repartitioning_ =
false;
67 add_parameter(
"mesh repartitioning",
69 "try to equalize workload by repartitioning the mesh");
71 Geometries::populate_geometry_list<dim>(geometry_list_, subsection);
79 std::cout <<
"Discretization<dim>::prepare()" << std::endl;
82 auto &triangulation = *triangulation_;
83 triangulation.clear();
86 bool initialized =
false;
87 for (
auto &it : geometry_list_)
88 if (it->name() == geometry_) {
89 it->create_triangulation(triangulation);
96 ExcMessage(
"Could not find a geometry description with name \"" +
100 if constexpr (have_distributed_triangulation<dim>) {
101 if (repartitioning_) {
122 constexpr auto speedup = dealii::VectorizedArray<NUMBER>::size() / 2u;
123 constexpr unsigned int weight = 1000u;
125#if DEAL_II_VERSION_GTE(9, 5, 0)
126 triangulation.signals.weight.connect(
128 triangulation.signals.cell_weight.connect(
130 [](
const auto &cell,
const auto ) ->
unsigned int {
131 if (cell->at_boundary())
132 return weight * (speedup == 0u ? 0u : speedup - 1u);
137 triangulation.repartition();
141 triangulation.refine_global(refinement_);
143 if (std::abs(mesh_distortion_) > 1.0e-10)
144 GridTools::distort_random(
145 mesh_distortion_, triangulation, std::random_device()());
147 mapping_ = std::make_unique<MappingQ<dim>>(order_mapping);
148 finite_element_ = std::make_unique<FE_Q<dim>>(order_finite_element);
149 quadrature_ = std::make_unique<QGauss<dim>>(order_quadrature);
150 quadrature_1d_ = std::make_unique<QGauss<1>>(order_quadrature);
std::unique_ptr< Triangulation > triangulation_
Discretization(const MPI_Comm &mpi_communicator, const std::string &subsection="/Discretization")
const MPI_Comm & mpi_communicator_