ryujin 2.5.0 revision 3a6c8d57210175dea14d8116e1fe878f349f8c1c
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) 2026 by the ryujin authors
4//
5
6#pragma once
7
8#include <ryujin/base/compile_time_options.h>
12
13#include <deal.II/base/exceptions.h>
14#include <deal.II/base/parameter_acceptor.h>
15#include <deal.II/base/point.h>
16#include <deal.II/base/types.h>
17#include <deal.II/fe/mapping_q_cache.h>
18#include <deal.II/grid/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 <functional>
24#include <memory>
25#include <string>
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} // namespace ryujin
169
170#ifndef DOXYGEN
171DECLARE_ENUM(ryujin::Boundary,
172 LIST({ryujin::Boundary::do_nothing, "do nothing"},
173 {ryujin::Boundary::periodic, "periodic"},
174 {ryujin::Boundary::slip, "slip"},
175 {ryujin::Boundary::no_slip, "no slip"},
176 {ryujin::Boundary::dirichlet, "dirichlet"},
177 {ryujin::Boundary::dynamic, "dynamic"},
178 {ryujin::Boundary::dirichlet_momentum, "dirichlet momentum"},
180 "dirichlet velocity"}));
181
182DECLARE_ENUM(ryujin::Ansatz,
183 LIST({ryujin::Ansatz::cg_q1, "cG Q1"},
184 {ryujin::Ansatz::cg_q2, "cG Q2"},
185 {ryujin::Ansatz::cg_q3, "cG Q3"},
186 {ryujin::Ansatz::dg_q1, "dG Q1"},
187 {ryujin::Ansatz::dg_q2, "dG Q2"},
188 {ryujin::Ansatz::dg_q3, "dG Q3"}));
189#endif
190
191namespace ryujin
192{
193 namespace Interface
194 {
209 template <int dim>
210 class Discretization : public dealii::ParameterAcceptor
211 {
212 public:
217
224 struct Collection {
225 std::unique_ptr<const dealii::hp::MappingCollection<dim>> mapping;
226 std::unique_ptr<const dealii::hp::FECollection<dim>> finite_element_cg;
227 std::unique_ptr<const dealii::hp::FECollection<dim>> finite_element_dg;
228 std::unique_ptr<const dealii::hp::QCollection<dim>> quadrature;
229 std::unique_ptr<const dealii::hp::QCollection<dim>>
231 std::unique_ptr<const dealii::hp::QCollection<dim>> nodal_quadrature;
232 std::unique_ptr<const dealii::hp::QCollection<1>> quadrature_1d;
233 std::unique_ptr<const dealii::hp::QCollection<1>> nodal_quadrature_1d;
234 std::unique_ptr<const std::vector<dealii::hp::QCollection<dim - 1>>>
236 std::unique_ptr<const std::vector<dealii::hp::QCollection<dim - 1>>>
238 };
239
244 using Transformation = std::function<dealii::Point<dim>(
245 const typename dealii::Triangulation<dim>::cell_iterator &,
246 const dealii::Point<dim> &)>;
247
249
253
258 virtual void prepare(const std::string &base_name) = 0;
259
264 virtual void update_mapping() = 0;
265
267
271
275 ACCESSOR_READ_ONLY(selected_geometry)
276
277
280 ACCESSOR_READ_ONLY(ansatz)
281
282
287 {
288 switch (ansatz_) {
289 /* Continuous Ansatz: */
290 case Ansatz::cg_q1:
291 [[fallthrough]];
292 case Ansatz::cg_q2:
293 [[fallthrough]];
294 case Ansatz::cg_q3:
295 return false;
296
297 /* Discontinuous Ansatz: */
298 case Ansatz::dg_q1:
299 [[fallthrough]];
300 case Ansatz::dg_q2:
301 [[fallthrough]];
302 case Ansatz::dg_q3:
303 return true;
304 }
305
306 AssertThrow(false, dealii::ExcInternalError());
307 __builtin_trap();
308 }
309
313 unsigned int polynomial_degree() const
314 {
315 switch (ansatz_) {
316 case Ansatz::cg_q1:
317 [[fallthrough]];
318 case Ansatz::dg_q1:
319 return 1;
320 case Ansatz::cg_q2:
321 [[fallthrough]];
322 case Ansatz::dg_q2:
323 return 2;
324 case Ansatz::cg_q3:
325 [[fallthrough]];
326 case Ansatz::dg_q3:
327 return 3;
328 }
329
330 AssertThrow(false, dealii::ExcInternalError());
331 __builtin_trap();
332 }
333
337 ACCESSOR(refinement)
338
339
342 ACCESSOR(triangulation)
343
344
347 ACCESSOR_READ_ONLY(triangulation)
348
349
361 ACCESSOR(transformation)
362
363
366 ACCESSOR_READ_ONLY(transformation)
367
368
374
375
384 ACCESSOR_CONTAINER_READ_ONLY(collection_, finite_element_cg)
385
386
395 ACCESSOR_CONTAINER_READ_ONLY(collection_, finite_element_dg)
396
397
402 const dealii::hp::FECollection<dim> &finite_element() const
403 {
406 else
408 }
409
416
417
423 ACCESSOR_CONTAINER_READ_ONLY(collection_, quadrature_high_order)
424
425
432
433
439
440
446 ACCESSOR_CONTAINER_READ_ONLY(collection_, nodal_quadrature_1d)
447
448
457
458
465 ACCESSOR_CONTAINER_READ_ONLY(collection_, face_nodal_quadrature)
466
467 //@}
468
469 protected:
473 explicit Discretization(const std::string &subsection)
474 : ParameterAcceptor(subsection)
476 , refinement_(0)
477 {
478 }
479
484
486
487 unsigned int refinement_;
488
489 std::unique_ptr<dealii::Triangulation<dim>> triangulation_;
490
492 std::shared_ptr<dealii::MappingQCache<dim>> mapping_cache_;
494
496
498 };
499 } // namespace Interface
500} // namespace ryujin
std::unique_ptr< dealii::Triangulation< dim > > triangulation_
unsigned int polynomial_degree() const
Discretization(const std::string &subsection)
std::function< dealii::Point< dim >(const typename dealii::Triangulation< dim >::cell_iterator &, const dealii::Point< dim > &)> Transformation
virtual void prepare(const std::string &base_name)=0
std::shared_ptr< dealii::MappingQCache< dim > > mapping_cache_
const dealii::hp::FECollection< dim > & finite_element() 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::FECollection< dim > > finite_element_cg
std::unique_ptr< const dealii::hp::FECollection< dim > > finite_element_dg
std::unique_ptr< const dealii::hp::QCollection< dim > > quadrature_high_order
std::unique_ptr< const dealii::hp::QCollection< dim > > nodal_quadrature
std::unique_ptr< const std::vector< dealii::hp::QCollection< dim - 1 > > > face_nodal_quadrature
std::unique_ptr< const std::vector< dealii::hp::QCollection< dim - 1 > > > face_quadrature
std::unique_ptr< const dealii::hp::QCollection< 1 > > quadrature_1d
std::unique_ptr< const dealii::hp::QCollection< 1 > > nodal_quadrature_1d
std::unique_ptr< const dealii::hp::QCollection< dim > > quadrature
std::unique_ptr< const dealii::hp::MappingCollection< dim > > mapping