ryujin 2.1.1 revision feb53359f0c9a08baf43c3dfe847d8a9f7d6893a
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 "patterns_conversion.h"
13
14#include <deal.II/base/parameter_acceptor.h>
15#include <deal.II/base/quadrature.h>
16#include <deal.II/distributed/shared_tria.h>
17#include <deal.II/distributed/tria.h>
18#include <deal.II/fe/fe.h>
19#include <deal.II/fe/mapping.h>
20
21#include <memory>
22#include <set>
23
24namespace ryujin
25{
48 enum Boundary : dealii::types::boundary_id {
58
65
75 slip = 2,
76
86
98
106
114 };
115} // namespace ryujin
116
117#ifndef DOXYGEN
118DECLARE_ENUM(ryujin::Boundary,
119 LIST({ryujin::Boundary::do_nothing, "do_nothing"},
120 {ryujin::Boundary::periodic, "periodic"},
121 {ryujin::Boundary::slip, "slip"},
122 {ryujin::Boundary::no_slip, "no_slip"},
123 {ryujin::Boundary::dirichlet, "dirichlet"},
124 {ryujin::Boundary::dynamic, "dynamic"},
126 "dirichlet momentum"}));
127#endif
128
129namespace ryujin
130{
131 namespace
132 {
133 template <int dim>
134 struct Proxy {
135 using Triangulation = dealii::parallel::distributed::Triangulation<dim>;
136 };
137
138 template <>
139 struct Proxy<1> {
140 using Triangulation = dealii::parallel::shared::Triangulation<1>;
141 };
142
143 } // namespace
144
145#ifndef DOXYGEN
146 /* forward declaration */
147 template <int dim>
148 class Discretization;
149#endif
150
155 template <int dim>
157 std::is_same<typename Discretization<dim>::Triangulation,
158 dealii::parallel::distributed::Triangulation<dim>>::value;
159
160
176 template <int dim>
177 class Discretization : public dealii::ParameterAcceptor
178 {
179 public:
187 using Triangulation = typename Proxy<dim>::Triangulation;
188
189 static_assert(dim == 1 || have_distributed_triangulation<dim>);
190
194 Discretization(const MPI_Comm &mpi_communicator,
195 const std::string &subsection = "/Discretization");
196
201 void prepare();
202
207
208 static constexpr unsigned int order_finite_element = ORDER_FINITE_ELEMENT;
209 static constexpr unsigned int order_mapping = ORDER_MAPPING;
210 static constexpr unsigned int order_quadrature = ORDER_QUADRATURE;
211
213
217
218 protected:
219 const MPI_Comm &mpi_communicator_;
220
221 std::unique_ptr<Triangulation> triangulation_;
222 std::unique_ptr<const dealii::Mapping<dim>> mapping_;
223 std::unique_ptr<const dealii::FiniteElement<dim>> finite_element_;
224 std::unique_ptr<const dealii::Quadrature<dim>> quadrature_;
225 std::unique_ptr<const dealii::Quadrature<1>> quadrature_1d_;
226
227 public:
231 ACCESSOR(refinement)
232
233
237
238
242
247
252
257
262
263 private:
265
269
270 std::string geometry_;
271
272 double mesh_distortion_;
273
274 unsigned int refinement_;
275
276 bool repartitioning_;
277
279
283
284 std::set<std::unique_ptr<Geometry<dim>>> geometry_list_;
285
287 };
288} /* namespace ryujin */
auto & finite_element() const
typename Proxy< dim >::Triangulation Triangulation
std::unique_ptr< Triangulation > triangulation_
auto & triangulation() const
std::unique_ptr< const dealii::Quadrature< 1 > > quadrature_1d_
std::unique_ptr< const dealii::Mapping< dim > > mapping_
static constexpr unsigned int order_mapping
static constexpr unsigned int order_quadrature
auto & mapping() const
auto & quadrature() const
Discretization(const MPI_Comm &mpi_communicator, const std::string &subsection="/Discretization")
const MPI_Comm & mpi_communicator_
auto & quadrature_1d() const
static constexpr unsigned int order_finite_element
std::unique_ptr< const dealii::FiniteElement< dim > > finite_element_
std::unique_ptr< const dealii::Quadrature< dim > > quadrature_
@ dirichlet_momentum
#define ACCESSOR(member)
#define ACCESSOR_READ_ONLY(member)
constexpr bool have_distributed_triangulation