diff --git a/bin/foamCleanCase b/bin/foamCleanCase
new file mode 100755
index 0000000000..c2d5ab5caa
--- /dev/null
+++ b/bin/foamCleanCase
@@ -0,0 +1,84 @@
+#!/bin/sh
+#------------------------------------------------------------------------------
+# ========= |
+# \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+# \\ / O peration | Website: https://openfoam.org
+# \\ / A nd | Copyright (C) 2021 OpenFOAM Foundation
+# \\/ 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 .
+#
+# Script
+# foamCleanCase
+#
+# Description
+# Cleans an OpenFOAM case directory, resetting it to its initial state.
+# Executes a local Allclean script if it present, otherwise runs the
+# cleanCase function in bin/tools/CleanFunctions
+#
+#------------------------------------------------------------------------------
+
+# Source tutorial clean functions
+. "$WM_PROJECT_DIR/bin/tools/CleanFunctions"
+
+usage() {
+ cat< specify case directory (default = local dir)
+ -help | -h print the usage
+
+Cleans an OpenFOAM case directory, resetting it to its initial state.
+USAGE
+}
+
+error() {
+ exec 1>&2
+ while [ "$#" -ge 1 ]; do echo "$1"; shift; done
+ usage
+ exit 1
+}
+
+# Parse options
+while [ "$#" -gt 0 ]
+do
+ case "$1" in
+ -c | -case)
+ [ "$#" -ge 2 ] || error "'$1' option requires an argument"
+ cd "$2" 2>/dev/null || error "Case directory does not exist: '$2'"
+ shift 2
+ ;;
+ -h | -help)
+ usage && exit 0
+ ;;
+ *)
+ break
+ ;;
+ esac
+done
+
+[ $# -eq 0 ] || error "Incorrect arguments specified"
+
+foamListTimes >/dev/null 2>&1 || \
+ error "'$PWD' is not a valid case directory"
+
+[ -x Allclean ] && ./Allclean && \
+ echo "... using the local Allclean script" && exit 0
+cleanCase
+
+#------------------------------------------------------------------------------
diff --git a/bin/foamCleanTutorials b/bin/foamCleanTutorials
index 3d8b29e4bf..bad83ec260 100755
--- a/bin/foamCleanTutorials
+++ b/bin/foamCleanTutorials
@@ -39,11 +39,17 @@ Script=$0
usage() {
cat<
options:
-help | -h print the usage
-Helper script used by the Allclean scripts in the OpenFOAM tutorials
+Script to clean tutorial cases called by the Allclean scripts in the OpenFOAM
+tutorials. The script executes recursively on sub-directories to clean all
+cases. Recursive execution is disabled for the top level Allclean or Allwclean
+scripts by supplying a dummy argument when executing, e.g.
+
+./${0##*/} cases
+
USAGE
}
@@ -60,26 +66,28 @@ do
esac
done
-# If an argument is supplied do not execute ./Allwclean or ./Allclean
-# (to avoid recursion)
-if [ $# -eq 0 -a -f Allwclean ]
+# Specialised ./Allwclean script, do not execute if argument is supplied
+if [ $# -eq 0 ] && [ -f Allwclean ]
then
- # Specialised script
./Allwclean
-elif [ $# -eq 0 -a -f Allclean ]
+
+# Specialised ./Allclean script, do not execute if argument is supplied
+elif [ $# -eq 0 ] && [ -f Allclean ]
then
- # Specialised script
./Allclean
+
+# For a case directory without Allclean, use the cleanCase function
elif [ -d system ]
then
- # Normal case
cleanCase
+
+# For a code directory without Allwclean, use the cleanApplication function
elif [ -d Make ]
then
- # Normal application
cleanApplication
+
+# Otherwise loop over sub-directories and execute script within each one
else
- # Recurse into subdirectories
for caseName in *
do
( cd "$caseName" 2>/dev/null && $Script )