From b3142ffb54f37895826e9e7fb0e41e465a73fe05 Mon Sep 17 00:00:00 2001
From: Andrew Heather <>
Date: Tue, 23 Mar 2021 20:28:22 +0000
Subject: [PATCH] ENH: runTimeControl - added option to trigger a fatal error
 on exit (#2042)

- useful when used in a batch process to trap the exit signal,
  e.g. stop the run when the velocity magnitude exceeds a given
  threshold:

    runTimeControl
    {
        type            runTimeControl;
        libs            ("libutilityFunctionObjects.so");
        nWriteStep      1;

        // Optional end 'action'
        satisfiedAction abort; // end; // setTrigger

        conditions
        {
            maxU
            {
                type            minMax;
                functionObject  MinMax;
                fields          ("max(mag(U))");
                value           1e6;
                mode            maximum;
            }
        }
    }
---
 .../utilities/runTimeControl/runTimeControl.C         | 11 ++++++++++-
 .../utilities/runTimeControl/runTimeControl.H         |  7 ++++---
 2 files changed, 14 insertions(+), 4 deletions(-)

diff --git a/src/functionObjects/utilities/runTimeControl/runTimeControl.C b/src/functionObjects/utilities/runTimeControl/runTimeControl.C
index 840ed4d9683..e300301664f 100644
--- a/src/functionObjects/utilities/runTimeControl/runTimeControl.C
+++ b/src/functionObjects/utilities/runTimeControl/runTimeControl.C
@@ -6,7 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2015 OpenFOAM Foundation
-    Copyright (C) 2015-2020 OpenCFD Ltd.
+    Copyright (C) 2015-2021 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -53,6 +53,7 @@ Foam::Enum
 >
 Foam::functionObjects::runTimeControls::runTimeControl::satisfiedActionNames
 {
+    { satisfiedAction::ABORT, "abort"},
     { satisfiedAction::END, "end"},
     { satisfiedAction::SET_TRIGGER, "setTrigger"},
 };
@@ -251,6 +252,7 @@ bool Foam::functionObjects::runTimeControls::runTimeControl::execute()
 
         switch (satisfiedAction_)
         {
+            case satisfiedAction::ABORT:
             case satisfiedAction::END:
             {
                 // Set to write a data dump or finalise the calculation
@@ -284,6 +286,13 @@ bool Foam::functionObjects::runTimeControls::runTimeControl::execute()
 
                     // Trigger any function objects
                     time.run();
+
+                    if (satisfiedAction_ == satisfiedAction::ABORT)
+                    {
+                        FatalErrorInFunction
+                            << "Abort triggered"
+                            << exit(FatalError);
+                    }
                 }
                 break;
             }
diff --git a/src/functionObjects/utilities/runTimeControl/runTimeControl.H b/src/functionObjects/utilities/runTimeControl/runTimeControl.H
index 3b014bf7c1f..66d09222ed4 100644
--- a/src/functionObjects/utilities/runTimeControl/runTimeControl.H
+++ b/src/functionObjects/utilities/runTimeControl/runTimeControl.H
@@ -6,7 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2015-2016 OpenFOAM Foundation
-    Copyright (C) 2016-2018 OpenCFD Ltd.
+    Copyright (C) 2016-2021 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -76,8 +76,9 @@ public:
 
         enum class satisfiedAction
         {
-            END,
-            SET_TRIGGER
+            ABORT,      //!< "abort" - write and emit a FatalError
+            END,        //!< "end" - write and exit cleanly
+            SET_TRIGGER //!< "setTrigger" - trigger another condition
         };
 
         static Enum<satisfiedAction> satisfiedActionNames;
-- 
GitLab