ryujin 2.5.0 revision c64172211cf21344cb9b9b0f3a1266aa6400d392
Loading...
Searching...
No Matches
initial_state_function.h
Go to the documentation of this file.
1//
2// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
3// Copyright (C) 2023 - 2026 by the ryujin authors
4//
5
6#pragma once
7
8#include <ryujin/base/compile_time_options.h>
10
11#include <deal.II/base/function_parser.h>
12
13namespace ryujin
14{
15 namespace EulerInitialStates
16 {
22 template <typename Description, int dim, typename Number>
23 class Function : public InitialState<Description, dim, Number>
24 {
25 public:
26 using HyperbolicSystem = typename Description::HyperbolicSystem;
27 using View = typename HyperbolicSystem::template View<dim, Number>;
28 using state_type = typename View::state_type;
29
30 Function(const HyperbolicSystem &hyperbolic_system,
31 const std::string subsection)
32 : InitialState<Description, dim, Number>("function", subsection)
33 , hyperbolic_system_(hyperbolic_system)
34 {
35 density_expression_ = "1.4";
36 this->add_parameter("density expression",
37 density_expression_,
38 "A function expression describing the density");
39
40 velocity_x_expression_ = "3.0";
41 this->add_parameter(
42 "velocity x expression",
43 velocity_x_expression_,
44 "A function expression describing the x-component of the velocity");
45
46 if constexpr (dim > 1) {
47 velocity_y_expression_ = "0.0";
48 this->add_parameter("velocity y expression",
49 velocity_y_expression_,
50 "A function expression describing the "
51 "y-component of the velocity");
52 }
53
54 if constexpr (dim > 2) {
55 velocity_z_expression_ = "0.0";
56 this->add_parameter("velocity z expression",
57 velocity_z_expression_,
58 "A function expression describing the "
59 "z-component of the velocity");
60 }
61
62 if constexpr (View::have_energy_equation) {
63 pressure_expression_ = "1.0";
64 this->add_parameter("pressure expression",
65 pressure_expression_,
66 "A function expression describing the pressure");
67 }
68
69 /* Set up all muparser objects */
70
71 const auto set_up_muparser = [this] {
72 using FP = dealii::FunctionParser<dim>;
73 /*
74 * This variant of the constructor initializes the function
75 * parser with support for a time-dependent description involving
76 * a variable »t«:
77 */
78 density_function_ = std::make_unique<FP>(density_expression_);
79 velocity_x_function_ = std::make_unique<FP>(velocity_x_expression_);
80 if constexpr (dim > 1)
81 velocity_y_function_ = std::make_unique<FP>(velocity_y_expression_);
82 if constexpr (dim > 2)
83 velocity_z_function_ = std::make_unique<FP>(velocity_z_expression_);
84 if constexpr (View::have_energy_equation)
85 pressure_function_ = std::make_unique<FP>(pressure_expression_);
86 };
87
88 set_up_muparser();
89 this->parse_parameters_call_back.connect(set_up_muparser);
90 }
91
92 state_type compute(const dealii::Point<dim> &point, Number t) final
93 {
94 const auto view = hyperbolic_system_.template view<dim, Number>();
95 state_type full_primitive_state;
96
97 density_function_->set_time(t);
98 full_primitive_state[0] = density_function_->value(point);
99
100 velocity_x_function_->set_time(t);
101 full_primitive_state[1] = velocity_x_function_->value(point);
102
103 if constexpr (dim > 1) {
104 velocity_y_function_->set_time(t);
105 full_primitive_state[2] = velocity_y_function_->value(point);
106 }
107 if constexpr (dim > 2) {
108 velocity_z_function_->set_time(t);
109 full_primitive_state[3] = velocity_z_function_->value(point);
110 }
111
112 if constexpr (View::have_energy_equation) {
113 pressure_function_->set_time(t);
114 full_primitive_state[1 + dim] = pressure_function_->value(point);
115 }
116
117 return view.from_initial_state(full_primitive_state);
118 }
119
120 private:
121 const HyperbolicSystem &hyperbolic_system_;
122
123 std::string density_expression_;
124 std::string velocity_x_expression_;
125 std::string velocity_y_expression_;
126 std::string velocity_z_expression_;
127 std::string pressure_expression_;
128
129 std::unique_ptr<dealii::FunctionParser<dim>> density_function_;
130 std::unique_ptr<dealii::FunctionParser<dim>> velocity_x_function_;
131 std::unique_ptr<dealii::FunctionParser<dim>> velocity_y_function_;
132 std::unique_ptr<dealii::FunctionParser<dim>> velocity_z_function_;
133 std::unique_ptr<dealii::FunctionParser<dim>> pressure_function_;
134 };
135 } // namespace EulerInitialStates
136} // namespace ryujin
typename HyperbolicSystem::template View< dim, Number > View
typename Description::HyperbolicSystem HyperbolicSystem
state_type compute(const dealii::Point< dim > &point, Number t) final
Function(const HyperbolicSystem &hyperbolic_system, const std::string subsection)