29 VIPRA_MODULE_NAME(
"coordinator");
30 VIPRA_MODULE_TYPE(Output);
32 VIPRA_REGISTER_PARAMS(VIPRA_PARAM(
"output_dir", _base_output_dir))
36 for (
auto& output : _outputs ) {
37 output->reset_module();
42 std::unique_ptr<Modules::Output>&& module,
45 _outputs.emplace_back(std::move(module));
46 _configs.emplace_back(std::move(config));
51 paramIn.
register_param(module_type(), module_name(),
"output_dir");
52 _base_output_dir = paramIn.
get_param<std::string>(module_type(), module_name(),
53 "output_dir", engine);
55 _current_output_dir = _base_output_dir;
56 create_output_directory(_current_output_dir);
58 for (
size_t i = 0; i < _outputs.size(); ++i ) {
59 _configs[i](_outputs[i].get(), paramIn, engine);
70 _current_output_dir = _base_output_dir / std::to_string(runIdx);
71 create_output_directory(_current_output_dir);
81 std::for_each(_outputs.begin(), _outputs.end(),
82 [&](
auto& output) { output->write(_current_output_dir); });
85 void timestep_update(VIPRA::timestep timestep, VIPRA::delta_t timestepSize,
88 std::for_each(_outputs.begin(), _outputs.end(), [&](
auto& output) {
89 output->timestep_update(timestep, timestepSize, state);
99 void write_to_file(std::string
const& filename, std::string
const& value)
101 std::filesystem::path filepath = _current_output_dir / filename;
102 std::ofstream file(filepath);
104 if ( ! file.is_open() ) {
105 VIPRA_MODULE_ERROR(
"Could not open file for writing: {}", filepath.string());
114 std::vector<std::unique_ptr<VIPRA::Modules::Output>> _outputs;
117 std::filesystem::path _base_output_dir;
118 std::filesystem::path _current_output_dir;
120 void create_output_directory(std::filesystem::path
const& directory)
const
122 if ( std::filesystem::exists(directory) ) {
123 if ( std::filesystem::is_directory(directory) ) {
129 VIPRA_MODULE_ERROR(
"Output directory already exists and is not a directory: {}",
134 if ( ! std::filesystem::create_directory(directory) ) {
135 if ( ! std::filesystem::exists(directory) )
136 VIPRA_MODULE_ERROR(
"Could not create output directory: {}", directory.string());
auto get_param(Modules::Type module, std::string const &moduleName, std::string const ¶mName, Random::Engine &engine) const -> std::remove_cvref_t< data_t >
Returns the value of the parameter if it exists, otherwise throws an error.
Definition parameters.hpp:87
void register_param(Modules::Type module, std::string const &moduleName, std::string const ¶mName)
Registers a parameter for a module.
Definition parameters.cpp:28