Line data Source code
1 0 : // Distributed under the MIT License. 2 : // See LICENSE.txt for details. 3 : 4 : #pragma once 5 : 6 : #include <cstddef> 7 : #include <mutex> 8 : 9 : #include "DataStructures/DataBox/DataBox.hpp" 10 : #include "IO/H5/AccessType.hpp" 11 : #include "IO/H5/File.hpp" 12 : #include "IO/Observer/Helpers.hpp" 13 : #include "IO/Observer/Tags.hpp" 14 : #include "Parallel/ArrayComponentId.hpp" 15 : #include "Parallel/GlobalCache.hpp" 16 : #include "Parallel/Info.hpp" 17 : #include "Parallel/Invoke.hpp" 18 : #include "Parallel/Local.hpp" 19 : #include "Parallel/NodeLock.hpp" 20 : #include "Utilities/Requires.hpp" 21 : #include "Utilities/TMPL.hpp" 22 : 23 : namespace observers { 24 : namespace ThreadedActions { 25 : 26 : /*! 27 : * \brief Append data to an h5::Dat subfile of `Tags::VolumeFileName`. 28 : * 29 : * \details This is a streamlined interface for getting data to the volume file 30 : * associated with a node; it will simply write the `.dat` object 31 : * `subfile_name`, giving it the `file_legend` if it does not yet exist, 32 : * appending `data_row` to the end of the dat. 33 : */ 34 1 : struct WriteSimpleData { 35 : template <typename ParallelComponent, typename DbTagsList, 36 : typename Metavariables, typename ArrayIndex> 37 0 : static void apply(db::DataBox<DbTagsList>& box, 38 : Parallel::GlobalCache<Metavariables>& cache, 39 : const ArrayIndex& /*array_index*/, 40 : const gsl::not_null<Parallel::NodeLock*> node_lock, 41 : const std::vector<std::string>& file_legend, 42 : const std::vector<double>& data_row, 43 : const std::string& subfile_name) { 44 : Parallel::NodeLock* file_lock = nullptr; 45 : { 46 : const std::lock_guard hold_lock(*node_lock); 47 : db::mutate<Tags::H5FileLock>( 48 : [&file_lock](const gsl::not_null<Parallel::NodeLock*> in_file_lock) { 49 : file_lock = in_file_lock; 50 : }, 51 : make_not_null(&box)); 52 : } 53 : 54 : // scoped to close file 55 : { 56 : const std::lock_guard hold_lock(*file_lock); 57 : const auto& file_prefix = Parallel::get<Tags::VolumeFileName>(cache); 58 : auto& my_proxy = 59 : Parallel::get_parallel_component<ParallelComponent>(cache); 60 : h5::H5File<h5::AccessType::ReadWrite> h5file( 61 : file_prefix + 62 : std::to_string( 63 : Parallel::my_node<int>(*Parallel::local_branch(my_proxy))) + 64 : ".h5", 65 : true, observers::input_source_from_cache(cache)); 66 : const size_t version_number = 0; 67 : auto& output_dataset = 68 : h5file.try_insert<h5::Dat>(subfile_name, file_legend, version_number); 69 : output_dataset.append(data_row); 70 : h5file.close_current_object(); 71 : } 72 : } 73 : }; 74 : } // namespace ThreadedActions 75 : } // namespace observers