3737#include " openPMD/backend/Writable.hpp"
3838#include " openPMD/toolkit/ExternalBlockStorage.hpp"
3939
40+ #if openPMD_USE_FILESYSTEM_HEADER
41+ #include < filesystem>
42+ #endif
4043#include < iomanip>
44+ #include < ios>
4145#include < sstream>
4246#include < toml.hpp>
4347
@@ -2581,7 +2585,7 @@ merge the .json files somehow (no tooling provided for this (yet)).
25812585 readme_file.open (
25822586 dirpath + " /README.txt" ,
25832587 std::ios_base::out | std::ios_base::trunc);
2584- readme_file << readme_msg + 1 ;
2588+ readme_file << & readme_msg[ 1 ] ;
25852589 readme_file.close ();
25862590 if (!readme_file.good () &&
25872591 !filename.fileState ->printedReadmeWarningAlready )
@@ -2595,6 +2599,70 @@ merge the .json files somehow (no tooling provided for this (yet)).
25952599 << readme_msg + 1 << " ----------" << std::endl;
25962600 filename.fileState ->printedReadmeWarningAlready = true ;
25972601 }
2602+
2603+ constexpr char const *merge_script = R"END(
2604+ #!/usr/bin/env bash
2605+
2606+ set -euo pipefail
2607+
2608+ parallel_dir="$(dirname "$BASH_SOURCE")"
2609+ parallel_dir="$(cd "$parallel_dir" && pwd)"
2610+ serial_dir="${parallel_dir%.json.parallel}"
2611+ if [[ "$serial_dir" = "$parallel_dir" ]]; then
2612+ serial_dir="$parallel_dir/merged.json"
2613+ else
2614+ serial_dir="$serial_dir.json"
2615+ fi
2616+ echo "Will merge files to '$serial_dir'." >&2
2617+ if [[ -e "$serial_dir" ]]; then
2618+ echo "Target dir already exists, aborting." >&2
2619+ exit 1
2620+ fi
2621+ if ! which openpmd-merge-json 2>/dev/null; then
2622+ echo "Did not find 'openpmd-merge-json' on PATH, aborting." >&2
2623+ exit 1
2624+ fi
2625+ for file in "$parallel_dir"/mpi_rank_*.json; do
2626+ echo "@$file"
2627+ done |
2628+ xargs openpmd-merge-json >"$serial_dir"
2629+ # TODO: xargs will only work up to a certain number of files)END" ;
2630+ std::string const merge_script_path = dirpath + " /merge.sh" ;
2631+ std::fstream merge_file;
2632+ merge_file.open (
2633+ merge_script_path, std::ios_base::out | std::ios_base::trunc);
2634+ merge_file << &merge_script[1 ];
2635+ merge_file.close ();
2636+
2637+ if (!merge_file.good () &&
2638+ !filename.fileState ->printedReadmeWarningAlready )
2639+ {
2640+ std::cerr
2641+ << " [Warning] Something went wrong in trying to create "
2642+ " merge script at '"
2643+ << merge_script_path << " '. Will ignore and continue."
2644+ << std::endl;
2645+ filename.fileState ->printedReadmeWarningAlready = true ;
2646+ }
2647+
2648+ #if openPMD_USE_FILESYSTEM_HEADER
2649+ try
2650+ {
2651+ std::filesystem::permissions (
2652+ merge_script_path,
2653+ std::filesystem::perms::owner_exec |
2654+ std::filesystem::perms::owner_exec |
2655+ std::filesystem::perms::owner_exec,
2656+ std::filesystem::perm_options::add);
2657+ }
2658+ catch (std::filesystem::filesystem_error const &e)
2659+ {
2660+ std::cerr << " Failed setting executable permissions on '"
2661+ << merge_script_path
2662+ << " ', will ignore. Original error was:\n "
2663+ << e.what () << std::endl;
2664+ }
2665+ #endif
25982666 }
25992667 };
26002668
0 commit comments