ryujin 2.1.1 revision 71cdc42292164f8095c0bd62c4ea75ebcfac58fa
Loading...
Searching...
No Matches
discretization.h
Go to the documentation of this file.
1//
2// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
3// Copyright (C) 2020 - 2026 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/fe/mapping_q_cache.h>
20#include <deal.II/hp/fe_collection.h>
21#include <deal.II/hp/mapping_collection.h>
22#include <deal.II/hp/q_collection.h>
23
24#include <memory>
25#include <set>
26#include <vector>
27
28namespace ryujin
29{
55 enum Boundary : dealii::types::boundary_id {
65
72
82 slip = 2,
83
93
105
121
132
141 };
142
143
149 enum class Ansatz {
151 cg_q1,
152
154 cg_q2,
155
157 cg_q3,
158
160 dg_q1,
161
163 dg_q2,
164
166 dg_q3
167 };
168
185} // namespace ryujin
186
187#ifndef DOXYGEN
188DECLARE_ENUM(ryujin::Boundary,
189 LIST({ryujin::Boundary::do_nothing, "do nothing"},
190 {ryujin::Boundary::periodic, "periodic"},
191 {ryujin::Boundary::slip, "slip"},
192 {ryujin::Boundary::no_slip, "no slip"},
193 {ryujin::Boundary::dirichlet, "dirichlet"},
194 {ryujin::Boundary::dynamic, "dynamic"},
195 {ryujin::Boundary::dirichlet_momentum, "dirichlet momentum"},
197 "dirichlet velocity"}));
198
199DECLARE_ENUM(ryujin::Ansatz,
200 LIST({ryujin::Ansatz::cg_q1, "cG Q1"},
201 {ryujin::Ansatz::cg_q2, "cG Q2"},
202 {ryujin::Ansatz::cg_q3, "cG Q3"},
203 {ryujin::Ansatz::dg_q1, "dG Q1"},
204 {ryujin::Ansatz::dg_q2, "dG Q2"},
205 {ryujin::Ansatz::dg_q3, "dG Q3"}));
206
207DECLARE_ENUM(ryujin::MeshType,
208 LIST({ryujin::MeshType::serial, "serial"},
209 {ryujin::MeshType::parallel_shared, "parallel shared"},
211 "parallel distributed"},
213 "parallel fullydistributed"}));
214#endif
215
216namespace ryujin
217{
233 template <int dim>
234 class Discretization final : public dealii::ParameterAcceptor
235 {
236 public:
241
248 struct Collection {
249 std::unique_ptr<const dealii::hp::MappingCollection<dim>> mapping;
250 std::unique_ptr<const dealii::hp::FECollection<dim>> finite_element_cg;
251 std::unique_ptr<const dealii::hp::FECollection<dim>> finite_element_dg;
252 std::unique_ptr<const dealii::hp::QCollection<dim>> quadrature;
253 std::unique_ptr<const dealii::hp::QCollection<dim>> quadrature_high_order;
254 std::unique_ptr<const dealii::hp::QCollection<dim>> nodal_quadrature;
255 std::unique_ptr<const dealii::hp::QCollection<1>> quadrature_1d;
256 std::unique_ptr<const dealii::hp::QCollection<1>> nodal_quadrature_1d;
257 std::unique_ptr<const std::vector<dealii::hp::QCollection<dim - 1>>>
259 std::unique_ptr<const std::vector<dealii::hp::QCollection<dim - 1>>>
261 };
262
264
268
272 Discretization(const MPIEnsemble &mpi_ensemble,
273 const std::string &subsection = "/Discretization");
274
279 void prepare(const std::string &base_name);
280
287 void update_mapping();
288
290
294
299
300
304
310 {
311 switch (ansatz_) {
312 /* Continuous Ansatz: */
313 case Ansatz::cg_q1:
314 [[fallthrough]];
315 case Ansatz::cg_q2:
316 [[fallthrough]];
317 case Ansatz::cg_q3:
318 return false;
319
320 /* Discontinuous Ansatz: */
321 case Ansatz::dg_q1:
322 [[fallthrough]];
323 case Ansatz::dg_q2:
324 [[fallthrough]];
325 case Ansatz::dg_q3:
326 return true;
327 }
328
329 AssertThrow(false, dealii::ExcInternalError());
330 __builtin_trap();
331 }
332
336 unsigned int polynomial_degree() const
337 {
338 switch (ansatz_) {
339 case Ansatz::cg_q1:
340 [[fallthrough]];
341 case Ansatz::dg_q1:
342 return 1;
343 case Ansatz::cg_q2:
344 [[fallthrough]];
345 case Ansatz::dg_q2:
346 return 2;
347 case Ansatz::cg_q3:
348 [[fallthrough]];
349 case Ansatz::dg_q3:
350 return 3;
351 }
352
353 AssertThrow(false, dealii::ExcInternalError());
354 __builtin_trap();
355 }
356
360 ACCESSOR(refinement)
361
362
366
367
371
377 ACCESSOR_CONTAINER_READ_ONLY(collection_, mapping)
378
388 ACCESSOR_CONTAINER_READ_ONLY(collection_, finite_element_cg)
389
399 ACCESSOR_CONTAINER_READ_ONLY(collection_, finite_element_dg)
400
406 const dealii::hp::FECollection<dim> &finite_element() const
407 {
409 return *collection_.finite_element_dg;
410 else
411 return *collection_.finite_element_cg;
412 }
413
419 ACCESSOR_CONTAINER_READ_ONLY(collection_, quadrature)
420
421
427 ACCESSOR_CONTAINER_READ_ONLY(collection_, quadrature_high_order)
428
429
435 ACCESSOR_CONTAINER_READ_ONLY(collection_, nodal_quadrature)
436
437
442 ACCESSOR_CONTAINER_READ_ONLY(collection_, quadrature_1d)
443
444
450 ACCESSOR_CONTAINER_READ_ONLY(collection_, nodal_quadrature_1d)
451
452
459 ACCESSOR_CONTAINER_READ_ONLY(collection_, face_quadrature)
460
461
468 ACCESSOR_CONTAINER_READ_ONLY(collection_, face_nodal_quadrature)
469
470 private:
472
476
477 Ansatz ansatz_;
478 MeshType mesh_type_;
479
480 std::string geometry_;
481
482 unsigned int refinement_;
483
484 bool mesh_writeout_;
485 double mesh_distortion_;
486
488
492
493 const MPIEnsemble &mpi_ensemble_;
494
495 std::unique_ptr<dealii::Triangulation<dim>> triangulation_;
496
497 Collection collection_;
498 std::shared_ptr<dealii::MappingQCache<dim>> mapping_cache_;
499
500 std::set<std::shared_ptr<Geometry<dim>>> geometry_list_;
501 std::shared_ptr<Geometry<dim>> selected_geometry_;
502
510 template <typename Discretization, int dim_, typename Number_>
511 friend class SolutionTransfer;
512
520 template <int dim_>
521 friend class Geometry;
522
524 };
525} /* namespace ryujin */
const auto & triangulation() const
const auto & selected_geometry() const
const dealii::hp::FECollection< dim > & finite_element() const
const auto & ansatz() const
void prepare(const std::string &base_name)
unsigned int polynomial_degree() const
bool have_discontinuous_ansatz() const
@ dirichlet_momentum
@ dirichlet_velocity
#define ACCESSOR(member)
#define ACCESSOR_CONTAINER_READ_ONLY(container, member)
#define ACCESSOR_READ_ONLY(member)
std::unique_ptr< const dealii::hp::QCollection< 1 > > quadrature_1d
std::unique_ptr< const dealii::hp::FECollection< dim > > finite_element_dg
std::unique_ptr< const dealii::hp::FECollection< dim > > finite_element_cg
std::unique_ptr< const dealii::hp::MappingCollection< dim > > mapping
std::unique_ptr< const dealii::hp::QCollection< dim > > quadrature_high_order
std::unique_ptr< const std::vector< dealii::hp::QCollection< dim - 1 > > > face_quadrature
std::unique_ptr< const dealii::hp::QCollection< dim > > quadrature
std::unique_ptr< const dealii::hp::QCollection< 1 > > nodal_quadrature_1d
std::unique_ptr< const std::vector< dealii::hp::QCollection< dim - 1 > > > face_nodal_quadrature
std::unique_ptr< const dealii::hp::QCollection< dim > > nodal_quadrature