Alamo
Util.cpp
Go to the documentation of this file.
1#include "Util.H"
2#include "Color.H"
3
4#include <chrono>
5#include <cstdlib>
6#include <filesystem>
7#include <stdexcept>
8
9#include "AMReX_ParallelDescriptor.H"
10#include "AMReX_Utility.H"
11
12#include "IO/ParmParse.H"
13#include "IO/WriteMetaData.H"
14#include "IO/FileNameParse.H"
15#include "Color.H"
16#include "Numeric/Stencil.H"
17
18namespace Util
19{
20
21std::string filename = "";
22std::string globalprefix = "";
23std::pair<std::string,std::string> file_overwrite;
24bool initialized = false;
25bool finalized = false;
26
27std::string GetFileName()
28{
29 if (filename == "")
30 {
32 IO::ParmParse pp_amr("amr");
33
34 if (pp_amr.contains("plot_file") && pp.contains("plot_file"))
35 Util::Abort("plot_file specified in too many locations");
36 else if (pp_amr.contains("plot_file"))
37 {
38 if (amrex::ParallelDescriptor::IOProcessor())
39 amrex::Warning("amr.plot_file will be depricated; use plot_file instead");
40 pp_amr.query("plot_file", filename);
41
42 }
43 else if (pp.contains("plot_file"))
44 {
45 pp_query("plot_file", filename); // Name of directory containing all output data
46 }
48 // else
49 // if (amrex::ParallelDescriptor::IOProcessor())
50 // Util::Abort("No plot file specified! (Specify plot_file = \"plot_file_name\" in input file");
51 }
52 return filename;
53}
54void CopyFileToOutputDir(std::string a_path, bool fullpath, std::string prefix)
55{
56 try
57 {
58 if (filename == "")
59 Util::Exception(INFO,"Cannot back up files yet because the output directory has not been specified");
60
61 std::string basefilename = std::filesystem::path(a_path).filename();
62 std::string absolutepath = std::filesystem::absolute(std::filesystem::path(a_path)).string();
63 std::string abspathfilename = absolutepath;
64 std::replace(abspathfilename.begin(),abspathfilename.end(),'/','_');
65 if (prefix != "")
66 {
67 abspathfilename = prefix + "__" + abspathfilename;
68 basefilename = prefix + "__" + abspathfilename;
69 }
70
71 if (amrex::ParallelDescriptor::IOProcessor())
72 {
73 std::string destinationpath;
74 if (fullpath) destinationpath = filename+"/"+abspathfilename;
75 else destinationpath = filename+"/"+basefilename;
76
77 // Copy the file where the file name is the absolute path, with / replaced with _
78 if (std::filesystem::exists(destinationpath))
79 Util::Exception(INFO,"Trying to copy ",destinationpath," but it already exists.");
80 std::filesystem::copy_file(a_path,destinationpath);
81 }
82 }
83 catch (std::filesystem::filesystem_error const& ex)
84 {
86 "file system error: \n",
87 " what(): " , ex.what() , '\n',
88 " path1(): " , ex.path1() , '\n',
89 " path2(): " , ex.path2() , '\n',
90 " code().value(): " , ex.code().value() , '\n',
91 " code().message(): " , ex.code().message() , '\n',
92 " code().category(): " , ex.code().category().name());
93 }
94}
95
96std::pair<std::string,std::string> GetOverwrittenFile()
97{
98 return file_overwrite;
99}
100
101void SignalHandler(int s)
102{
103 if (amrex::ParallelDescriptor::IOProcessor())
104 {
105 std::string filename = GetFileName();
107 if (s == SIGSEGV) status = IO::Status::Segfault;
108 else if (s == SIGINT) status = IO::Status::Interrupt;
109 if (s == SIGABRT) status = IO::Status::Abort;
110 if (filename != "")
112 }
113
114#ifdef MEME
115 IO::ParmParse pp;
116 if (!pp.contains("nomeme"))
117 {
118 time_t timer; time(&timer);
119 std::stringstream cmd;
120 cmd << "xdg-open " << BUILD_DIR << "/src/Util/Meme/cat0" << (1+((int)timer)%6) << ".gif &";
121 std::system(cmd.str().c_str());
122 std::cout << Color::Bold << Color::FG::Red << "PROGRAM FAILED!" << Color::Reset << " (Compile without -DMEME, or set nomeme = 1 in the input file to disable this!)";
123 }
124#endif
125
126 amrex::BLBackTrace::handler(s);
127}
128
129
131{
132 int argc = 0;
133 char **argv = nullptr;
134 Initialize(argc,argv);
135 initialized = true;
136}
137void Initialize (int argc, char* argv[])
138{
139 srand (time(NULL));
140
141 amrex::Initialize(argc, argv);
142
143 IO::ParmParse pp_amrex("amrex");
144 pp_amrex.add("throw_exception",1);
145 //amrex.throw_exception=1
146
147 signal(SIGSEGV, Util::SignalHandler);
148 signal(SIGINT, Util::SignalHandler);
149 signal(SIGABRT, Util::SignalHandler);
150
151 std::string filename = GetFileName();
152
153 if (amrex::ParallelDescriptor::IOProcessor() && filename != "")
154 {
157 }
158
159 IO::ParmParse pp;
160 std::string length, time, mass, temperature, current, amount, luminousintensity;
161 // Set the system length unit
162 pp.query_default("system.length",length,"m");
163 // Set the system time unit
164 pp.query_default("system.time",time,"s");
165 // Set the system mass unit
166 pp.query_default("system.mass",mass,"kg");
167 // Set the system temperature unit
168 pp.query_default("system.temperature",temperature,"K");
169 // Set the system current unit
170 pp.query_default("system.current",current,"A");
171 // Set the system amount unit
172 pp.query_default("system.amount",amount,"mol");
173 // Set the system luminous intensity unit
174 pp.query_default("system.luminousintensity",luminousintensity,"cd");
175 try
176 {
177 Unit::setLengthUnit(length);
178 Unit::setTimeUnit(time);
179 Unit::setMassUnit(mass);
180 Unit::setTemperatureUnit(temperature);
181 Unit::setCurrentUnit(current);
182 Unit::setAmountUnit(amount);
183 Unit::setLuminousIntensityUnit(luminousintensity);
184
185 // Update Constants to desired system units
187 }
188 catch (std::runtime_error &e)
189 {
190 Util::Exception(INFO, "Error in setting system units: ", e.what());
191 }
192
193 //
194 // This is some logic to unit-ize the geometry.prob_lo, geometry.prob_hi input variables/
195 // We also do some checking to make sure the geometry is valid.
196 //
197 // Note that here, unlike most places, we actually **replace and overwrite** the
198 // geom.prob_* variables, since they are read deep inside amrex infrastructure.
199 //
200 {
201 IO::ParmParse pp("geometry");
202
203 if (pp.contains("prob_lo"))
204 {
205 std::vector<Set::Scalar> prob_lo, prob_hi;
206 // Location of the lower+left+bottom corner
207 pp.queryarr("prob_lo", prob_lo, Unit::Length());
208 // Location of the upper_right_top corner
209 pp.queryarr("prob_hi", prob_hi, Unit::Length());
210 pp.remove("prob_lo");
211 pp.remove("prob_hi");
212
213 Util::Assert( INFO,TEST(prob_lo[0] < prob_hi[0]),
214 "Invalid domain specified: ", prob_lo[0], " < x < ", prob_hi[0], " is incorrect.");
215 Util::Assert( INFO,TEST(prob_lo[1] < prob_hi[1]),
216 "Invalid domain specified: ", prob_lo[0], " < y < ", prob_hi[0], " is incorrect.");
217#if AMREX_SPACEDIM>2
218 Util::Assert( INFO,TEST(prob_lo[2] < prob_hi[2]),
219 "Invalid domain specified: ", prob_lo[0], " < z < ", prob_hi[0], " is incorrect.");
220#endif
221
222 Util::DebugMessage(INFO,"Domain lower left corner: ", Set::Vector(prob_lo.data()).transpose());
223 Util::DebugMessage(INFO,"Domain upper right corenr: ", Set::Vector(prob_hi.data()).transpose());
224
225 pp.addarr("prob_lo",prob_lo);
226 pp.addarr("prob_hi",prob_hi);
227 }
228 }
229}
230
232{
233 std::string filename = GetFileName();
234 if (filename != "")
236 amrex::Finalize();
237 finalized = true;
238}
239
240
241
242void
243Abort (const char * msg) { Terminate(msg, SIGABRT, true); }
244
245void
246Terminate(const char * /* msg */, int signal, bool /*backtrace*/)
247{
248 SignalHandler(signal);
249}
250
251std::pair<std::string,std::string>
252CreateCleanDirectory (const std::string &path, bool callbarrier)
253{
254 std::pair<std::string,std::string> ret("","");
255
256 if(amrex::ParallelDescriptor::IOProcessor()) {
257 if(amrex::FileExists(path)) {
258 std::time_t t = std::time(0);
259 std::tm * now = std::localtime(&t);
260 int year = now->tm_year+1900;
261 int month = now->tm_mon+1;
262 int day = now->tm_mday;
263 int hour = now->tm_hour;
264 int minute = now->tm_min;
265 int second = now->tm_sec;
266
267 std::stringstream ss;
268 ss << year
269 << std::setfill('0') << std::setw(2) << month
270 << std::setfill('0') << std::setw(2) << day
271 << std::setfill('0') << std::setw(2) << hour
272 << std::setfill('0') << std::setw(2) << minute
273 << std::setfill('0') << std::setw(2) << second;
274
275 std::string newoldname(path + ".old." + ss.str());
276 if (amrex::system::verbose) {
277 amrex::Print() << "Util::CreateCleanDirectory(): " << path
278 << " exists. Renaming to: " << newoldname << std::endl;
279 }
280 std::rename(path.c_str(), newoldname.c_str());
281 ret.first = path;
282 ret.second = newoldname;
283 }
284 if( ! amrex::UtilCreateDirectory(path, 0755)) {
285 amrex::CreateDirectoryFailed(path);
286 }
287 }
288 if(callbarrier) {
289 // Force other processors to wait until directory is built.
290 amrex::ParallelDescriptor::Barrier("amrex::UtilCreateCleanDirectory");
291 }
292 return ret;
293}
294
295
296namespace Test
297{
298int Message(std::string testname)
299{
300 if (amrex::ParallelDescriptor::IOProcessor())
301 std::cout << std::left
302 << Color::FG::White << Color::Bold << testname << Color::Reset << std::endl;
303 return 0;
304}
305int Message(std::string testname, int failed)
306{
307 if (amrex::ParallelDescriptor::IOProcessor())
308 {
309 winsize w;
310 ioctl(STDOUT_FILENO, TIOCGWINSZ, &w);
311 std::stringstream ss;
312 if (!failed)
313 ss << "[" << Color::FG::Green << Color::Bold << "PASS" << Color::Reset << "]";
314 else
315 ss << "[" << Color::FG::Red << Color::Bold << "FAIL" << Color::Reset << "]";
316
317 int terminalwidth = 80; //std::min(w.ws_col,(short unsigned int) 100);
318
319 std::cout << std::left
320 << testname
321 << std::setw(terminalwidth - testname.size() + ss.str().size() - 6) << std::right << std::setfill('.') << ss.str() << std::endl;
322 }
323 return failed;
324}
325int SubMessage(std::string testname, int failed)
326{
327 if (amrex::ParallelDescriptor::IOProcessor())
328 {
329 winsize w;
330 ioctl(STDOUT_FILENO, TIOCGWINSZ, &w);
331 std::stringstream ss;
332 if (!failed)
333 ss << "[" << Color::FG::LightGreen << Color::Bold << "PASS" << Color::Reset << "]";
334 else
335 ss << "[" << Color::FG::Red << Color::Bold << "FAIL" << Color::Reset << "]";
336
337 int terminalwidth = 80;
338
339 std::cout << std::left
340 << " ├ "
341 << testname
342 << std::setw(terminalwidth - testname.size() + ss.str().size() - 12) << std::right << std::setfill('.') << ss.str() << std::endl;
343 }
344 return failed;
345}
346int SubFinalMessage(int failed)
347{
348 if (amrex::ParallelDescriptor::IOProcessor())
349 {
350 winsize w;
351 ioctl(STDOUT_FILENO, TIOCGWINSZ, &w);
352 std::stringstream ss;
353 std::cout << std::left << " └ ";
354
355 if (!failed)
356 std::cout << Color::FG::Green << Color::Bold << failed << " tests failed" << Color::Reset << std::endl;
357 else
358 std::cout << Color::FG::Red << Color::Bold << failed << " tests failed" << Color::Reset << std::endl;
359 }
360 return failed;
361}
362
363}
364
365void AverageCellcenterToNode(amrex::MultiFab& node_mf, const int &dcomp, const amrex::MultiFab &cell_mf, const int &scomp, const int &ncomp/*, const int ngrow=0*/)
366{
367 Util::Assert(INFO,TEST(dcomp + ncomp <= node_mf.nComp()));
368 Util::Assert(INFO,TEST(scomp + ncomp <= cell_mf.nComp()));
369 //Util::Assert(INFO,TEST(cell_mf.boxArray() == node_mf.boxArray()));
370 Util::Assert(INFO,TEST(cell_mf.DistributionMap() == cell_mf.DistributionMap()));
371 Util::Assert(INFO,TEST(cell_mf.nGrow() > 0));
372 for (amrex::MFIter mfi(node_mf,amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi)
373 {
374 amrex::Box bx = mfi.nodaltilebox();
375 amrex::Array4<Set::Scalar> const& node = node_mf.array(mfi);
376 amrex::Array4<const Set::Scalar> const& cell = cell_mf.array(mfi);
377 for (int n = 0; n < ncomp; n++)
378 amrex::ParallelFor (bx,[=] AMREX_GPU_DEVICE(int i, int j, int k) {
379 node(i,j,k,dcomp+n) = Numeric::Interpolate::CellToNodeAverage(cell,i,j,k,scomp+n);
380 });
381 }
382}
383
384
385}
std::time_t t
#define pp_query(...)
Definition ParmParse.H:108
#define TEST(x)
Definition Util.H:22
#define INFO
Definition Util.H:21
bool contains(std::string name)
Definition ParmParse.H:173
int queryarr(std::string name, std::vector< T > &value)
Definition ParmParse.H:535
int query_default(std::string name, T &value, T defaultvalue)
Definition ParmParse.H:293
static std::string Green
Definition Color.H:21
static std::string LightGreen
Definition Color.H:29
static std::string Red
Definition Color.H:20
static std::string White
Definition Color.H:34
static std::string Bold
Definition Color.H:9
static std::string Reset
Definition Color.H:8
void WriteMetaData(std::string plot_file, Status status, int per)
void FileNameParse(std::string &filename)
Internal function to do processing of the file name.
@ Segfault
@ Complete
@ Running
@ Interrupt
@ Abort
void SetGlobalConstants()
Definition Set.cpp:19
Eigen::Matrix< amrex::Real, AMREX_SPACEDIM, 1 > Vector
Definition Base.H:19
Definition GB.H:8
int Message(std::string testname)
Definition Util.cpp:298
int SubMessage(std::string testname, int failed)
Definition Util.cpp:325
int SubFinalMessage(int failed)
Definition Util.cpp:346
A collection of utility routines.
Definition Set.cpp:33
std::pair< std::string, std::string > CreateCleanDirectory(const std::string &path, bool callbarrier)
Definition Util.cpp:252
void DebugMessage(std::string, std::string, int, Args const &...)
Definition Util.H:173
std::string GetFileName()
Definition Util.cpp:27
bool finalized
Definition Util.cpp:25
void Abort(const char *msg)
Definition Util.cpp:243
std::string globalprefix
Definition Util.cpp:22
void Finalize()
Definition Util.cpp:231
std::string filename
Definition Util.cpp:21
void AverageCellcenterToNode(amrex::MultiFab &node_mf, const int &dcomp, const amrex::MultiFab &cell_mf, const int &scomp, const int &ncomp)
Definition Util.cpp:365
bool initialized
Definition Util.cpp:24
AMREX_FORCE_INLINE void Assert(std::string file, std::string func, int line, std::string smt, bool pass, Args const &... args)
Definition Util.H:55
std::pair< std::string, std::string > file_overwrite
Definition Util.cpp:23
void CopyFileToOutputDir(std::string a_path, bool fullpath, std::string prefix)
Definition Util.cpp:54
void Initialize()
Definition Util.cpp:130
std::pair< std::string, std::string > GetOverwrittenFile()
Definition Util.cpp:96
void Exception(std::string file, std::string func, int line, Args const &... args)
Definition Util.H:223
void Terminate(const char *, int signal, bool)
Definition Util.cpp:246
void SignalHandler(int s)
Definition Util.cpp:101
static AMREX_FORCE_INLINE T CellToNodeAverage(const amrex::Array4< const T > &f, const int &i, const int &j, const int &k, const int &m, std::array< StencilType, AMREX_SPACEDIM > stencil=DefaultType)
Definition Stencil.H:1313
static void setTimeUnit(std::string unit)
Definition Unit.H:377
static void setLuminousIntensityUnit(std::string unit)
Definition Unit.H:417
static void setLengthUnit(std::string unit)
Definition Unit.H:369
static void setMassUnit(std::string unit)
Definition Unit.H:385
static void setTemperatureUnit(std::string unit)
Definition Unit.H:393
static void setCurrentUnit(std::string unit)
Definition Unit.H:401
static void setAmountUnit(std::string unit)
Definition Unit.H:409
static Unit Length()
Definition Unit.H:198