diff --git a/src/one-body-problem.cc b/src/one-body-problem.cc index ef5b22c7e3c3c324f84c465b0e3b72e0a23a440c..14139f808bf467490964be8ae9929e24ad0facce 100644 --- a/src/one-body-problem.cc +++ b/src/one-body-problem.cc @@ -6,7 +6,9 @@ #undef HAVE_IPOPT #endif +#include <atomic> #include <cmath> +#include <csignal> #include <exception> #include <fstream> #include <iostream> @@ -71,6 +73,9 @@ Dune::ParameterTree getParameters(int argc, char *argv[]) { return parset; } +static std::atomic<bool> terminationRequested(false); +void handleSignal(int signum) { terminationRequested = true; } + int main(int argc, char *argv[]) { try { Dune::MPIHelper::instance(argc, argv); @@ -268,6 +273,10 @@ int main(int argc, char *argv[]) { return stateEnergyNorm.diff(fineAlpha, coarseAlpha) > refinementTolerance; }; + std::signal(SIGXCPU, handleSignal); + std::signal(SIGINT, handleSignal); + std::signal(SIGTERM, handleSignal); + AdaptiveTimeStepper<NonlinearFactory, MyUpdater, EnergyNorm<ScalarMatrix, ScalarVector>> adaptiveTimeStepper(factory, parset, myGlobalFriction, current, @@ -286,6 +295,11 @@ int main(int argc, char *argv[]) { current.state_->extractAlpha(programState.alpha); report(); + + if (terminationRequested) { + std::cerr << "Terminating prematurely" << std::endl; + break; + } } } catch (Dune::Exception &e) { Dune::derr << "Dune reported error: " << e << std::endl;