Line data Source code
1 0 : // Distributed under the MIT License.
2 : // See LICENSE.txt for details.
3 :
4 : #pragma once
5 :
6 : #include <array>
7 : #include <cstdint>
8 : #include <hdf5.h>
9 : #include <string>
10 : #include <vector>
11 :
12 : #include "IO/H5/Object.hpp"
13 : #include "IO/H5/OpenGroup.hpp"
14 :
15 : /// \cond
16 : class DataVector;
17 : /// \endcond
18 :
19 : namespace h5 {
20 : /*!
21 : * \ingroup HDF5Group
22 : * \brief An equation of state table subfile written inside an H5 file.
23 : *
24 : * ### Data Layout
25 : *
26 : * To be consistent with the CompOSE ASCII table format, the data is stored in a
27 : * last independent variable varies fastest. For example, if you had independent
28 : * variables \f$\rho\f$, \f$T\f$, and \f$Y_e\f$, then \f$Y_e\f$ varies fastest
29 : * while \f$\rho\f$ varies slowest.
30 : */
31 1 : class EosTable : public h5::Object {
32 : public:
33 0 : static std::string extension() { return ".eos"; }
34 :
35 : /// Constructor used when writing a new equation of state.
36 1 : EosTable(bool subfile_exists, detail::OpenGroup&& group, hid_t location,
37 : const std::string& name,
38 : std::vector<std::string> independent_variable_names,
39 : std::vector<std::array<double, 2>> independent_variable_bounds,
40 : std::vector<size_t> independent_variable_number_of_points,
41 : std::vector<bool> independent_variable_uses_log_spacing,
42 : bool beta_equilibrium, uint32_t version = 1);
43 :
44 : /// Constructor used when reading in an equation of state.
45 1 : EosTable(bool subfile_exists, detail::OpenGroup&& group, hid_t location,
46 : const std::string& name);
47 :
48 0 : EosTable(const EosTable& /*rhs*/) = delete;
49 0 : EosTable& operator=(const EosTable& /*rhs*/) = delete;
50 0 : EosTable(EosTable&& /*rhs*/) = delete; // NOLINT
51 0 : EosTable& operator=(EosTable&& /*rhs*/) = delete; // NOLINT
52 :
53 0 : ~EosTable() override = default;
54 :
55 : /*!
56 : * \returns the header of the EosTable file
57 : */
58 1 : const std::string& get_header() const { return header_; }
59 :
60 : /*!
61 : * \returns the user-specified version number of the EosTable file
62 : *
63 : * \note h5::Version returns a uint32_t, so we return one here too for the
64 : * version
65 : */
66 1 : uint32_t get_version() const { return version_; }
67 :
68 1 : const std::string& subfile_path() const override { return path_; }
69 :
70 : /*!
71 : * \brief Write a thermodynamic quantity to disk.
72 : */
73 1 : void write_quantity(std::string name, const DataVector& data);
74 :
75 : /*!
76 : * \brief Read a thermodynamic quantity to disk.
77 : */
78 1 : DataVector read_quantity(const std::string& name) const;
79 :
80 : /// The available thermodynamic quantities.
81 1 : const std::vector<std::string> available_quantities() const {
82 : return available_quantities_;
83 : }
84 :
85 : /// Number of independent variables.
86 1 : size_t number_of_independent_variables() const {
87 : return independent_variable_names_.size();
88 : }
89 :
90 : /// Names of the independent variables.
91 1 : const std::vector<std::string>& independent_variable_names() const {
92 : return independent_variable_names_;
93 : }
94 :
95 : /// Lower and upper bounds of the independent variables.
96 1 : const std::vector<std::array<double, 2>>& independent_variable_bounds()
97 : const {
98 : return independent_variable_bounds_;
99 : }
100 :
101 : /// The number of points for each of the independent variables.
102 1 : const std::vector<size_t>& independent_variable_number_of_points() const {
103 : return independent_variable_number_of_points_;
104 : }
105 :
106 : /// Whether each independent variable is in log spacing. Linear spacing is
107 : /// used if `false`.
108 1 : const std::vector<bool>& independent_variable_uses_log_spacing() const {
109 : return independent_variable_uses_log_spacing_;
110 : }
111 :
112 : /// `true` if the EOS is in beta equilibrium.
113 1 : bool beta_equilibrium() const { return beta_equilibrium_; }
114 :
115 : private:
116 0 : detail::OpenGroup group_{};
117 0 : std::string name_{};
118 0 : std::string path_{};
119 0 : uint32_t version_{};
120 0 : detail::OpenGroup eos_table_group_{};
121 0 : std::string header_{};
122 :
123 0 : std::vector<std::string> independent_variable_names_{};
124 0 : std::vector<std::array<double, 2>> independent_variable_bounds_{};
125 0 : std::vector<size_t> independent_variable_number_of_points_{};
126 0 : std::vector<bool> independent_variable_uses_log_spacing_{};
127 0 : bool beta_equilibrium_ = false;
128 0 : std::vector<std::string> available_quantities_{};
129 : };
130 : } // namespace h5
|