Alamo
FileNameParse.cpp
Go to the documentation of this file.
1#include "IO/FileNameParse.H"
2#include <cstdlib>
3#include <iomanip>
4#include <sstream>
5#include <chrono>
6#include <regex>
7#include "Util/Util.H"
8#include "IO/ParmParse.H"
9
10std::time_t t = 0;
11
12/// Internal function to do processing of the file name
13void IO::FileNameParse(std::string &filename)
14{
15
16 //
17 // Variable substitution
18 //
19
21 std::string input = filename;
22 // Define the regex pattern to match {name_of_variable,"formatting string"} or {name_of_variable}
23 std::regex pattern("\\{([a-zA-Z0-9_\\.]+)(\\s*,\\s*\"([^\"]*)\")?\\}");
24
25 // Iterator to find all matches
26 auto matches_begin = std::sregex_iterator(input.begin(), input.end(), pattern);
27 auto matches_end = std::sregex_iterator();
28
29 // Iterate over the matches and print them
30 for (std::sregex_iterator i = matches_begin; i != matches_end; ++i)
31 {
32 std::smatch match = *i;
33 std::string variable_name = match[1].str();
34 std::string formatting_string = match[3].str(); // match[3] captures the format string
35
36 if (!formatting_string.empty()) {
37 Util::Exception(INFO,"Formatting strings are not supported yet");
38 } else {
39 if (variable_name.rfind("SLURM_", 0) == 0)
40 {
41 const char *variable_value = std::getenv(variable_name.c_str());
42 const std::string replacement =
43 variable_value != nullptr && variable_value[0] != '\0' ?
44 variable_value : variable_name;
46 filename, "{" + variable_name + "}", replacement);
47 }
48 else
49 {
50 std::vector<std::string> variable_value;
51 pp.queryarr(variable_name.c_str(),variable_value);
52 Util::String::ReplaceAll(filename,"{"+variable_name+"}",Util::String::Join(variable_value,'_'));
53 }
54 }
55 }
56
57
58 //
59 // Time wildcards
60 //
61
62 if (!t) t = std::time(0);
63 std::tm * now = std::localtime(&t);
64 int year = now->tm_year+1900;
65 int month = now->tm_mon+1;
66 int day = now->tm_mday;
67 int hour = now->tm_hour;
68 int minute = now->tm_min;
69 int second = now->tm_sec;
70 int microsecond = std::chrono::duration_cast<std::chrono::microseconds>(std::chrono::system_clock::now().time_since_epoch()).count() % 1000000;
71
72 std::stringstream ss;
73
74 // _Y: year
75 ss.str("");
76 ss << year;
77 std::string _Y = ss.str();
78 Util::String::ReplaceAll(filename,"%Y",_Y);
79
80 // _m: month (01..12)
81 ss.str("");
82 ss << std::setfill('0') << std::setw(2) << month;
83 std::string _m = ss.str();
84 Util::String::ReplaceAll(filename,"%m",_m);
85
86 // _d: day of month (01..31)
87 ss.str("");
88 ss << std::setfill('0') << std::setw(2) << day;
89 std::string _d = ss.str();
90 Util::String::ReplaceAll(filename,"%d",_d);
91
92 // _H: hour (00..23)
93 ss.str("");
94 ss << std::setfill('0') << std::setw(2) << hour;
95 std::string _H = ss.str();
96 Util::String::ReplaceAll(filename,"%H",_H);
97
98 // _M: minute (00..59)
99 ss.str("");
100 ss << std::setfill('0') << std::setw(2) << minute;
101 std::string _M = ss.str();
102 Util::String::ReplaceAll(filename,"%M",_M);
103
104 // _S: second (00..59)
105 ss.str("");
106 ss << std::setfill('0') << std::setw(2) << second;
107 std::string _S = ss.str();
108 Util::String::ReplaceAll(filename,"%S",_S);
109
110 // _f: microsecond (00..59)
111 ss.str("");
112 //ss << std::setfill('0') << std::setw(2) << second;
113 ss << microsecond;
114 std::string _f = ss.str();
115 Util::String::ReplaceAll(filename,"%f",_f);
116
117 // _D: spatial dimension (1,2,3)
118 ss.str("");
119 ss << AMREX_SPACEDIM;
120 std::string _D = ss.str();
121 Util::String::ReplaceAll(filename,"%D",_D);
122
123
124
125
126
127
128
129
130
131 // Ensure consistency in filename across processor name.
132 // (if %f - microseconds is used, then processors will typically have different filenames.)
133 // !! Health warning: nothing is done to ensure that filename is consistent across
134 // MPI tasks. This could cause errors some day !!
135 std::vector<char> cstr(filename.begin(),filename.end());
136 amrex::ParallelDescriptor::Bcast(cstr.data(), cstr.size(), amrex::ParallelDescriptor::IOProcessorNumber(), MPI_COMM_WORLD);
137 filename = std::string(cstr.begin(),cstr.end());
138}
std::time_t t
#define INFO
Definition Util.H:24
int queryarr(std::string name, std::vector< T > &value, const std::source_location &location=std::source_location::current())
Definition ParmParse.H:1024
void FileNameParse(std::string &filename)
Internal function to do processing of the file name.
AMREX_FORCE_INLINE int ReplaceAll(std::string &str, const std::string before, const std::string after)
Definition String.H:23
AMREX_FORCE_INLINE std::string Join(const std::vector< std::string > &vec, std::string separator="_")
Definition String.H:83
void Exception(std::string file, std::string func, int line, Args const &... args)
Definition Util.H:237