From 57f750cc5561d3c22a2fc0c9a2a151e079380e99 Mon Sep 17 00:00:00 2001
From: Mark Olesen <Mark.Olesen@esi-group.com>
Date: Tue, 28 Nov 2017 09:57:18 +0100
Subject: [PATCH] ENH: add simple subLoopTime

- similar idea as subCycleTime but without sub-dividing the time
  interval or incrementing time itself
---
 src/OpenFOAM/Make/files            |   1 +
 src/OpenFOAM/db/Time/subLoopTime.C |  85 ++++++++++++++++++
 src/OpenFOAM/db/Time/subLoopTime.H | 137 +++++++++++++++++++++++++++++
 3 files changed, 223 insertions(+)
 create mode 100644 src/OpenFOAM/db/Time/subLoopTime.C
 create mode 100644 src/OpenFOAM/db/Time/subLoopTime.H

diff --git a/src/OpenFOAM/Make/files b/src/OpenFOAM/Make/files
index 29d6eee577d..5d2dc3f1788 100644
--- a/src/OpenFOAM/Make/files
+++ b/src/OpenFOAM/Make/files
@@ -284,6 +284,7 @@ $(Time)/Time.C
 $(Time)/TimeIO.C
 $(Time)/findTimes.C
 $(Time)/subCycleTime.C
+$(Time)/subLoopTime.C
 $(Time)/findInstance.C
 $(Time)/timeSelector.C
 
diff --git a/src/OpenFOAM/db/Time/subLoopTime.C b/src/OpenFOAM/db/Time/subLoopTime.C
new file mode 100644
index 00000000000..5d6d8a85859
--- /dev/null
+++ b/src/OpenFOAM/db/Time/subLoopTime.C
@@ -0,0 +1,85 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2017 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+\*---------------------------------------------------------------------------*/
+
+#include "subLoopTime.H"
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+Foam::subLoopTime::subLoopTime(Time& runTime, const label nCycles)
+:
+    time_(runTime),
+    index_(0),
+    total_(nCycles)
+{}
+
+
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
+
+Foam::subLoopTime::~subLoopTime()
+{
+    stop();
+}
+
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+bool Foam::subLoopTime::status() const
+{
+    return (index_ < total_);
+}
+
+
+void Foam::subLoopTime::stop()
+{
+    // If called manually, ensure status() will return false
+    index_ = total_ + 1;
+}
+
+
+bool Foam::subLoopTime::loop()
+{
+    const bool active = (index_ < total_);   // as per status()
+
+    if (active)
+    {
+        operator++();
+    }
+    else if (index_)
+    {
+        // Not active, the loop condition has now exiting on the last subloop
+    }
+
+    return active;
+}
+
+
+Foam::subLoopTime& Foam::subLoopTime::operator++()
+{
+    ++index_;
+    return *this;
+}
+
+
+// ************************************************************************* //
diff --git a/src/OpenFOAM/db/Time/subLoopTime.H b/src/OpenFOAM/db/Time/subLoopTime.H
new file mode 100644
index 00000000000..c8deb680e88
--- /dev/null
+++ b/src/OpenFOAM/db/Time/subLoopTime.H
@@ -0,0 +1,137 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2017 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+Class
+    Foam::subLoopTime
+
+Description
+    A class for managing sub-loops referencing Time.
+
+SourceFiles
+    subLoopTime.C
+
+SeeAlso
+    subCycleTime
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef subLoopTime_H
+#define subLoopTime_H
+
+#include "Time.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+/*---------------------------------------------------------------------------*\
+                         Class subLoopTime Declaration
+\*---------------------------------------------------------------------------*/
+
+class subLoopTime
+{
+    // Private Member Functions
+
+        //- Disallow default bitwise copy construct
+        subLoopTime(const subLoopTime&) = delete;
+
+        //- Disallow default bitwise assignment
+        void operator=(const subLoopTime&) = delete;
+
+
+protected:
+
+    // Protected data
+
+        Time& time_;
+
+        //- The current sub-cycle index
+        label index_;
+
+        //- The total number of cycles in the sub-cycle
+        label total_;
+
+
+public:
+
+    // Constructors
+
+        //- Construct from time with fixed number of cycles
+        //  \param runTime  the top-level time
+        //  \param nCycles  the number of times to loop
+        subLoopTime(Time& runTime, const label nCycles);
+
+
+    //- Destructor
+    ~subLoopTime();
+
+
+    // Member Functions
+
+        //- The current cycle index
+        inline label index() const
+        {
+            return index_;
+        }
+
+        //- The total number of cycles
+        inline label nCycles() const
+        {
+            return total_;
+        }
+
+        //- Return true if looping is active
+        bool status() const;
+
+        //- Force terminate the loop
+        void stop();
+
+        //- True if looping is active, increments the index.
+        //  Example usage,
+        //  \code
+        //      while (control.loop())
+        //      {
+        //          solve;
+        //      }
+        //  \endcode
+        bool loop();
+
+
+    // Member Operators
+
+        //- Prefix increment
+        subLoopTime& operator++();
+
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
-- 
GitLab