ryujin 2.1.1 revision 955e869188d49b3c97ca7b1cf4fd9ceb0e6f46ef
discretization.h
Go to the documentation of this file.
1//
2// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
3// Copyright (C) 2020 - 2024 by the ryujin authors
4//
5
6#pragma once
7
8#include <compile_time_options.h>
9
10#include "convenience_macros.h"
11#include "geometry.h"
12#include "mpi_ensemble.h"
13#include "patterns_conversion.h"
14
15#include <deal.II/base/parameter_acceptor.h>
16#include <deal.II/base/quadrature.h>
17#include <deal.II/distributed/shared_tria.h>
18#include <deal.II/distributed/tria.h>
19#include <deal.II/fe/fe.h>
20#include <deal.II/fe/mapping.h>
21
22#include <memory>
23#include <set>
24
25namespace ryujin
26{
52 enum Boundary : dealii::types::boundary_id {
62
69
79 slip = 2,
80
90
102
118
127 };
128
129
135 enum class Ansatz {
137 cg_q1,
138
140 cg_q2,
141
143 cg_q3,
144
146 dg_q1,
147
149 dg_q2,
150
152 dg_q3
153 };
154} // namespace ryujin
155
156#ifndef DOXYGEN
157DECLARE_ENUM(ryujin::Boundary,
158 LIST({ryujin::Boundary::do_nothing, "do nothing"},
159 {ryujin::Boundary::periodic, "periodic"},
160 {ryujin::Boundary::slip, "slip"},
161 {ryujin::Boundary::no_slip, "no slip"},
162 {ryujin::Boundary::dirichlet, "dirichlet"},
163 {ryujin::Boundary::dynamic, "dynamic"},
165 "dirichlet momentum"}));
166
167DECLARE_ENUM(ryujin::Ansatz,
168 LIST({ryujin::Ansatz::cg_q1, "cG Q1"},
169 {ryujin::Ansatz::cg_q2, "cG Q2"},
170 {ryujin::Ansatz::cg_q3, "cG Q3"},
171 {ryujin::Ansatz::dg_q1, "dG Q1"},
172 {ryujin::Ansatz::dg_q2, "dG Q2"},
173 {ryujin::Ansatz::dg_q3, "dG Q3"}));
174#endif
175
176namespace ryujin
177{
178 namespace
179 {
180 template <int dim>
181 struct Proxy {
182 using Triangulation = dealii::parallel::distributed::Triangulation<dim>;
183 };
184
185 template <>
186 struct Proxy<1> {
187 using Triangulation = dealii::parallel::shared::Triangulation<1>;
188 };
189
190 } // namespace
191
192
208 template <int dim>
209 class Discretization : public dealii::ParameterAcceptor
210 {
211 public:
219 using Triangulation = typename Proxy<dim>::Triangulation;
220
224 Discretization(const MPIEnsemble &mpi_ensemble,
225 const std::string &subsection = "/Discretization");
226
231 void prepare(const std::string &base_name);
232
237
242
243 public:
249 {
250 switch (ansatz_) {
251 /* Continuous Ansatz: */
252 case Ansatz::cg_q1:
253 [[fallthrough]];
254 case Ansatz::cg_q2:
255 [[fallthrough]];
256 case Ansatz::cg_q3:
257 return false;
258
259 /* Discontinuous Ansatz: */
260 case Ansatz::dg_q1:
261 [[fallthrough]];
262 case Ansatz::dg_q2:
263 [[fallthrough]];
264 case Ansatz::dg_q3:
265 return true;
266 }
267
268 AssertThrow(false, dealii::ExcInternalError());
269 __builtin_trap();
270 }
271
275 ACCESSOR(refinement)
276
277
281
282
286
291
296
304
309
315
320
325
331
332 protected:
334
336 std::unique_ptr<const dealii::Mapping<dim>> mapping_;
337 std::unique_ptr<const dealii::FiniteElement<dim>> finite_element_;
338 std::unique_ptr<const dealii::FiniteElement<dim>> finite_element_cg_;
339 std::unique_ptr<const dealii::Quadrature<dim>> quadrature_;
340 std::unique_ptr<const dealii::Quadrature<dim>> nodal_quadrature_;
341 std::unique_ptr<const dealii::Quadrature<1>> quadrature_1d_;
342 std::unique_ptr<const dealii::Quadrature<dim - 1>> face_quadrature_;
343 std::unique_ptr<const dealii::Quadrature<dim - 1>> face_nodal_quadrature_;
344
345 private:
347
351
352 Ansatz ansatz_;
353
354 std::string geometry_;
355
356 unsigned int refinement_;
357
358 bool mesh_writeout_;
359 double mesh_distortion_;
360
362
366
367 std::set<std::unique_ptr<Geometry<dim>>> geometry_list_;
368
370
378 template <typename Discretization, int dim_, typename Number_>
379 friend class SolutionTransfer;
380 };
381
382
387 template <int dim>
389 std::is_same<typename Discretization<dim>::Triangulation,
390 dealii::parallel::distributed::Triangulation<dim>>::value;
391} /* namespace ryujin */
const auto & finite_element_cg() const
const auto & triangulation() const
std::unique_ptr< const dealii::Quadrature< dim - 1 > > face_quadrature_
typename Proxy< dim >::Triangulation Triangulation
const auto & face_quadrature() const
std::unique_ptr< const dealii::FiniteElement< dim > > finite_element_cg_
const auto & nodal_quadrature() const
const auto & ansatz() const
std::unique_ptr< Triangulation > triangulation_
std::unique_ptr< const dealii::Quadrature< 1 > > quadrature_1d_
std::unique_ptr< const dealii::Quadrature< dim - 1 > > face_nodal_quadrature_
std::unique_ptr< const dealii::Mapping< dim > > mapping_
const auto & mapping() const
Discretization(const MPIEnsemble &mpi_ensemble, const std::string &subsection="/Discretization")
const MPIEnsemble & mpi_ensemble_
void prepare(const std::string &base_name)
std::unique_ptr< const dealii::Quadrature< dim > > nodal_quadrature_
const auto & quadrature() const
bool have_discontinuous_ansatz() const
const auto & finite_element() const
const auto & quadrature_1d() const
std::unique_ptr< const dealii::FiniteElement< dim > > finite_element_
const auto & face_nodal_quadrature() const
std::unique_ptr< const dealii::Quadrature< dim > > quadrature_
@ dirichlet_momentum
#define ACCESSOR(member)
#define ACCESSOR_READ_ONLY(member)
constexpr bool have_distributed_triangulation