ryujin 2.1.1 revision 350e54cc11f3d21282bddcf3e6517944dbc508bf
discretization.template.h
Go to the documentation of this file.
1//
2// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
3// Copyright (C) 2020 - 2023 by the ryujin authors
4//
5
6#pragma once
7
8#include <compile_time_options.h>
9
10#include "discretization.h"
12
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>
19
20#include <random>
21
22namespace ryujin
23{
24 using namespace dealii;
25
26 template <int dim>
28 const std::string &subsection)
29 : ParameterAcceptor(subsection)
30 , mpi_ensemble_(mpi_ensemble)
31 {
32 /* Options: */
33
34 ansatz_ = Ansatz::cg_q1;
35 add_parameter("finite element ansatz",
36 ansatz_,
37 "The finite element ansatz used for discretization. valid "
38 "choices are cG Q1, cG Q2, cG Q3.");
39
40 geometry_ = "cylinder";
41 add_parameter("geometry",
42 geometry_,
43 "Name of the geometry used to create the mesh. Valid names "
44 "are given by any of the subsections defined below.");
45
46 refinement_ = 5;
47 add_parameter("mesh refinement",
48 refinement_,
49 "number of refinement of global refinement steps");
50
51 mesh_writeout_ = true;
52 add_parameter("mesh writeout",
53 mesh_writeout_,
54 "Write out shared coarse mesh to a GMSH *.msh file.");
55
56 mesh_distortion_ = 0.;
57 add_parameter(
58 "mesh distortion", mesh_distortion_, "Strength of mesh distortion");
59
60 Geometries::populate_geometry_list<dim>(geometry_list_, subsection);
61 }
62
63
64 template <int dim>
65 void Discretization<dim>::prepare(const std::string &base_name)
66 {
67#ifdef DEBUG_OUTPUT
68 std::cout << "Discretization<dim>::prepare()" << std::endl;
69#endif
70
71 const auto smoothing =
72 dealii::Triangulation<dim>::limit_level_difference_at_vertices;
73
74 // FIXME: This information will ultimately be provided by the Geometry.
75 const auto selection =
77
78 switch (selection) {
80 triangulation_ = std::make_unique<
81 dealii::parallel::fullydistributed::Triangulation<dim>>(
82 mpi_ensemble_.ensemble_communicator());
83 triangulation_->set_mesh_smoothing(smoothing);
84 } break;
85
87 const auto settings = dealii::parallel::distributed::Triangulation<
88 dim>::Settings::construct_multigrid_hierarchy;
89 triangulation_ =
90 std::make_unique<dealii::parallel::distributed::Triangulation<dim>>(
91 mpi_ensemble_.ensemble_communicator(), smoothing, settings);
92 } break;
93
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);
100 /* Beware of the boolean: */
101 triangulation_ =
102 std::make_unique<dealii::parallel::shared::Triangulation<dim>>(
103 mpi_ensemble_.ensemble_communicator(),
104 smoothing,
105 /*artificial cells*/ true,
106 settings);
107 } break;
108
109 default:
110 __builtin_trap();
111 }
112
113 auto &triangulation = *triangulation_;
114
115 {
116 bool initialized = false;
117 for (auto &it : geometry_list_)
118 if (it->name() == geometry_) {
119 it->create_triangulation(triangulation);
120 initialized = true;
121 break;
122 }
123
124 AssertThrow(
125 initialized,
126 ExcMessage("Could not find a geometry description with name \"" +
127 geometry_ + "\""));
128 }
129
130 if (mesh_writeout_ && dealii::Utilities::MPI::this_mpi_process(
131 mpi_ensemble_.ensemble_communicator()) == 0) {
132#ifdef DEAL_II_GMSH_WITH_API
133 GridOut grid_out;
134 grid_out.write_msh(triangulation, base_name + "-coarse_grid.msh");
135#else
136 GridOut grid_out;
137 GridOutFlags::Msh flags(/* write faces */ true, /* write lines */ true);
138 grid_out.set_flags(flags);
139 std::ofstream file(base_name + "-coarse_grid.msh");
140 grid_out.write_msh(triangulation, file);
141#endif
142 }
143
144 triangulation.refine_global(refinement_);
145
146 if (std::abs(mesh_distortion_) > 1.0e-10)
147 GridTools::distort_random(
148 mesh_distortion_, triangulation, false, std::random_device()());
149
150 const auto fe_degree = polynomial_degree();
151 const auto mapping_degree = fe_degree;
152 const auto quadrature_degree = fe_degree + 1;
153
154 if (have_discontinuous_ansatz()) {
155 finite_element_ =
156 std::make_unique<hp::FECollection<dim>>(FE_DGQ<dim>(fe_degree));
157 finite_element_cg_ =
158 std::make_unique<hp::FECollection<dim>>(FE_Q<dim>(fe_degree));
159 } else {
160 finite_element_ =
161 std::make_unique<hp::FECollection<dim>>(FE_Q<dim>(fe_degree));
162 finite_element_cg_ =
163 std::make_unique<hp::FECollection<dim>>(FE_Q<dim>(fe_degree));
164 }
165
166 mapping_ = std::make_unique<dealii::hp::MappingCollection<dim>>(
167 MappingQ<dim>(mapping_degree));
168
169 quadrature_ =
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));
175
176 quadrature_1d_ =
177 std::make_unique<hp::QCollection<1>>(QGauss<1>(quadrature_degree));
178
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));
183 }
184
185} /* namespace ryujin */
Discretization(const MPIEnsemble &mpi_ensemble, const std::string &subsection="/Discretization")
void prepare(const std::string &base_name)