aboutsummaryrefslogtreecommitdiff
path: root/Source/WarpX.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WarpX.cpp')
-rw-r--r--Source/WarpX.cpp48
1 files changed, 48 insertions, 0 deletions
diff --git a/Source/WarpX.cpp b/Source/WarpX.cpp
index 3d11074df..e2f88e751 100644
--- a/Source/WarpX.cpp
+++ b/Source/WarpX.cpp
@@ -38,6 +38,8 @@
#include "Utils/WarpXProfilerWrapper.H"
#include "Utils/WarpXUtil.H"
+#include <ablastr/utils/SignalHandling.H>
+
#ifdef AMREX_USE_SENSEI_INSITU
# include <AMReX_AmrMeshInSituBridge.H>
#endif
@@ -233,6 +235,8 @@ WarpX::WarpX ()
InitEB();
+ ablastr::utils::SignalHandling::InitSignalHandling();
+
// Geometry on all levels has been defined already.
// No valid BoxArray and DistributionMapping have been defined.
// But the arrays for them have been resized.
@@ -560,6 +564,50 @@ WarpX::ReadParameters ()
}
}
+ using ablastr::utils::SignalHandling;
+ std::vector<std::string> signals_in;
+ pp_warpx.queryarr("break_signals", signals_in);
+
+#if defined(__linux__) || defined(__APPLE__)
+ for (const std::string &str : signals_in) {
+ int sig = SignalHandling::parseSignalNameToNumber(str);
+ SignalHandling::signal_conf_requests[SignalHandling::SIGNAL_REQUESTS_BREAK][sig] = true;
+ }
+ signals_in.clear();
+#else
+ WARPX_ALWAYS_ASSERT_WITH_MESSAGE(signals_in.empty(),
+ "Signal handling requested in input, but is not supported on this platform");
+#endif
+
+ bool have_checkpoint_diagnostic = false;
+
+ ParmParse pp("diagnostics");
+ std::vector<std::string> diags_names;
+ pp.queryarr("diags_names", diags_names);
+
+ for (const auto &diag : diags_names) {
+ ParmParse dd(diag);
+ std::string format;
+ dd.query("format", format);
+ if (format == "checkpoint") {
+ have_checkpoint_diagnostic = true;
+ break;
+ }
+ }
+
+ pp_warpx.queryarr("checkpoint_signals", signals_in);
+#if defined(__linux__) || defined(__APPLE__)
+ for (const std::string &str : signals_in) {
+ int sig = SignalHandling::parseSignalNameToNumber(str);
+ SignalHandling::signal_conf_requests[SignalHandling::SIGNAL_REQUESTS_CHECKPOINT][sig] = true;
+ WARPX_ALWAYS_ASSERT_WITH_MESSAGE(have_checkpoint_diagnostic,
+ "Signal handling was requested to checkpoint, but no checkpoint diagnostic is configured");
+ }
+#else
+ WARPX_ALWAYS_ASSERT_WITH_MESSAGE(signals_in.empty(),
+ "Signal handling requested in input, but is not supported on this platform");
+#endif
+
// set random seed
std::string random_seed = "default";
pp_warpx.query("random_seed", random_seed);