ryujin 2.5.0 revision c64172211cf21344cb9b9b0f3a1266aa6400d392
Loading...
Searching...
No Matches
initial_state_radial_contrast.h
Go to the documentation of this file.
1//
2// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
3// Copyright (C) 2022 - 2026 by the ryujin authors
4//
5
6#pragma once
7
8#include <ryujin/base/compile_time_options.h>
10
11namespace ryujin
12{
13 namespace EulerInitialStates
14 {
29 template <typename Description, int dim, typename Number>
30 class RadialContrast : public InitialState<Description, dim, Number>
31 {
32 public:
33 using HyperbolicSystem = typename Description::HyperbolicSystem;
34 using View = typename HyperbolicSystem::template View<dim, Number>;
35 using state_type = typename View::state_type;
37 typename HyperbolicSystem::template View<1, Number>::state_type;
38
39 RadialContrast(const HyperbolicSystem &hyperbolic_system,
40 const std::string &subsection)
41 : InitialState<Description, dim, Number>("radial contrast",
42 subsection)
43 , hyperbolic_system_(hyperbolic_system)
44 {
45 primitive_inner_[0] = 1.4;
46 primitive_inner_[1] = 0.0;
47 if constexpr (View::have_energy_equation)
48 primitive_inner_[2] = 1.;
49 this->add_parameter("primitive state inner",
50 primitive_inner_,
51 "1d primitive state [rho, u, p] on the inner disk "
52 "(or [rho, u] for the barotropic Euler module)");
53
54 primitive_outer_[0] = 1.4;
55 primitive_outer_[1] = 0.0;
56 if constexpr (View::have_energy_equation)
57 primitive_outer_[2] = 1.;
58 this->add_parameter(
59 "primitive state outer",
60 primitive_outer_,
61 "1d primitive state [rho, u, p] on the outer annulus (or [rho, u] "
62 "for the barotropic Euler module)");
63
64 radius_ = 0.5;
65 this->add_parameter("radius", radius_, "Radius of radial area");
66
67 const auto convert_states = [&]() {
68 const auto view = hyperbolic_system_.template view<dim, Number>();
69 state_inner_ = view.from_initial_state(primitive_inner_);
70 state_outer_ = view.from_initial_state(primitive_outer_);
71 };
72 this->parse_parameters_call_back.connect(convert_states);
73 convert_states();
74 }
75
76 auto compute(const dealii::Point<dim> &point, Number /*t*/)
77 -> state_type final
78 {
79 return (point.norm() > radius_ ? state_outer_ : state_inner_);
80 }
81
82 private:
83 const HyperbolicSystem &hyperbolic_system_;
84
85 double radius_;
86
87 state_type_1d primitive_inner_;
88 state_type_1d primitive_outer_;
89
90 state_type state_inner_;
91 state_type state_outer_;
92 };
93 } // namespace EulerInitialStates
94} // namespace ryujin
RadialContrast(const HyperbolicSystem &hyperbolic_system, const std::string &subsection)
typename Description::HyperbolicSystem HyperbolicSystem
auto compute(const dealii::Point< dim > &point, Number) -> state_type final
typename HyperbolicSystem::template View< 1, Number >::state_type state_type_1d
typename HyperbolicSystem::template View< dim, Number > View