Line data Source code
1 1 : // Distributed under the MIT License.
2 : // See LICENSE.txt for details.
3 :
4 : /// \file
5 : /// Defines class h5::Cce
6 :
7 : #pragma once
8 :
9 : #include <array>
10 : #include <cstddef>
11 : #include <cstdint>
12 : #include <hdf5.h>
13 : #include <string>
14 : #include <unordered_map>
15 : #include <unordered_set>
16 : #include <vector>
17 :
18 : #include "IO/H5/Object.hpp"
19 : #include "IO/H5/OpenGroup.hpp"
20 :
21 : /// \cond
22 : class Matrix;
23 : /// \endcond
24 :
25 : namespace h5 {
26 : /*!
27 : * \ingroup HDF5Group
28 : * \brief Represents Cauchy-Characteristic Extraction (CCE) bondi variables
29 : * inside of an HDF5 file.
30 : *
31 : * Within a Cce object, there are several datasets that correspond to the
32 : * `Cce::scri_plus_interpolation_set` bondi variables at future null infinity
33 : * represented as complex spherical harmonic coefficients. The names of these
34 : * bondi variables are
35 : *
36 : * - `EthInertialRetardedTime`
37 : * - `News`
38 : * - `Psi0`
39 : * - `Psi1`
40 : * - `Psi2`
41 : * - `Psi3`
42 : * - `Psi4`
43 : * - `Strain`
44 : *
45 : * Each dataset has a couple H5 attributes:
46 : *
47 : * - `Legend` which is determined by the `l_max` massed to the constructor.
48 : * - `sxs_format` which is a string. The value is "SpECTRE_CCE_v1"
49 : *
50 : * The Cce object itself also has the `sxs_format` attribute with the same
51 : * value, along with a `version` and `header` attribute.
52 : *
53 : * The columns of data are stored in each dataset in the following order:
54 : *
55 : * - `time`
56 : * - `Real Y_0,0`
57 : * - `Imag Y_0,0`
58 : * - `Real Y_1,-1`
59 : * - `Imag Y_1,-1`
60 : * - `Real Y_1,0`
61 : * - `Imag Y_1,0`
62 : * - `Real Y_1,1`
63 : * - `Imag Y_1,1`
64 : * - ...
65 : *
66 : * and so on until you reach the coefficients for `l_max`.
67 : *
68 : * \note This class does not do any caching of data so all data is written as
69 : * soon as append() is called.
70 : */
71 1 : class Cce : public h5::Object {
72 0 : struct DataSet {
73 0 : hid_t id;
74 0 : std::array<hsize_t, 2> size;
75 : };
76 :
77 : public:
78 : /// \cond HIDDEN_SYMBOLS
79 : static std::string extension() { return ".cce"; }
80 :
81 : Cce(bool exists, detail::OpenGroup&& group, hid_t location,
82 : const std::string& name, size_t l_max, uint32_t version = 1);
83 :
84 : Cce(const Cce& /*rhs*/) = delete;
85 : Cce& operator=(const Cce& /*rhs*/) = delete;
86 : Cce(Cce&& /*rhs*/) = delete; // NOLINT
87 : Cce& operator=(Cce&& /*rhs*/) = delete; // NOLINT
88 :
89 : ~Cce() override;
90 : /// \endcond HIDDEN_SYMBOLS
91 :
92 : /*!
93 : * \brief For each bondi variable name, appends the \p data to the dataset in
94 : * the H5 file.
95 : *
96 : * \details The `data.at(name).size()` must be the same as the number of
97 : * columns already in the dataset. Also, all bondi variable names listed in
98 : * the constructor of `h5::Cce` must be present in the \p data.
99 : */
100 1 : void append(const std::unordered_map<std::string, std::vector<double>>& data);
101 :
102 : /// @{
103 : /*!
104 : * \brief Return all currently stored data in the `h5::Cce` file in the form
105 : * of a `Matrix` or a `std::vector<std::vector<double>>` for each bondi
106 : * variable
107 : */
108 : template <typename T = Matrix>
109 1 : std::unordered_map<std::string, T> get_data() const;
110 :
111 : template <typename T = Matrix>
112 1 : T get_data(const std::string& bondi_variable_name) const;
113 : /// @}
114 :
115 : /// @{
116 : /*!
117 : * \brief Get only some values of $\ell$ over a range of rows
118 : *
119 : * \details The `time` column is always returned. The coefficients will be
120 : * returned in the order that you requested them in. No sorting is done
121 : * internally. All requested \p these_ell must be less that or equal to the \p
122 : * l_max that this file was constructed with. Also both the first and last row
123 : * requested must be less than or equal to the total number of rows.
124 : */
125 : template <typename T = Matrix>
126 1 : std::unordered_map<std::string, T> get_data_subset(
127 : const std::vector<size_t>& these_ell, size_t first_row = 0,
128 : size_t num_rows = 1) const;
129 :
130 : template <typename T = Matrix>
131 1 : T get_data_subset(const std::string& bondi_variable_name,
132 : const std::vector<size_t>& these_ell, size_t first_row = 0,
133 : size_t num_rows = 1) const;
134 : /// @}
135 :
136 : /*!
137 : * \brief Return the legend. All bondi variables have the same legend.
138 : */
139 1 : const std::vector<std::string> get_legend() const { return legend_; }
140 :
141 : /*!
142 : * \brief Return the number of rows (first index) and columns (second index)
143 : * of the \p bondi_variable_name dataset. All bondi variables will have the
144 : * same dimensions.
145 : */
146 1 : const std::array<hsize_t, 2>& get_dimensions(
147 : const std::string& bondi_variable_name) const;
148 :
149 : /*!
150 : * \brief The header of the Cce file
151 : */
152 1 : const std::string& get_header() const { return header_; }
153 :
154 : /*!
155 : * \brief The user-specified version number of the Cce file
156 : *
157 : * \note h5::Version returns a uint32_t, so we return one here too for the
158 : * version
159 : */
160 1 : uint32_t get_version() const { return version_; }
161 :
162 : /*!
163 : * \brief Path to this Cce file.
164 : */
165 1 : const std::string& subfile_path() const override { return path_; }
166 :
167 : private:
168 0 : void check_bondi_variable(const std::string& bondi_variable_name) const;
169 : /// \cond HIDDEN_SYMBOLS
170 : detail::OpenGroup group_;
171 : std::string name_;
172 : std::string path_;
173 : uint32_t version_;
174 : size_t l_max_;
175 : std::vector<std::string> legend_{};
176 : detail::OpenGroup cce_group_{};
177 : std::string header_;
178 : std::unordered_map<std::string, DataSet> bondi_datasets_;
179 : std::unordered_set<std::string> bondi_variables_{"EthInertialRetardedTime",
180 : "News",
181 : "Psi0",
182 : "Psi1",
183 : "Psi2",
184 : "Psi3",
185 : "Psi4",
186 : "Strain"};
187 : std::string sxs_format_str_{"sxs_format"};
188 : std::string sxs_version_str_{"SpECTRE_CCE_v1"};
189 : /// \endcond HIDDEN_SYMBOLS
190 : };
191 : } // namespace h5
|