10 #include "DataStructures/DataVector.hpp"
15 #include "IO/H5/VolumeData.hpp"
16 #include "IO/Importers/Tags.hpp"
17 #include "IO/Observer/ArrayComponentId.hpp"
18 #include "Parallel/ArrayIndex.hpp"
20 #include "Parallel/Invoke.hpp"
25 #include "Utilities/TaggedTuple.hpp"
29 template <
typename Metavariables>
30 struct ElementDataReader;
32 template <
typename ImporterOptionsGroup,
typename FieldTagsList,
33 typename ReceiveComponent>
34 struct ReadAllVolumeDataAndDistribute;
39 namespace importers::Actions {
66 template <
typename ImporterOptionsGroup,
typename FieldTagsList>
68 using const_global_cache_tags =
69 tmpl::list<Tags::FileName<ImporterOptionsGroup>,
73 template <
typename DbTagsList,
typename... InboxTags,
typename Metavariables,
74 typename ArrayIndex,
typename ActionList,
75 typename ParallelComponent>
77 db::DataBox<DbTagsList>& box,
80 const ArrayIndex& ,
const ActionList ,
81 const ParallelComponent*
const ) noexcept {
87 ImporterOptionsGroup, FieldTagsList, ParallelComponent>>(
89 return {std::move(box)};
131 template <
typename ImporterOptionsGroup,
typename FieldTagsList,
132 typename ReceiveComponent>
135 typename ParallelComponent,
typename DataBox,
typename Metavariables,
141 const ArrayIndex& ) noexcept {
151 const auto& has_read_volume_data =
152 db::get<Tags::ElementDataAlreadyRead>(box);
153 const auto volume_data_id = pretty_type::get_name<ImporterOptionsGroup>();
154 if (has_read_volume_data.find(volume_data_id) !=
155 has_read_volume_data.end()) {
158 db::mutate<Tags::ElementDataAlreadyRead>(
161 local_has_read_volume_data) noexcept {
162 local_has_read_volume_data->insert(std::move(volume_data_id));
168 constexpr
size_t version_number = 0;
170 "/" + Parallel::get<Tags::Subgroup<ImporterOptionsGroup>>(cache),
172 const auto observation_id = volume_file.find_observation_id(
176 tuples::tagged_tuple_from_typelist<FieldTagsList> all_tensor_data{};
177 tmpl::for_each<FieldTagsList>([&all_tensor_data, &volume_file,
178 &observation_id](
auto field_tag_v) noexcept {
179 using field_tag = tmpl::type_from<decltype(field_tag_v)>;
180 auto& tensor_data = get<field_tag>(all_tensor_data);
181 for (
size_t i = 0; i < tensor_data.size(); i++) {
182 tensor_data[i] = volume_file.get_tensor_component(
184 db::tag_name<field_tag>() +
185 tensor_data.component_suffix(tensor_data.get_tensor_index(i)));
190 const auto all_grid_names = volume_file.get_grid_names(observation_id);
191 const auto all_extents = volume_file.get_extents(observation_id);
193 for (
auto& element_and_name : get<Tags::RegisteredElements>(box)) {
194 const CkArrayIndex& raw_element_index =
195 element_and_name.first.array_index();
201 if (element_and_name.first !=
204 raw_element_index)) {
208 const auto element_data_offset_and_length =
210 all_grid_names, all_extents);
212 tuples::tagged_tuple_from_typelist<FieldTagsList> element_data{};
213 tmpl::for_each<FieldTagsList>([&element_data,
214 &element_data_offset_and_length,
216 auto field_tag_v) noexcept {
217 using field_tag = tmpl::type_from<decltype(field_tag_v)>;
218 auto& element_tensor_data = get<field_tag>(element_data);
220 for (
size_t i = 0; i < element_tensor_data.size(); i++) {
222 get<field_tag>(all_tensor_data)[i];
224 element_data_offset_and_length.second};
226 for (
size_t j = 0; j < element_tensor_component.size(); j++) {
227 element_tensor_component[j] =
228 data_tensor_component[element_data_offset_and_length.first + j];
230 element_tensor_data[i] = element_tensor_component;
234 const auto element_index =
240 Parallel::get_parallel_component<ReceiveComponent>(
241 cache)[element_index],
244 0_st, std::move(element_data));