ryujin 2.5.0 revision 3a6c8d57210175dea14d8116e1fe878f349f8c1c
Loading...
Searching...
No Matches
hyperbolic_system.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>
9#include <ryujin/base/simd.h>
13
14#include <deal.II/base/tensor.h>
15#include <deal.II/base/types.h>
16
17#include <array>
18#include <concepts>
19#include <string>
20#include <utility>
21
22namespace ryujin
23{
30 namespace Concept
31 {
36 template <typename T, int dim, typename Number>
37 using view_type =
38 decltype(std::declval<const T &>().template view<dim, Number>());
39
40
44 template <typename Number>
46
47
55 template <typename V, int dim, typename Number>
57 requires {
58 typename V::ScalarNumber;
59 typename V::flux_contribution_type;
60 typename V::PrecomputedVectorView;
61 typename V::InitialPrecomputedVectorView;
62 {
63 V::have_high_order_flux
64 } -> std::convertible_to<bool>;
65 {
66 V::have_source_terms
67 } -> std::convertible_to<bool>;
68 } &&
69 std::same_as<typename V::state_type,
70 dealii::Tensor<1, V::problem_dimension, Number>> &&
71 std::same_as<typename V::precomputed_type,
72 std::array<Number, V::n_precomputed_values>> &&
73 std::same_as<typename V::initial_precomputed_type,
74 std::array<Number, V::n_initial_precomputed_values>> &&
75 requires(const V &view,
76 const typename V::state_type &U,
77 const typename V::flux_contribution_type &flux,
78 const typename V::PrecomputedVectorView &precomputed,
79 const typename V::InitialPrecomputedVectorView &initial,
80 const dealii::Tensor<1, dim, Number> &c_ij,
81 const dealii::types::boundary_id id,
82 typename V::state_type (&get_dirichlet_data)(),
83 const unsigned int i,
84 const unsigned int *js) {
85 {
86 view.is_admissible(U)
87 } -> std::convertible_to<bool>;
88 {
89 view.apply_boundary_conditions(id, U, c_ij, get_dirichlet_data)
90 } -> std::same_as<typename V::state_type>;
91 {
92 view.flux_contribution(precomputed, initial, i, U)
93 } -> std::same_as<typename V::flux_contribution_type>;
94 {
95 view.flux_contribution(precomputed, initial, js, U)
96 } -> std::same_as<typename V::flux_contribution_type>;
97 {
98 view.flux_divergence(flux, flux, c_ij)
99 } -> std::same_as<typename V::state_type>;
100 {
101 view.to_primitive_state(U)
102 } -> std::same_as<typename V::state_type>;
103 {
104 view.from_primitive_state(U)
105 } -> std::same_as<typename V::state_type>;
106 } &&
107 (!V::have_high_order_flux ||
108 requires(const V &view,
109 const typename V::flux_contribution_type &flux,
110 const dealii::Tensor<1, dim, Number> &c_ij) {
111 {
112 view.high_order_flux_divergence(flux, flux, c_ij)
113 } -> std::same_as<typename V::state_type>;
114 }) &&
115 (!V::have_source_terms ||
116 requires(const V &view,
117 const typename V::state_type &U,
118 const typename V::PrecomputedVectorView &precomputed,
119 const typename V::ScalarNumber tau,
120 const unsigned int i,
121 const unsigned int *js) {
122 {
123 view.nodal_source(precomputed, i, U, tau)
124 } -> std::same_as<typename V::state_type>;
125 {
126 view.nodal_source(precomputed, js, U, tau)
127 } -> std::same_as<typename V::state_type>;
128 });
129
130
137 template <typename T, int dim, typename Number>
139 requires(const T &system,
140 const Interface::OfflineData<dim, Number> &offline_data,
141 StateVector<Number> &state_vector) {
142 system.fill_precomputed_values(offline_data, state_vector);
143 };
144
145
159 template <typename T, int dim, typename Number>
161 std::derived_from<T, Interface::HyperbolicSystem> &&
162 std::constructible_from<T, const std::string &> &&
165 } // namespace Concept
166} // namespace ryujin
auto Number >()) view_type
typename get_value_type< Number >::type scalar_type