ryujin 2.1.1 revision ee5cbcbf2346c1299c942d0e1f13b46449973c18
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/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
130
139 };
140
141
147 enum class Ansatz {
149 cg_q1,
150
152 cg_q2,
153
155 cg_q3,
156
158 dg_q1,
159
161 dg_q2,
162
164 dg_q3
165 };
166
183} // namespace ryujin
184
185#ifndef DOXYGEN
186DECLARE_ENUM(ryujin::Boundary,
187 LIST({ryujin::Boundary::do_nothing, "do nothing"},
188 {ryujin::Boundary::periodic, "periodic"},
189 {ryujin::Boundary::slip, "slip"},
190 {ryujin::Boundary::no_slip, "no slip"},
191 {ryujin::Boundary::dirichlet, "dirichlet"},
192 {ryujin::Boundary::dynamic, "dynamic"},
193 {ryujin::Boundary::dirichlet_momentum, "dirichlet momentum"},
195 "dirichlet velocity"}));
196
197DECLARE_ENUM(ryujin::Ansatz,
198 LIST({ryujin::Ansatz::cg_q1, "cG Q1"},
199 {ryujin::Ansatz::cg_q2, "cG Q2"},
200 {ryujin::Ansatz::cg_q3, "cG Q3"},
201 {ryujin::Ansatz::dg_q1, "dG Q1"},
202 {ryujin::Ansatz::dg_q2, "dG Q2"},
203 {ryujin::Ansatz::dg_q3, "dG Q3"}));
204
205DECLARE_ENUM(ryujin::MeshType,
206 LIST({ryujin::MeshType::serial, "serial"},
207 {ryujin::MeshType::parallel_shared, "parallel shared"},
209 "parallel distributed"},
211 "parallel fullydistributed"}));
212#endif
213
214namespace ryujin
215{
231 template <int dim>
232 class Discretization final : public dealii::ParameterAcceptor
233 {
234 public:
239
246 struct Collection {
247 std::unique_ptr<const dealii::hp::MappingCollection<dim>> mapping;
248 std::unique_ptr<const dealii::hp::FECollection<dim>> finite_element_cg;
249 std::unique_ptr<const dealii::hp::FECollection<dim>> finite_element_dg;
250 std::unique_ptr<const dealii::hp::QCollection<dim>> quadrature;
251 std::unique_ptr<const dealii::hp::QCollection<dim>> quadrature_high_order;
252 std::unique_ptr<const dealii::hp::QCollection<dim>> nodal_quadrature;
253 std::unique_ptr<const dealii::hp::QCollection<1>> quadrature_1d;
254 std::unique_ptr<const dealii::hp::QCollection<1>> nodal_quadrature_1d;
255 std::unique_ptr<const dealii::hp::QCollection<dim - 1>> face_quadrature;
256 std::unique_ptr<const dealii::hp::QCollection<dim - 1>>
258 };
259
261
265
269 Discretization(const MPIEnsemble &mpi_ensemble,
270 const std::string &subsection = "/Discretization");
271
276 void prepare(const std::string &base_name);
277
279
283
288
289
293
299 {
300 switch (ansatz_) {
301 /* Continuous Ansatz: */
302 case Ansatz::cg_q1:
303 [[fallthrough]];
304 case Ansatz::cg_q2:
305 [[fallthrough]];
306 case Ansatz::cg_q3:
307 return false;
308
309 /* Discontinuous Ansatz: */
310 case Ansatz::dg_q1:
311 [[fallthrough]];
312 case Ansatz::dg_q2:
313 [[fallthrough]];
314 case Ansatz::dg_q3:
315 return true;
316 }
317
318 AssertThrow(false, dealii::ExcInternalError());
319 __builtin_trap();
320 }
321
325 unsigned int polynomial_degree() const
326 {
327 switch (ansatz_) {
328 case Ansatz::cg_q1:
329 [[fallthrough]];
330 case Ansatz::dg_q1:
331 return 1;
332 case Ansatz::cg_q2:
333 [[fallthrough]];
334 case Ansatz::dg_q2:
335 return 2;
336 case Ansatz::cg_q3:
337 [[fallthrough]];
338 case Ansatz::dg_q3:
339 return 3;
340 }
341
342 AssertThrow(false, dealii::ExcInternalError());
343 __builtin_trap();
344 }
345
349 ACCESSOR(refinement)
350
351
355
356
360
366 ACCESSOR_CONTAINER_READ_ONLY(collection_, mapping)
367
377 ACCESSOR_CONTAINER_READ_ONLY(collection_, finite_element_cg)
378
388 ACCESSOR_CONTAINER_READ_ONLY(collection_, finite_element_dg)
389
395 const dealii::hp::FECollection<dim> &finite_element() const
396 {
398 return *collection_.finite_element_dg;
399 else
400 return *collection_.finite_element_cg;
401 }
402
408 ACCESSOR_CONTAINER_READ_ONLY(collection_, quadrature)
409
410
416 ACCESSOR_CONTAINER_READ_ONLY(collection_, quadrature_high_order)
417
418
424 ACCESSOR_CONTAINER_READ_ONLY(collection_, nodal_quadrature)
425
426
431 ACCESSOR_CONTAINER_READ_ONLY(collection_, quadrature_1d)
432
433
439 ACCESSOR_CONTAINER_READ_ONLY(collection_, nodal_quadrature_1d)
440
441
446 ACCESSOR_CONTAINER_READ_ONLY(collection_, face_quadrature)
447
448
454 ACCESSOR_CONTAINER_READ_ONLY(collection_, face_nodal_quadrature)
455
456 private:
458
462
463 Ansatz ansatz_;
464 MeshType mesh_type_;
465
466 std::string geometry_;
467
468 unsigned int refinement_;
469
470 bool mesh_writeout_;
471 double mesh_distortion_;
472
474
478
479 const MPIEnsemble &mpi_ensemble_;
480
481 std::unique_ptr<dealii::Triangulation<dim>> triangulation_;
482
483 Collection collection_;
484
485 std::set<std::shared_ptr<Geometry<dim>>> geometry_list_;
486 std::shared_ptr<Geometry<dim>> selected_geometry_;
487
495 template <typename Discretization, int dim_, typename Number_>
496 friend class SolutionTransfer;
497
505 template <int dim_>
506 friend class Geometry;
507
509 };
510} /* 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 dealii::hp::QCollection< dim > > quadrature
std::unique_ptr< const dealii::hp::QCollection< dim - 1 > > face_quadrature
std::unique_ptr< const dealii::hp::QCollection< 1 > > nodal_quadrature_1d
std::unique_ptr< const dealii::hp::QCollection< dim - 1 > > face_nodal_quadrature
std::unique_ptr< const dealii::hp::QCollection< dim > > nodal_quadrature