ryujin 2.1.1 revision 350e54cc11f3d21282bddcf3e6517944dbc508bf
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 "geometries/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/distributed/fully_distributed_tria.h>
17#include <deal.II/distributed/shared_tria.h>
18#include <deal.II/distributed/tria.h>
19#include <deal.II/hp/fe_collection.h>
20#include <deal.II/hp/mapping_collection.h>
21#include <deal.II/hp/q_collection.h>
22
23#include <memory>
24#include <set>
25
26namespace ryujin
27{
53 enum Boundary : dealii::types::boundary_id {
63
70
80 slip = 2,
81
91
103
119
128 };
129
130
136 enum class Ansatz {
138 cg_q1,
139
141 cg_q2,
142
144 cg_q3,
145
147 dg_q1,
148
150 dg_q2,
151
153 dg_q3
154 };
155
162 enum class MeshType {
164 serial,
171 };
172} // namespace ryujin
173
174#ifndef DOXYGEN
175DECLARE_ENUM(ryujin::Boundary,
176 LIST({ryujin::Boundary::do_nothing, "do nothing"},
177 {ryujin::Boundary::periodic, "periodic"},
178 {ryujin::Boundary::slip, "slip"},
179 {ryujin::Boundary::no_slip, "no slip"},
180 {ryujin::Boundary::dirichlet, "dirichlet"},
181 {ryujin::Boundary::dynamic, "dynamic"},
183 "dirichlet momentum"}));
184
185DECLARE_ENUM(ryujin::Ansatz,
186 LIST({ryujin::Ansatz::cg_q1, "cG Q1"},
187 {ryujin::Ansatz::cg_q2, "cG Q2"},
188 {ryujin::Ansatz::cg_q3, "cG Q3"},
189 {ryujin::Ansatz::dg_q1, "dG Q1"},
190 {ryujin::Ansatz::dg_q2, "dG Q2"},
191 {ryujin::Ansatz::dg_q3, "dG Q3"}));
192
193DECLARE_ENUM(ryujin::MeshType,
194 LIST({ryujin::MeshType::serial, "serial"},
195 {ryujin::MeshType::parallel_shared, "parallel shared"},
197 "parallel distributed"},
199 "parallel fullydistributed"}));
200#endif
201
202namespace ryujin
203{
219 template <int dim>
220 class Discretization : public dealii::ParameterAcceptor
221 {
222 public:
226 Discretization(const MPIEnsemble &mpi_ensemble,
227 const std::string &subsection = "/Discretization");
228
233 void prepare(const std::string &base_name);
234
239
244
245 public:
251 {
252 switch (ansatz_) {
253 /* Continuous Ansatz: */
254 case Ansatz::cg_q1:
255 [[fallthrough]];
256 case Ansatz::cg_q2:
257 [[fallthrough]];
258 case Ansatz::cg_q3:
259 return false;
260
261 /* Discontinuous Ansatz: */
262 case Ansatz::dg_q1:
263 [[fallthrough]];
264 case Ansatz::dg_q2:
265 [[fallthrough]];
266 case Ansatz::dg_q3:
267 return true;
268 }
269
270 AssertThrow(false, dealii::ExcInternalError());
271 __builtin_trap();
272 }
273
277 unsigned int polynomial_degree() const
278 {
279 switch (ansatz_) {
280 case Ansatz::cg_q1:
281 [[fallthrough]];
282 case Ansatz::dg_q1:
283 return 1;
284 case Ansatz::cg_q2:
285 [[fallthrough]];
286 case Ansatz::dg_q2:
287 return 2;
288 case Ansatz::cg_q3:
289 [[fallthrough]];
290 case Ansatz::dg_q3:
291 return 3;
292 }
293
294 AssertThrow(false, dealii::ExcInternalError());
295 __builtin_trap();
296 }
297
298
305 {
306 using namespace dealii::parallel;
307 const auto *p_t = triangulation_.get();
308
309 if (dynamic_cast<const distributed::Triangulation<dim> *>(p_t))
310 return true;
311 else if (dynamic_cast<const fullydistributed::Triangulation<dim> *>(p_t))
312 return true;
313 else
314 return false;
315 }
316
320 ACCESSOR(refinement)
321
322
326
327
331
338
345
353
360
368
376
383
390
398
399 protected:
401
402 std::unique_ptr<dealii::Triangulation<dim>> triangulation_;
403 std::unique_ptr<const dealii::hp::MappingCollection<dim>> mapping_;
404 std::unique_ptr<const dealii::hp::FECollection<dim>> finite_element_;
405 std::unique_ptr<const dealii::hp::FECollection<dim>> finite_element_cg_;
406 std::unique_ptr<const dealii::hp::QCollection<dim>> quadrature_;
407 std::unique_ptr<const dealii::hp::QCollection<dim>> quadrature_high_order_;
408 std::unique_ptr<const dealii::hp::QCollection<dim>> nodal_quadrature_;
409 std::unique_ptr<const dealii::hp::QCollection<1>> quadrature_1d_;
410 std::unique_ptr<const dealii::hp::QCollection<dim - 1>> face_quadrature_;
411 std::unique_ptr<const dealii::hp::QCollection<dim - 1>>
413
414 private:
416
420
421 Ansatz ansatz_;
422
423 std::string geometry_;
424
425 unsigned int refinement_;
426
427 bool mesh_writeout_;
428 double mesh_distortion_;
429
431
435
436 std::set<std::unique_ptr<Geometry<dim>>> geometry_list_;
437
439
447 template <typename Discretization, int dim_, typename Number_>
448 friend class SolutionTransfer;
449 };
450} /* namespace ryujin */
const auto & finite_element_cg() const
const auto & triangulation() const
std::unique_ptr< const dealii::hp::FECollection< dim > > finite_element_
std::unique_ptr< const dealii::hp::FECollection< dim > > finite_element_cg_
bool have_distributed_triangulation() const
std::unique_ptr< const dealii::hp::MappingCollection< dim > > mapping_
const auto & face_quadrature() const
const auto & nodal_quadrature() const
const auto & ansatz() const
const auto & mapping() const
std::unique_ptr< const dealii::hp::QCollection< dim > > quadrature_
Discretization(const MPIEnsemble &mpi_ensemble, const std::string &subsection="/Discretization")
const MPIEnsemble & mpi_ensemble_
std::unique_ptr< const dealii::hp::QCollection< dim > > quadrature_high_order_
const auto & quadrature_high_order() const
void prepare(const std::string &base_name)
const auto & quadrature() const
std::unique_ptr< const dealii::hp::QCollection< dim - 1 > > face_quadrature_
unsigned int polynomial_degree() const
bool have_discontinuous_ansatz() const
const auto & finite_element() const
const auto & quadrature_1d() const
std::unique_ptr< const dealii::hp::QCollection< 1 > > quadrature_1d_
std::unique_ptr< const dealii::hp::QCollection< dim - 1 > > face_nodal_quadrature_
std::unique_ptr< dealii::Triangulation< dim > > triangulation_
std::unique_ptr< const dealii::hp::QCollection< dim > > nodal_quadrature_
const auto & face_nodal_quadrature() const
@ dirichlet_momentum
#define ACCESSOR(member)
#define ACCESSOR_READ_ONLY(member)