ryujin 2.5.0 revision c64172211cf21344cb9b9b0f3a1266aa6400d392
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 <ryujin/base/compile_time_options.h>
13
14#include <deal.II/base/exceptions.h>
15#include <deal.II/base/parameter_acceptor.h>
16#include <deal.II/base/point.h>
17#include <deal.II/base/types.h>
18#include <deal.II/distributed/fully_distributed_tria.h>
19#include <deal.II/distributed/shared_tria.h>
20#include <deal.II/distributed/tria.h>
21#include <deal.II/fe/mapping_q_cache.h>
22#include <deal.II/grid/tria.h>
23#include <deal.II/hp/fe_collection.h>
24#include <deal.II/hp/mapping_collection.h>
25#include <deal.II/hp/q_collection.h>
26
27#include <functional>
28#include <memory>
29#include <string>
30#include <vector>
31
32namespace ryujin
33{
59 enum Boundary : dealii::types::boundary_id {
69
76
86 slip = 2,
87
97
109
125
136
145 };
146
147
153 enum class Ansatz {
155 cg_q1,
156
158 cg_q2,
159
161 cg_q3,
162
164 dg_q1,
165
167 dg_q2,
168
170 dg_q3
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"},
182 {ryujin::Boundary::dirichlet_momentum, "dirichlet momentum"},
184 "dirichlet velocity"}));
185
186DECLARE_ENUM(ryujin::Ansatz,
187 LIST({ryujin::Ansatz::cg_q1, "cG Q1"},
188 {ryujin::Ansatz::cg_q2, "cG Q2"},
189 {ryujin::Ansatz::cg_q3, "cG Q3"},
190 {ryujin::Ansatz::dg_q1, "dG Q1"},
191 {ryujin::Ansatz::dg_q2, "dG Q2"},
192 {ryujin::Ansatz::dg_q3, "dG Q3"}));
193#endif
194
195namespace ryujin
196{
213} // namespace ryujin
214
215#ifndef DOXYGEN
216DECLARE_ENUM(ryujin::MeshType,
217 LIST({ryujin::MeshType::serial, "serial"},
218 {ryujin::MeshType::parallel_shared, "parallel shared"},
220 "parallel distributed"},
222 "parallel fullydistributed"}));
223#endif
224
225namespace ryujin
226{
242 template <int dim>
243 class Discretization final : public dealii::ParameterAcceptor
244 {
245 public:
250
257 struct Collection {
258 std::unique_ptr<const dealii::hp::MappingCollection<dim>> mapping;
259 std::unique_ptr<const dealii::hp::FECollection<dim>> finite_element_cg;
260 std::unique_ptr<const dealii::hp::FECollection<dim>> finite_element_dg;
261 std::unique_ptr<const dealii::hp::QCollection<dim>> quadrature;
262 std::unique_ptr<const dealii::hp::QCollection<dim>> quadrature_high_order;
263 std::unique_ptr<const dealii::hp::QCollection<dim>> nodal_quadrature;
264 std::unique_ptr<const dealii::hp::QCollection<1>> quadrature_1d;
265 std::unique_ptr<const dealii::hp::QCollection<1>> nodal_quadrature_1d;
266 std::unique_ptr<const std::vector<dealii::hp::QCollection<dim - 1>>>
268 std::unique_ptr<const std::vector<dealii::hp::QCollection<dim - 1>>>
270 };
271
276 using Transformation = std::function<dealii::Point<dim>(
277 const typename dealii::Triangulation<dim>::cell_iterator &,
278 const dealii::Point<dim> &)>;
279
281
285
289 Discretization(const MPIEnsemble &mpi_ensemble,
290 const std::string &subsection = "/Discretization");
291
296 void prepare(const std::string &base_name);
297
306
308
312
316 ACCESSOR_READ_ONLY(selected_geometry)
317
318
321 ACCESSOR_READ_ONLY(ansatz)
322
323
328 {
329 switch (ansatz_) {
330 /* Continuous Ansatz: */
331 case Ansatz::cg_q1:
332 [[fallthrough]];
333 case Ansatz::cg_q2:
334 [[fallthrough]];
335 case Ansatz::cg_q3:
336 return false;
337
338 /* Discontinuous Ansatz: */
339 case Ansatz::dg_q1:
340 [[fallthrough]];
341 case Ansatz::dg_q2:
342 [[fallthrough]];
343 case Ansatz::dg_q3:
344 return true;
345 }
346
347 AssertThrow(false, dealii::ExcInternalError());
348 __builtin_trap();
349 }
350
354 unsigned int polynomial_degree() const
355 {
356 switch (ansatz_) {
357 case Ansatz::cg_q1:
358 [[fallthrough]];
359 case Ansatz::dg_q1:
360 return 1;
361 case Ansatz::cg_q2:
362 [[fallthrough]];
363 case Ansatz::dg_q2:
364 return 2;
365 case Ansatz::cg_q3:
366 [[fallthrough]];
367 case Ansatz::dg_q3:
368 return 3;
369 }
370
371 AssertThrow(false, dealii::ExcInternalError());
372 __builtin_trap();
373 }
374
378 ACCESSOR(refinement)
379
380
383 bool has_triangulation() const
384 {
385 return triangulation_ != nullptr;
386 }
387
391 ACCESSOR(triangulation)
392
393
396 ACCESSOR_READ_ONLY(triangulation)
397
398
410 ACCESSOR(transformation)
411
412
415 ACCESSOR_READ_ONLY(transformation)
416
417
422 ACCESSOR_CONTAINER_READ_ONLY(collection_, mapping)
423
424
433 ACCESSOR_CONTAINER_READ_ONLY(collection_, finite_element_cg)
434
435
444 ACCESSOR_CONTAINER_READ_ONLY(collection_, finite_element_dg)
445
446
451 const dealii::hp::FECollection<dim> &finite_element() const
452 {
454 return *collection_.finite_element_dg;
455 else
456 return *collection_.finite_element_cg;
457 }
458
464 ACCESSOR_CONTAINER_READ_ONLY(collection_, quadrature)
465
466
472 ACCESSOR_CONTAINER_READ_ONLY(collection_, quadrature_high_order)
473
474
480 ACCESSOR_CONTAINER_READ_ONLY(collection_, nodal_quadrature)
481
482
487 ACCESSOR_CONTAINER_READ_ONLY(collection_, quadrature_1d)
488
489
495 ACCESSOR_CONTAINER_READ_ONLY(collection_, nodal_quadrature_1d)
496
497
505 ACCESSOR_CONTAINER_READ_ONLY(collection_, face_quadrature)
506
507
514 ACCESSOR_CONTAINER_READ_ONLY(collection_, face_nodal_quadrature)
515
516 //@}
517
518 private:
523
524 Ansatz ansatz_;
525 MeshType mesh_type_;
526
527 std::string geometry_;
528
529 unsigned int refinement_;
530
531 bool mesh_writeout_;
532 double mesh_distortion_;
533
535
539
540 const MPIEnsemble &mpi_ensemble_;
541
542 std::vector<std::unique_ptr<Geometry<dim>>> geometry_list_;
543 Geometry<dim> *selected_geometry_ = nullptr;
544
545 std::unique_ptr<dealii::Triangulation<dim>> triangulation_;
546
547 Collection collection_;
548 typename Geometry<dim>::HP_Collection collection_type_ =
550
551 std::shared_ptr<dealii::MappingQCache<dim>> mapping_cache_;
552 Transformation transformation_;
553
555
559 void create_mapping_cache();
560 };
561} // namespace ryujin
const dealii::hp::FECollection< dim > & finite_element() const
std::function< dealii::Point< dim >(const typename dealii::Triangulation< dim >::cell_iterator &, const dealii::Point< dim > &)> Transformation
Discretization(const MPIEnsemble &mpi_ensemble, const std::string &subsection="/Discretization")
void prepare(const std::string &base_name)
unsigned int polynomial_degree() const
bool have_discontinuous_ansatz() const
bool has_triangulation() 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