8#include <compile_time_options.h>
13#include <deal.II/base/quadrature_lib.h>
14#include <deal.II/fe/fe_dgq.h>
15#include <deal.II/fe/fe_nothing.h>
16#include <deal.II/fe/fe_q.h>
17#include <deal.II/fe/mapping_q.h>
18#include <deal.II/grid/grid_out.h>
24 using namespace dealii;
28 const std::string &subsection)
29 : ParameterAcceptor(subsection)
30 , mpi_ensemble_(mpi_ensemble)
35 add_parameter(
"finite element ansatz",
37 "The finite element ansatz used for discretization. valid "
38 "choices are cG Q1, cG Q2, cG Q3.");
40 geometry_ =
"cylinder";
41 add_parameter(
"geometry",
43 "Name of the geometry used to create the mesh. Valid names "
44 "are given by any of the subsections defined below.");
47 add_parameter(
"mesh refinement",
49 "number of refinement of global refinement steps");
51 mesh_writeout_ =
true;
52 add_parameter(
"mesh writeout",
54 "Write out shared coarse mesh to a GMSH *.msh file.");
56 mesh_distortion_ = 0.;
58 "mesh distortion", mesh_distortion_,
"Strength of mesh distortion");
60 Geometries::populate_geometry_list<dim>(geometry_list_, subsection);
68 std::cout <<
"Discretization<dim>::prepare()" << std::endl;
71 const auto smoothing =
72 dealii::Triangulation<dim>::limit_level_difference_at_vertices;
75 const auto selection =
80 triangulation_ = std::make_unique<
81 dealii::parallel::fullydistributed::Triangulation<dim>>(
82 mpi_ensemble_.ensemble_communicator());
83 triangulation_->set_mesh_smoothing(smoothing);
87 const auto settings = dealii::parallel::distributed::Triangulation<
88 dim>::Settings::construct_multigrid_hierarchy;
90 std::make_unique<dealii::parallel::distributed::Triangulation<dim>>(
91 mpi_ensemble_.ensemble_communicator(), smoothing, settings);
95 const auto settings =
static_cast<
96 typename dealii::parallel::shared::Triangulation<dim>::Settings
>(
97 dealii::parallel::shared::Triangulation<dim>::partition_auto |
98 dealii::parallel::shared::Triangulation<
99 dim>::construct_multigrid_hierarchy);
102 std::make_unique<dealii::parallel::shared::Triangulation<dim>>(
103 mpi_ensemble_.ensemble_communicator(),
113 auto &triangulation = *triangulation_;
116 bool initialized =
false;
117 for (
auto &it : geometry_list_)
118 if (it->name() == geometry_) {
119 it->create_triangulation(triangulation);
126 ExcMessage(
"Could not find a geometry description with name \"" +
130 if (mesh_writeout_ && dealii::Utilities::MPI::this_mpi_process(
131 mpi_ensemble_.ensemble_communicator()) == 0) {
132#ifdef DEAL_II_GMSH_WITH_API
134 grid_out.write_msh(triangulation, base_name +
"-coarse_grid.msh");
137 GridOutFlags::Msh flags(
true,
true);
138 grid_out.set_flags(flags);
139 std::ofstream file(base_name +
"-coarse_grid.msh");
140 grid_out.write_msh(triangulation, file);
144 triangulation.refine_global(refinement_);
146 if (std::abs(mesh_distortion_) > 1.0e-10)
147 GridTools::distort_random(
148 mesh_distortion_, triangulation,
false, std::random_device()());
150 const auto fe_degree = polynomial_degree();
151 const auto mapping_degree = fe_degree;
152 const auto quadrature_degree = fe_degree + 1;
154 if (have_discontinuous_ansatz()) {
156 std::make_unique<hp::FECollection<dim>>(FE_DGQ<dim>(fe_degree));
158 std::make_unique<hp::FECollection<dim>>(FE_Q<dim>(fe_degree));
161 std::make_unique<hp::FECollection<dim>>(FE_Q<dim>(fe_degree));
163 std::make_unique<hp::FECollection<dim>>(FE_Q<dim>(fe_degree));
166 mapping_ = std::make_unique<dealii::hp::MappingCollection<dim>>(
167 MappingQ<dim>(mapping_degree));
170 std::make_unique<hp::QCollection<dim>>(QGauss<dim>(quadrature_degree));
171 quadrature_high_order_ = std::make_unique<hp::QCollection<dim>>(
172 QGauss<dim>(quadrature_degree + 1));
173 nodal_quadrature_ = std::make_unique<hp::QCollection<dim>>(
174 QGaussLobatto<dim>(quadrature_degree));
177 std::make_unique<hp::QCollection<1>>(QGauss<1>(quadrature_degree));
179 face_quadrature_ = std::make_unique<hp::QCollection<dim - 1>>(
180 QGauss<dim - 1>(quadrature_degree));
181 face_nodal_quadrature_ = std::make_unique<hp::QCollection<dim - 1>>(
182 QGaussLobatto<dim - 1>(quadrature_degree));
Discretization(const MPIEnsemble &mpi_ensemble, const std::string &subsection="/Discretization")
void prepare(const std::string &base_name)
@ parallel_fullydistributed