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