From 63270c4ca80c94248169269530c0c57a832ab4c8 Mon Sep 17 00:00:00 2001 From: bigfooted Date: Tue, 15 Aug 2023 09:44:38 +0200 Subject: [PATCH 1/3] first commit, proof of concept --- SU2_CFD/src/drivers/CSinglezoneDriver.cpp | 7 +++++-- SU2_CFD/src/iteration/CFluidIteration.cpp | 16 ++++++++++++++++ 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/SU2_CFD/src/drivers/CSinglezoneDriver.cpp b/SU2_CFD/src/drivers/CSinglezoneDriver.cpp index c1f2c2519c8..bfe399d0747 100644 --- a/SU2_CFD/src/drivers/CSinglezoneDriver.cpp +++ b/SU2_CFD/src/drivers/CSinglezoneDriver.cpp @@ -30,6 +30,8 @@ #include "../../include/output/COutput.hpp" #include "../../include/iteration/CIteration.hpp" + + CSinglezoneDriver::CSinglezoneDriver(char* confFile, unsigned short val_nZone, SU2_Comm MPICommunicator) : CDriver(confFile, @@ -45,6 +47,7 @@ CSinglezoneDriver::~CSinglezoneDriver() = default; void CSinglezoneDriver::StartSolver() { + StartTime = SU2_MPI::Wtime(); config_container[ZONE_0]->Set_StartTime(StartTime); @@ -66,8 +69,8 @@ void CSinglezoneDriver::StartSolver() { TimeIter = config_container[ZONE_0]->GetRestart_Iter(); /*--- Run the problem until the number of time iterations required is reached. ---*/ - while ( TimeIter < config_container[ZONE_0]->GetnTime_Iter() ) { - + /*--- or until a SIGTERM signal stops the loop. We catch SIGTERM and exit gracefully ---*/ + while ( TimeIter < config_container[ZONE_0]->GetnTime_Iter()) { /*--- Perform some preprocessing before starting the time-step simulation. ---*/ Preprocess(TimeIter); diff --git a/SU2_CFD/src/iteration/CFluidIteration.cpp b/SU2_CFD/src/iteration/CFluidIteration.cpp index cde93a085bb..2321cd80d24 100644 --- a/SU2_CFD/src/iteration/CFluidIteration.cpp +++ b/SU2_CFD/src/iteration/CFluidIteration.cpp @@ -25,9 +25,21 @@ * License along with SU2. If not, see . */ +#include +#include + #include "../../include/iteration/CFluidIteration.hpp" #include "../../include/output/COutput.hpp" +volatile sig_atomic_t stop; + +void signalHandler( int signum ) { + cout << "NIJSO: Interrupt signal (" << signum << ") received.\n"; + // cleanup and close up stuff here + stop = 1; + // terminate program + //exit(signum); +} void CFluidIteration::Preprocess(COutput* output, CIntegration**** integration, CGeometry**** geometry, CSolver***** solver, CNumerics****** numerics, CConfig** config, CSurfaceMovement** surface_movement, CVolumetricMovement*** grid_movement, @@ -254,6 +266,7 @@ void CFluidIteration::Solve(COutput* output, CIntegration**** integration, CGeom unsigned long Inner_Iter, nInner_Iter = config[val_iZone]->GetnInner_Iter(); bool StopCalc = false; + signal(SIGTERM, signalHandler); /*--- Synchronization point before a single solver iteration. Compute the wall clock time required. ---*/ @@ -283,6 +296,9 @@ void CFluidIteration::Solve(COutput* output, CIntegration**** integration, CGeom Output(output, geometry, solver, config, Inner_Iter, StopCalc, val_iZone, val_iInst); } + /*--- If signal was sent, we set stopcalc to force writing the files ---*/ + if (stop == 1) StopCalc = true; + /*--- If the iteration has converged, break the loop ---*/ if (StopCalc) break; } From 7be05edddb0f5cbf4553c43cbcb99c0df7201ca3 Mon Sep 17 00:00:00 2001 From: bigfooted Date: Wed, 16 Aug 2023 09:42:07 +0200 Subject: [PATCH 2/3] move signal handler to coutput --- SU2_CFD/src/drivers/CSinglezoneDriver.cpp | 3 --- SU2_CFD/src/iteration/CFluidIteration.cpp | 16 ---------------- SU2_CFD/src/output/COutput.cpp | 17 +++++++++++++++++ 3 files changed, 17 insertions(+), 19 deletions(-) diff --git a/SU2_CFD/src/drivers/CSinglezoneDriver.cpp b/SU2_CFD/src/drivers/CSinglezoneDriver.cpp index bfe399d0747..ff89e60a629 100644 --- a/SU2_CFD/src/drivers/CSinglezoneDriver.cpp +++ b/SU2_CFD/src/drivers/CSinglezoneDriver.cpp @@ -30,8 +30,6 @@ #include "../../include/output/COutput.hpp" #include "../../include/iteration/CIteration.hpp" - - CSinglezoneDriver::CSinglezoneDriver(char* confFile, unsigned short val_nZone, SU2_Comm MPICommunicator) : CDriver(confFile, @@ -47,7 +45,6 @@ CSinglezoneDriver::~CSinglezoneDriver() = default; void CSinglezoneDriver::StartSolver() { - StartTime = SU2_MPI::Wtime(); config_container[ZONE_0]->Set_StartTime(StartTime); diff --git a/SU2_CFD/src/iteration/CFluidIteration.cpp b/SU2_CFD/src/iteration/CFluidIteration.cpp index 2321cd80d24..cde93a085bb 100644 --- a/SU2_CFD/src/iteration/CFluidIteration.cpp +++ b/SU2_CFD/src/iteration/CFluidIteration.cpp @@ -25,21 +25,9 @@ * License along with SU2. If not, see . */ -#include -#include - #include "../../include/iteration/CFluidIteration.hpp" #include "../../include/output/COutput.hpp" -volatile sig_atomic_t stop; - -void signalHandler( int signum ) { - cout << "NIJSO: Interrupt signal (" << signum << ") received.\n"; - // cleanup and close up stuff here - stop = 1; - // terminate program - //exit(signum); -} void CFluidIteration::Preprocess(COutput* output, CIntegration**** integration, CGeometry**** geometry, CSolver***** solver, CNumerics****** numerics, CConfig** config, CSurfaceMovement** surface_movement, CVolumetricMovement*** grid_movement, @@ -266,7 +254,6 @@ void CFluidIteration::Solve(COutput* output, CIntegration**** integration, CGeom unsigned long Inner_Iter, nInner_Iter = config[val_iZone]->GetnInner_Iter(); bool StopCalc = false; - signal(SIGTERM, signalHandler); /*--- Synchronization point before a single solver iteration. Compute the wall clock time required. ---*/ @@ -296,9 +283,6 @@ void CFluidIteration::Solve(COutput* output, CIntegration**** integration, CGeom Output(output, geometry, solver, config, Inner_Iter, StopCalc, val_iZone, val_iInst); } - /*--- If signal was sent, we set stopcalc to force writing the files ---*/ - if (stop == 1) StopCalc = true; - /*--- If the iteration has converged, break the loop ---*/ if (StopCalc) break; } diff --git a/SU2_CFD/src/output/COutput.cpp b/SU2_CFD/src/output/COutput.cpp index 94d7c0a3cb3..2484908bb2e 100644 --- a/SU2_CFD/src/output/COutput.cpp +++ b/SU2_CFD/src/output/COutput.cpp @@ -25,6 +25,9 @@ * License along with SU2. If not, see . */ +#include +#include + #include "../../../Common/include/geometry/CGeometry.hpp" #include "../../include/solvers/CSolver.hpp" @@ -46,6 +49,13 @@ #include "../../include/output/filewriter/CSU2BinaryFileWriter.hpp" #include "../../include/output/filewriter/CSU2MeshFileWriter.hpp" +volatile sig_atomic_t stop; + +void signalHandler( int signum ) { + cout << "Interrupt signal (" << signum << ") received, saving files and exiting.\n"; + stop = 1; +} + COutput::COutput(const CConfig *config, unsigned short ndim, bool fem_output): rank(SU2_MPI::GetRank()), size(SU2_MPI::GetSize()), @@ -843,6 +853,9 @@ void COutput::PrintConvergenceSummary(){ bool COutput::ConvergenceMonitoring(CConfig *config, unsigned long Iteration) { + /*--- Setup a signal handler for SIGTERM.---*/ + signal(SIGTERM, signalHandler); + convergence = true; for (auto iField_Conv = 0ul; iField_Conv < convFields.size(); iField_Conv++) { @@ -919,9 +932,13 @@ bool COutput::ConvergenceMonitoring(CConfig *config, unsigned long Iteration) { if (convFields.empty() || Iteration < config->GetStartConv_Iter()) convergence = false; + /*--- If a SIGTERM signal is sent to one of the processes, we set convergence to true ---*/ + if (stop == 1) convergence = true; + /*--- Apply the same convergence criteria to all processors. ---*/ unsigned short local = convergence, global = 0; + SU2_MPI::Allreduce(&local, &global, 1, MPI_UNSIGNED_SHORT, MPI_MAX, SU2_MPI::GetComm()); convergence = global > 0; From 213a9476f01488dfe1ad11819348a9eab9eb26eb Mon Sep 17 00:00:00 2001 From: Pedro Gomes Date: Sun, 15 Sep 2024 13:48:39 +0100 Subject: [PATCH 3/3] cleanup --- SU2_CFD/src/output/COutput.cpp | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/SU2_CFD/src/output/COutput.cpp b/SU2_CFD/src/output/COutput.cpp index 6afd642ec06..991ccb3408f 100644 --- a/SU2_CFD/src/output/COutput.cpp +++ b/SU2_CFD/src/output/COutput.cpp @@ -50,11 +50,13 @@ #include "../../include/output/filewriter/CSU2BinaryFileWriter.hpp" #include "../../include/output/filewriter/CSU2MeshFileWriter.hpp" -volatile sig_atomic_t stop; +namespace { +volatile sig_atomic_t STOP; -void signalHandler( int signum ) { - cout << "Interrupt signal (" << signum << ") received, saving files and exiting.\n"; - stop = 1; +void signalHandler(int signum) { + std::cout << "Interrupt signal (" << signum << ") received, saving files and exiting.\n"; + STOP = 1; +} } COutput::COutput(const CConfig *config, unsigned short ndim, bool fem_output): @@ -179,7 +181,11 @@ COutput::COutput(const CConfig *config, unsigned short ndim, bool fem_output): volumeDataSorter = nullptr; surfaceDataSorter = nullptr; - headerNeeded = false; + headerNeeded = false; + + /*--- Setup a signal handler for SIGTERM. ---*/ + + signal(SIGTERM, signalHandler); } COutput::~COutput() { @@ -243,7 +249,7 @@ void COutput::SetHistoryOutput(CGeometry ****geometry, CSolver *****solver, CCon if (config[ZONE_0]->GetMultizone_Problem()) Iter = OuterIter; - + /*--- Turbomachinery Performance Screen summary output---*/ if (Iter%100 == 0 && rank == MASTER_NODE) { SetTurboPerformance_Output(TurboPerf, config[val_iZone], TimeIter, OuterIter, InnerIter); @@ -881,9 +887,6 @@ void COutput::PrintConvergenceSummary(){ bool COutput::ConvergenceMonitoring(CConfig *config, unsigned long Iteration) { - /*--- Setup a signal handler for SIGTERM.---*/ - signal(SIGTERM, signalHandler); - convergence = true; for (auto iField_Conv = 0ul; iField_Conv < convFields.size(); iField_Conv++) { @@ -960,8 +963,8 @@ bool COutput::ConvergenceMonitoring(CConfig *config, unsigned long Iteration) { if (convFields.empty() || Iteration < config->GetStartConv_Iter()) convergence = false; - /*--- If a SIGTERM signal is sent to one of the processes, we set convergence to true ---*/ - if (stop == 1) convergence = true; + /*--- If a SIGTERM signal is sent to one of the processes, we set convergence to true. ---*/ + if (STOP) convergence = true; /*--- Apply the same convergence criteria to all processors. ---*/