ryujin 2.1.1 revision 336b16a72e829721302c626ec7071b92032b8248
equation_of_state.h
Go to the documentation of this file.
1//
2// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
3// Copyright (C) 2023 by the ryujin authors
4//
5
6#pragma once
7
8#include <compile_time_options.h>
9
10#include "convenience_macros.h"
11
12#include <deal.II/base/array_view.h>
13#include <deal.II/base/exceptions.h>
14#include <deal.II/base/parameter_acceptor.h>
15#include <deal.II/base/tensor.h>
16
17#include <string>
18
19namespace ryujin
20{
21 namespace EquationOfStateLibrary
22 {
29 class EquationOfState : public dealii::ParameterAcceptor
30 {
31 public:
37 EquationOfState(const std::string &name, const std::string &subsection)
38 : ParameterAcceptor(subsection + "/" + name)
39 , name_(name)
40 {
41 /*
42 * If necessary derived EOS can override the interpolation
43 * co-volume b that is used in the approximate Riemann solver.
44 */
46
47 /*
48 * If necessary derived EOS can override this boolean to indicate
49 * that the dealii::ArrayView<double> variants of the pressure()
50 * function (etc.) should be preferred.
51 */
53 }
54
59 virtual double pressure(double rho, double e) const = 0;
60
71 virtual void pressure(const dealii::ArrayView<double> &p,
72 const dealii::ArrayView<double> &rho,
73 const dealii::ArrayView<double> &e) const
74 {
75 Assert(p.size() == rho.size() && rho.size() == e.size(),
76 dealii::ExcMessage("vectors have different size"));
77
78 std::transform(std::begin(rho),
79 std::end(rho),
80 std::begin(e),
81 std::begin(p),
82 [&](double rho, double e) { return pressure(rho, e); });
83 }
84
89 virtual double specific_internal_energy(double rho, double p) const = 0;
90
101 virtual void
102 specific_internal_energy(const dealii::ArrayView<double> &e,
103 const dealii::ArrayView<double> &rho,
104 const dealii::ArrayView<double> &p) const
105 {
106 Assert(p.size() == rho.size() && rho.size() == e.size(),
107 dealii::ExcMessage("vectors have different size"));
108
109 std::transform(std::begin(rho),
110 std::end(rho),
111 std::begin(p),
112 std::begin(e),
113 [&](double rho, double p) {
114 return specific_internal_energy(rho, p);
115 });
116 }
117
122 virtual double temperature(double rho, double e) const = 0;
123
134 virtual void temperature(const dealii::ArrayView<double> &T,
135 const dealii::ArrayView<double> &rho,
136 const dealii::ArrayView<double> &e) const
137 {
138 Assert(T.size() == rho.size() && rho.size() == e.size(),
139 dealii::ExcMessage("vectors have different size"));
140
141 std::transform(
142 std::begin(rho),
143 std::end(rho),
144 std::begin(e),
145 std::begin(T),
146 [&](double rho, double e) { return temperature(rho, e); });
147 }
148
153 virtual double speed_of_sound(double rho, double e) const = 0;
154
165 virtual void speed_of_sound(const dealii::ArrayView<double> &c,
166 const dealii::ArrayView<double> &rho,
167 const dealii::ArrayView<double> &e) const
168 {
169 Assert(c.size() == rho.size() && rho.size() == e.size(),
170 dealii::ExcMessage("vectors have different size"));
171
172 std::transform(
173 std::begin(rho),
174 std::end(rho),
175 std::begin(e),
176 std::begin(c),
177 [&](double rho, double e) { return speed_of_sound(rho, e); });
178 }
179
183 ACCESSOR_READ_ONLY(interpolation_b)
184
185
196 ACCESSOR_READ_ONLY(prefer_vector_interface)
197
198
202
203 protected:
206
207 private:
208 const std::string name_;
209 };
210
211 } // namespace EquationOfStateLibrary
212} /* namespace ryujin */
virtual double specific_internal_energy(double rho, double p) const =0
virtual void pressure(const dealii::ArrayView< double > &p, const dealii::ArrayView< double > &rho, const dealii::ArrayView< double > &e) const
virtual double pressure(double rho, double e) const =0
virtual void specific_internal_energy(const dealii::ArrayView< double > &e, const dealii::ArrayView< double > &rho, const dealii::ArrayView< double > &p) const
virtual void speed_of_sound(const dealii::ArrayView< double > &c, const dealii::ArrayView< double > &rho, const dealii::ArrayView< double > &e) const
virtual double speed_of_sound(double rho, double e) const =0
virtual double temperature(double rho, double e) const =0
EquationOfState(const std::string &name, const std::string &subsection)
virtual void temperature(const dealii::ArrayView< double > &T, const dealii::ArrayView< double > &rho, const dealii::ArrayView< double > &e) const
#define ACCESSOR_READ_ONLY(member)