From c7b5f1e3ebab5075556bd60beefc991a58442d52 Mon Sep 17 00:00:00 2001 From: Mark Olesen Date: Thu, 9 Oct 2025 23:58:44 +0200 Subject: [PATCH] ENH: added clean up function remove0DirFields (RunFunctions) - less typing than before and avoids relying on bash-specific behaviour (fixes #3448) ENH: add -region support for cleanFaMesh and cleanPolyMesh CONFIG: add bash completion help for -area-region ENH: general improvements for regionProperties - robustness and failsafe for foamListRegions, regionProperties - additional global model switches for regionModels --- .../foamListRegions/foamListRegions.C | 113 ++++++++------ bin/foamCleanFaMesh | 138 ++++++++++++++++++ bin/foamCleanPolyMesh | 133 ++++++++++------- bin/tools/CleanFunctions | 100 ++++++++++--- bin/tools/RunFunctions | 59 ++++++++ etc/config.sh/bash_completion | 5 + src/meshTools/Make/files | 3 +- .../regionModelProperties.cxx | 49 +++++++ .../regionProperties/regionProperties.H | 36 ++++- ...egionProperties.C => regionProperties.cxx} | 27 ++++ .../2DImplicitCyclic/Allmesh | 5 +- .../externalCoupledHeater/Allrun.pre | 5 +- .../externalSolarLoad/Allrun.pre | 5 +- .../multiRegionHeater/Allrun.pre | 5 +- .../snappyMultiRegionHeater/Allrun-parallel | 5 +- .../snappyMultiRegionHeater/Allrun-serial | 5 +- .../snappyMultiRegionHeaterImplicit/Allrun | 5 +- .../solarBeamWithTrees/Allrun.pre | 5 +- .../externalCoupledHeater/Allrun.pre | 5 +- .../multiRegionHeaterRadiation/Allrun.pre | 5 +- 20 files changed, 571 insertions(+), 142 deletions(-) create mode 100755 bin/foamCleanFaMesh create mode 100644 src/meshTools/regionModel/regionProperties/regionModelProperties.cxx rename src/meshTools/regionModel/regionProperties/{regionProperties.C => regionProperties.cxx} (86%) diff --git a/applications/utilities/miscellaneous/foamListRegions/foamListRegions.C b/applications/utilities/miscellaneous/foamListRegions/foamListRegions.C index fa7ef04e77..4f655c23a8 100644 --- a/applications/utilities/miscellaneous/foamListRegions/foamListRegions.C +++ b/applications/utilities/miscellaneous/foamListRegions/foamListRegions.C @@ -30,7 +30,8 @@ Group grpPostProcessingUtilities Description - List regions from constant/regionProperties. + List volume regions from constant/regionProperties + or area regions from constant/finite-area/regionProperties Usage \b foamListRegions [OPTION] @@ -72,6 +73,12 @@ int main(int argc, char *argv[]) "List constant/finite-area/regionProperties (if available)" ); + argList::addBoolOption + ( + "optional", + "A missing regionProperties is not treated as an error" + ); + argList::addDryRunOption ( "Make reading optional and add verbosity" @@ -92,14 +99,20 @@ int main(int argc, char *argv[]) ++optVerbose; } + // File is optional, not an error + const bool isOptional = args.found("optional"); + // Use finite-area regions const bool doFiniteArea = args.found("finite-area"); + // The number of optional region filters to apply + const label nFilters = (args.size()-1); + IOobjectOption::readOption readOpt(IOobjectOption::MUST_READ); - if (dryRun || doFiniteArea) + if (dryRun || isOptional || doFiniteArea) { - // Always treat finite-area regionProperties as optional + // The finite-area regionProperties are also considered optional readOpt = IOobjectOption::READ_IF_PRESENT; } @@ -116,58 +129,70 @@ int main(int argc, char *argv[]) if (doFiniteArea) { regionProps = regionProperties(runTime, faMeshPrefix, readOpt); - - if (regionProps.empty()) - { - InfoErr<< "No finite-area region types" << nl; - } - else if (optVerbose) - { - InfoErr - << "Have " << regionProps.size() - << " finite-area region types, " - << regionProps.count() << " regions" << nl << nl; - } } else { regionProps = regionProperties(runTime, readOpt); - - if (regionProps.empty()) - { - // Probably only occurs with -dry-run option - InfoErr<< "No region types" << nl; - } - else if (optVerbose) - { - InfoErr - << "Have " << regionProps.size() << " region types, " - << regionProps.count() << " regions" << nl << nl; - } } - // We now handle checking args and general sanity etc. - wordList regionTypes; - - if (args.size() > 1) + // Some reporting... + if (regionProps.empty()) { - regionTypes.resize(args.size()-1); + if (doFiniteArea) + { + InfoErr<< "No finite-area region types" << nl; + } + else if (isOptional) + { + InfoErr<< "No region types" << nl; + } + } + else if (optVerbose) + { + InfoErr << "Have " << regionProps.size(); - // No duplicates + if (doFiniteArea) + { + InfoErr<< " finite-area"; + } + InfoErr + << " region types, " + << regionProps.count() << " regions" << nl << nl; + } + + + // We now handle checking args and general sanity etc. + + DynamicList regionTypes; + + if (isOptional && regionProps.empty()) + { + // Nothing to do... + } + else if (nFilters > 0) + { + // Apply region filters + + regionTypes.reserve_exact + ( + Foam::min(nFilters, regionProps.size()) + ); + + // No duplicates, and no duplicate warnings wordHashSet uniq; - label nTypes = 0; for (label argi = 1; argi < args.size(); ++argi) { - regionTypes[nTypes] = args[argi]; - - const word& regType = regionTypes[nTypes]; + word regType(args[argi]); if (uniq.insert(regType)) { if (regionProps.contains(regType)) { - ++nTypes; + if (!regionTypes.contains(regType)) + { + regionTypes.push_back(std::move(regType)); + } } else { @@ -175,22 +200,22 @@ int main(int argc, char *argv[]) } } } - - regionTypes.resize(nTypes); } else { + // Take all regions regionTypes = regionProps.sortedToc(); } for (const word& regionType : regionTypes) { - const wordList& regionNames = regionProps[regionType]; - - for (const word& regionName : regionNames) + if (const auto iter = regionProps.cfind(regionType); iter.good()) { - Info<< regionName << nl; + for (const word& regionName : iter.val()) + { + Info<< regionName << nl; + } } } diff --git a/bin/foamCleanFaMesh b/bin/foamCleanFaMesh new file mode 100755 index 0000000000..08359d082d --- /dev/null +++ b/bin/foamCleanFaMesh @@ -0,0 +1,138 @@ +#!/bin/sh +#------------------------------------------------------------------------------ +# ========= | +# \\ / F ield | OpenFOAM: The Open Source CFD Toolbox +# \\ / O peration | +# \\ / A nd | www.openfoam.com +# \\/ M anipulation | +#------------------------------------------------------------------------------- +# Copyright (C) 2011 OpenFOAM Foundation +# Copyright (C) 2025 OpenCFD Ltd. +#------------------------------------------------------------------------------ +# License +# This file is part of OpenFOAM, distributed under GPL-3.0-or-later. +# +# Script +# foamCleanFaMesh +# +# Description +# Remove the contents of the constant/finite-area/faMesh directory +# as per the Foam::faMesh::removeFiles() method. +# +#------------------------------------------------------------------------------ +usage() { + exec 1>&2 + while [ "$#" -ge 1 ]; do echo "$1"; shift; done + cat < case directory, default is the cwd + -area-region area-mesh region + -dry-run | -n report actions but do not remove + -help print the usage + +Remove the contents of the constant/finite-area/faMesh directory as per the +Foam::faMesh::removeFiles() method. + +USAGE + exit 1 +} + +#------------------------------------------------------------------------------ +# Parse options +unset caseDir areaRegion optDryRun + +while [ "$#" -gt 0 ] +do + case "$1" in + -h | -help*) + usage + ;; + -dry-run | -n) + optDryRun="(dry-run) " + ;; + + -case=*) + caseDir="${1#*=}" + ;; + + -case) + [ "$#" -ge 2 ] || usage "'$1' option requires an argument" + cd "$2" 2>/dev/null || usage "directory does not exist: '$2'" + caseDir=$2 + shift + ;; + + -area-region) + [ "$#" -ge 2 ] || usage "'$1' option requires an argument" + areaRegion=$2 + shift + ;; + + (*) + usage "unknown option/argument: '$*'" + ;; + esac + shift +done + +#------------------------------------------------------------------------------ + +# Remove files (mesh etc) +# also remove .gz versions of the same files + +removeFiles() +{ + local directory="$1" + + for i in \ + faceLabels \ + faBoundary \ + ; + do + if [ -n "$optDryRun" ] + then + echo "${optDryRun} rm -rf $directory/{$i,$i.gz}" + else + rm -rf -- "$directory/$i" "$directory/$i.gz" + fi + done +} + +#------------------------------------------------------------------------------ + +meshDir="constant/finite-area/${areaRegion}${areaRegion:+/}faMesh" + +if [ -d "$meshDir" ] +then + # [OK] has constant/finite-areaRegion//faMesh + : + +elif [ -n "$caseDir" ] +then + # Specified -case, so no extra magic... + echo "Error: no <$meshDir> in $caseDir" 1>&2 + exit 1 + +else + # Try some other combinations + other="${meshDir#constant/}" + + if [ -d "$other" ] + then + # Probably already within constant/ + meshDir="$other}" + elif [ "${PWD##*/}" = faMesh ] && [ -z "$areaRegion" ] + then + # Apparently already within faMesh/ + meshDir=. + fi +fi + + +echo "Cleaning ${caseDir:-.}/$meshDir" 1>&2 + +removeFiles "$meshDir" + +#------------------------------------------------------------------------------ diff --git a/bin/foamCleanPolyMesh b/bin/foamCleanPolyMesh index 5965c15bd5..b9a91400f2 100755 --- a/bin/foamCleanPolyMesh +++ b/bin/foamCleanPolyMesh @@ -7,7 +7,7 @@ # \\/ M anipulation | #------------------------------------------------------------------------------- # Copyright (C) 2011-2016 OpenFOAM Foundation -# Copyright (C) 2022 OpenCFD Ltd. +# Copyright (C) 2022,2025 OpenCFD Ltd. #------------------------------------------------------------------------------ # License # This file is part of OpenFOAM, distributed under GPL-3.0-or-later. @@ -27,9 +27,10 @@ usage() { Usage: ${0##*/} [OPTION] options: - -case specify alternative case directory, default is the cwd - -region specify alternative mesh region - -help print the usage + -case case directory, default is the cwd + -region mesh region + -dry-run | -n report actions but do not remove + -help print the usage Remove the contents of the constant/polyMesh directory as per the Foam::polyMesh::removeFiles() method. @@ -38,58 +39,101 @@ USAGE exit 1 } -unset caseDir regionName +#------------------------------------------------------------------------------ +# Parse options +unset caseDir regionName optDryRun -# Parse a single option while [ "$#" -gt 0 ] do case "$1" in -h | -help*) usage ;; + -dry-run | -n) + optDryRun="(dry-run) " + ;; + + -case=*) + caseDir="${1#*=}" + ;; + -case) + caseDir="$2" [ "$#" -ge 2 ] || usage "'$1' option requires an argument" cd "$2" 2>/dev/null || usage "directory does not exist: '$2'" caseDir=$2 - shift 2 + shift ;; + -region) [ "$#" -ge 2 ] || usage "'$1' option requires an argument" - regionName=$2 - shift 2 + regionName="$2" + shift ;; - *) + + (*) usage "unknown option/argument: '$*'" ;; esac + shift done -meshDir=polyMesh -if [ -n "$regionName" ] -then - meshDir="$regionName/$meshDir" -fi +#------------------------------------------------------------------------------ -# If -case was specified: insist upon 'constant/polyMesh' -if [ -n "$caseDir" ] +# Remove files (mesh itself, modifiers, snappyHexMesh ones) and subdirectories +# also remove .gz versions of the same files + +removeFiles() +{ + local directory="$1" + + for i in \ + points faces \ + owner neighbour \ + boundary \ + cells \ + cellZones faceZones pointZones \ + meshModifiers \ + parallelData \ + sets \ + cellLevel pointLevel \ + level0Edge \ + refinementHistory \ + surfaceIndex \ + ; + do + if [ -n "$optDryRun" ] + then + echo "${optDryRun} rm -rf $directory/{$i,$i.gz}" + else + rm -rf -- "$directory/$i" "$directory/$i.gz" + fi + done +} + +#------------------------------------------------------------------------------ + +meshDir="constant/${regionName}${regionName:+/}polyMesh" + +if [ -d "$meshDir" ] then - if [ -d constant/"$meshDir" ] - then - # Use constant/polyMesh - meshDir=constant/"$meshDir" - else - echo "Error: no 'constant/$meshDir' in $caseDir" 1>&2 - exit 1 - fi + # [OK] has constant//polyMesh + : + +elif [ -n "$caseDir" ] +then + # Specified -case, so no extra magic... + echo "Error: no <$meshDir> in $caseDir" 1>&2 + exit 1 + else - if [ -d constant/"$meshDir" ] + # Try some other combinations + other="${meshDir#constant/}" + + if [ -d "$other" ] then - # Use constant/polyMesh - meshDir=constant/"$meshDir" - elif [ -d "$meshDir" ] - then - # Likely already in constant/ - do not adjust anything - : + # Probably already within constant/ + meshDir="$other}" elif [ "${PWD##*/}" = polyMesh ] && [ -z "$regionName" ] then # Apparently already within polyMesh/ @@ -98,31 +142,8 @@ else fi -# Remove files (mesh itself, modifiers, snappyHexMesh ones) and subdirectories -# also remove .gz versions of the same files echo "Cleaning ${caseDir:-.}/$meshDir" 1>&2 -for i in \ - points \ - faces \ - owner \ - neighbour \ - cells \ - boundary \ - pointZones \ - faceZones \ - cellZones \ - meshModifiers \ - parallelData \ - sets \ - cellLevel \ - pointLevel \ - level0Edge \ - refinementHistory \ - surfaceIndex \ -; -do - rm -rf "$meshDir/$i" "$meshDir/$i.gz" -done +removeFiles "$meshDir" #------------------------------------------------------------------------------ diff --git a/bin/tools/CleanFunctions b/bin/tools/CleanFunctions index ae434a5ef0..11657af980 100644 --- a/bin/tools/CleanFunctions +++ b/bin/tools/CleanFunctions @@ -108,54 +108,116 @@ cleanPostProcessing() } +# --------------- +# Remove constant/finite-area/faMesh or constant/finite-area/{region}/faMesh +# +# Accepts following options: +# -region The region name +# -- End of options +# --------------- cleanFaMesh() { - if [ -e constant/finite-area/faMesh ] + local region + + # Parse options + while [ "$#" -gt 0 ] + do + case "$1" in + ('') ;; # Ignore empty option + (--) shift; break ;; # Stop option parsing + + (-region) region="$2"; shift ;; + (*) break ;; + esac + shift + done + + # safety + if [ "$region" = "--" ]; then unset region; fi + + local meshDir="constant/finite-area/${region}${region:+/}faMesh" + + if [ -e "$meshDir" ] then - rm -rf constant/finite-area/faMesh + [ -n "$region" ] && echo "Clearing $meshDir" 1>&2 + rm -rf -- "$meshDir" fi - if [ -e constant/faMesh ] + + # Legacy location + # - may still have remnant + + meshDir="constant/faMesh" + if [ -e "$meshDir" ] && [ -z "$region" ] then - if [ -e constant/faMesh/faMeshDefinition ] + if [ -e "$meshDir"/faMeshDefinition ] then - # Old constant/faMesh location for faMeshDefinition still in use: - # - warn but don't remove anything + # VERY OLD LOCATION echo - echo "Warning: not removing constant/faMesh/" + echo "WARNING: not removing $meshDir/" echo " It contains a 'faMeshDefinition' file" - echo " Please relocate file(s) to system/ !!" + echo " Please relocate file(s) to system/finite-area/ !!" echo else # Can remove constant/faMesh/ entirely (no faMeshDefinition) - rm -rf constant/faMesh + echo "Clearing $meshDir" 1>&2 + rm -rf -- "$meshDir" fi fi } +# --------------- +# Remove constant/polyMesh or constant//polyMesh +# +# Accepts following options: +# -region The region name +# -- End of options +# --------------- cleanPolyMesh() { - if [ -e constant/polyMesh ] + local region + + # Parse options + while [ "$#" -gt 0 ] + do + case "$1" in + ('') ;; # Ignore empty option + (--) shift; break ;; # Stop option parsing + + (-region) region="$2"; shift ;; + (*) break ;; + esac + shift + done + + # safety + if [ "$region" = "--" ]; then unset region; fi + + local meshDir="constant/${region}${region:+/}polyMesh" + + if [ -e "$meshDir" ] then - if [ -e constant/polyMesh/blockMeshDict ] \ - || [ -e constant/polyMesh/blockMeshDict.m4 ] + [ -n "$region" ] && echo "Clearing $meshDir" 1>&2 + + if [ -e "$meshDir"/blockMeshDict ] \ + || [ -e "$meshDir"/blockMeshDict.m4 ] then - # Old constant/polyMesh location for blockMeshDict still in use: - # - warn but don't remove anything + # VERY OLD LOCATION echo - echo "Warning: not removing constant/polyMesh/" + echo "WARNING: not removing $meshDir/" echo " It contains a 'blockMeshDict' or 'blockMeshDict.m4' file" echo " Please relocate file(s) to system/ !!" echo else # Can remove constant/polyMesh/ entirely (no blockMeshDict) - rm -rf constant/polyMesh + rm -rf -- "$meshDir" fi fi - if [ -e system/blockMeshDict.m4 ] + meshDir="system${region:+/}${region}" + if [ -e "$meshDir"/blockMeshDict.m4 ] then - rm -f system/blockMeshDict + rm -f -- "$meshDir"/blockMeshDict fi } @@ -212,7 +274,7 @@ cleanCase0() removeCase() { echo "Removing case ${1:-unknown}" - [ "$#" -ge 1 ] && rm -rf "$1" + [ "$#" -ge 1 ] && rm -rf -- "$1" } diff --git a/bin/tools/RunFunctions b/bin/tools/RunFunctions index 249d1894cf..62f3090af4 100644 --- a/bin/tools/RunFunctions +++ b/bin/tools/RunFunctions @@ -517,9 +517,11 @@ cloneParallelCase() } +# --------------- # If 0.orig/ exists, copy (overwrite) into 0/ [ie, serial case] # * -processor : copy into processor directories instead # * -all : copy into serial and processor directories +# --------------- restore0Dir() { if [ ! -d 0.orig ] @@ -553,4 +555,61 @@ restore0Dir() } +# --------------- +# Helper routine to remove specified fields from the 0/ directory. +# Often used in combination with foamListRegions. +# +# Accepts following options: +# -region The region name +# -- End of options +# +# any remaining parameters are taken to be fields names +# --------------- +remove0DirFields() +{ + local region + + # Parse options + while [ "$#" -gt 0 ] + do + case "$1" in + ('') ;; # Ignore empty option + (--) shift; break ;; # Stop option parsing + + (-region) region="$2"; shift ;; + (*) break ;; + esac + shift + done + + # safety + if [ "$region" = "--" ]; then unset region; fi + + if [ "$#" -eq 0 ] + then + echo "No fields specified for ${region:+region=$region }" 1>&2 + return 0 + fi + + echo "Remove 0/ fields${region:+ [$region]} : $@" 1>&2 + + local subdir + for subdir in 0/"$region" processor*/0/"$region" + do + if [ -d "$subdir" ] + then + for field in $@ ## unquoted for IFS splitting [SIC] + do + # Cautious with removal + if [ -f "$subdir/$field" ] + then + rm -f -- "$subdir/$field" + fi + done + fi + done + return 0 +} + + #------------------------------------------------------------------------------ diff --git a/etc/config.sh/bash_completion b/etc/config.sh/bash_completion index 8134ad7204..6fe671bbb5 100644 --- a/etc/config.sh/bash_completion +++ b/etc/config.sh/bash_completion @@ -140,6 +140,11 @@ _of_complete_() # Could use "foamListTimes -withZero", but still doesn't address ranges COMPREPLY=($(compgen -d -X '![-0-9]*' -- ${cur})) ;; + -area-region) + # Or: $(find system/finite-area -mindepth 1 -maxdepth 1 -type d 2>/dev/null | sed -e 's%.*/%%') + choices=$(\ls -d system/finite-area/*/ 2>/dev/null | sed -e 's%/$%%; s%^.*/%%') + COMPREPLY=($(compgen -W "$choices" -- ${cur})) + ;; -region) # Or: $(find system -mindepth 1 -maxdepth 1 -type d 2>/dev/null | sed -e 's%.*/%%') choices=$(\ls -d system/*/ 2>/dev/null | sed -e 's%/$%%; s%^.*/%%') diff --git a/src/meshTools/Make/files b/src/meshTools/Make/files index 1e6d481bd0..6a0eb78d80 100644 --- a/src/meshTools/Make/files +++ b/src/meshTools/Make/files @@ -351,7 +351,8 @@ $(vtk)/topoSet/foamVtkWriteFaceSet.C $(vtk)/topoSet/foamVtkWritePointSet.C $(vtk)/topoSet/foamVtkWriteCellSetFaces.C -regionModel/regionProperties/regionProperties.C +regionModel/regionProperties/regionProperties.cxx +regionModel/regionProperties/regionModelProperties.cxx tetOverlapVolume/tetOverlapVolume.C diff --git a/src/meshTools/regionModel/regionProperties/regionModelProperties.cxx b/src/meshTools/regionModel/regionProperties/regionModelProperties.cxx new file mode 100644 index 0000000000..7b83ef5071 --- /dev/null +++ b/src/meshTools/regionModel/regionProperties/regionModelProperties.cxx @@ -0,0 +1,49 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | www.openfoam.com + \\/ M anipulation | +------------------------------------------------------------------------------- + Copyright (C) 2025 OpenCFD Ltd. +------------------------------------------------------------------------------- +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 . + +\*---------------------------------------------------------------------------*/ + +#include "regionProperties.H" + +// * * * * * * * * * * * * * * * Global Functions * * * * * * * * * * * * * // + +// The enable/disable flag for allowFaModels() +static bool allowFaModels_ = true; + +bool Foam::regionModels::allowFaModels() noexcept +{ + return allowFaModels_; +} + + +bool Foam::regionModels::allowFaModels(bool on) noexcept +{ + bool old(allowFaModels_); + allowFaModels_ = on; + return old; +} + + +// ************************************************************************* // diff --git a/src/meshTools/regionModel/regionProperties/regionProperties.H b/src/meshTools/regionModel/regionProperties/regionProperties.H index 8669b18330..9198f930e6 100644 --- a/src/meshTools/regionModel/regionProperties/regionProperties.H +++ b/src/meshTools/regionModel/regionProperties/regionProperties.H @@ -46,18 +46,39 @@ Description \endverbatim SourceFiles - regionProperties.C + regionProperties.cxx + regionModelProperties.cxx \*---------------------------------------------------------------------------*/ #ifndef Foam_regionProperties_H #define Foam_regionProperties_H -#include "HashTable.H" #include "fileName.H" #include "wordList.H" +#include "HashTable.H" #include "IOobjectOption.H" +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +// General controls + +namespace Foam +{ +namespace regionModels +{ + +//- The enable/disable state for regionFaModel (default: true) +bool allowFaModels() noexcept; + +//- Set enable/disable state for regionFaModel +// \return previous state +bool allowFaModels(bool on) noexcept; + +} // End namespace regionModels +} // End namespace Foam + + // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // namespace Foam @@ -119,6 +140,17 @@ public: ~regionProperties() = default; + // Static Member Functions + + //- The expected search path (eg, constant/regionProperties). + // Can be useful when generation error messages + static fileName objectRelPath + ( + const Time& runTime, + const fileName& local = fileName::null + ); + + // Member Functions //- Total count of all region names. diff --git a/src/meshTools/regionModel/regionProperties/regionProperties.C b/src/meshTools/regionModel/regionProperties/regionProperties.cxx similarity index 86% rename from src/meshTools/regionModel/regionProperties/regionProperties.C rename to src/meshTools/regionModel/regionProperties/regionProperties.cxx index 2e3f897080..76933507fb 100644 --- a/src/meshTools/regionModel/regionProperties/regionProperties.C +++ b/src/meshTools/regionModel/regionProperties/regionProperties.cxx @@ -31,6 +31,21 @@ License #include "Time.H" #include "wordRes.H" +// * * * * * * * * * * * * * Static Member Functions * * * * * * * * * * * * // + +Foam::fileName Foam::regionProperties::objectRelPath +( + const Time& runTime, + const fileName& local +) +{ + return + ( + runTime.time().constant()/local/"regionProperties" + ); +} + + // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // Foam::regionProperties::regionProperties @@ -56,6 +71,18 @@ Foam::regionProperties::regionProperties ) ); + // For optional reading: + // - applies to the file and its overall contents. + // - if read and has content, "regions" becomes mandatory + + if (IOobjectOption::isReadOptional(rOpt)) + { + if (iodict.hasHeaderClass() && !iodict.empty()) + { + rOpt = IOobjectOption::MUST_READ; + } + } + iodict.readEntry("regions", props, keyType::LITERAL, rOpt); } diff --git a/tutorials/basic/chtMultiRegionFoam/2DImplicitCyclic/Allmesh b/tutorials/basic/chtMultiRegionFoam/2DImplicitCyclic/Allmesh index ca9d4f3653..9722728e02 100755 --- a/tutorials/basic/chtMultiRegionFoam/2DImplicitCyclic/Allmesh +++ b/tutorials/basic/chtMultiRegionFoam/2DImplicitCyclic/Allmesh @@ -13,10 +13,11 @@ restore0Dir runApplication splitMeshRegions -cellZones -overwrite # Remove fluid fields from solid regions (important for post-processing) +fields="nut alphat epsilon k U p_rgh" + for region in $(foamListRegions solid) do - rm -f 0/$region/{nut,alphat,epsilon,k,U,p_rgh} - rm -f processor*/0/$region/{nut,alphat,epsilon,k,U,p_rgh} + remove0DirFields -region "$region" -- $fields done for region in $(foamListRegions) diff --git a/tutorials/heatTransfer/chtMultiRegionFoam/externalCoupledHeater/Allrun.pre b/tutorials/heatTransfer/chtMultiRegionFoam/externalCoupledHeater/Allrun.pre index 01b40e1149..65876c828d 100755 --- a/tutorials/heatTransfer/chtMultiRegionFoam/externalCoupledHeater/Allrun.pre +++ b/tutorials/heatTransfer/chtMultiRegionFoam/externalCoupledHeater/Allrun.pre @@ -12,10 +12,11 @@ restore0Dir runApplication splitMeshRegions -cellZones -overwrite # Remove fluid fields from solid regions (important for post-processing) +fields="nut alphat epsilon k U p_rgh" + for region in $(foamListRegions solid) do - rm -f 0/$region/{nut,alphat,epsilon,k,U,p_rgh} - rm -f processor*/0/$region/{nut,alphat,epsilon,k,U,p_rgh} + remove0DirFields -region "$region" -- $fields done for region in $(foamListRegions) diff --git a/tutorials/heatTransfer/chtMultiRegionFoam/externalSolarLoad/Allrun.pre b/tutorials/heatTransfer/chtMultiRegionFoam/externalSolarLoad/Allrun.pre index 3f6ac68313..7b9aff8280 100755 --- a/tutorials/heatTransfer/chtMultiRegionFoam/externalSolarLoad/Allrun.pre +++ b/tutorials/heatTransfer/chtMultiRegionFoam/externalSolarLoad/Allrun.pre @@ -11,10 +11,11 @@ runApplication splitMeshRegions -cellZones -overwrite rm -rf 0/domain3 constant/domain3 system/domain3 # Remove fluid fields from solid regions (important for post-processing) +fields="rho nut alphat epsilon k U p_rgh qr G IDefault" + for region in $(foamListRegions solid) do - rm -f 0/$region/{rho,nut,alphat,epsilon,k,U,p_rgh,qr,G,IDefault} - rm -f processor*/0/$region/{rho,nut,alphat,epsilon,k,U,p_rgh,qr,G,IDefault} + remove0DirFields -region "$region" -- $fields done # Set the initial fields diff --git a/tutorials/heatTransfer/chtMultiRegionFoam/multiRegionHeater/Allrun.pre b/tutorials/heatTransfer/chtMultiRegionFoam/multiRegionHeater/Allrun.pre index 6e57095006..a8dd4562c1 100755 --- a/tutorials/heatTransfer/chtMultiRegionFoam/multiRegionHeater/Allrun.pre +++ b/tutorials/heatTransfer/chtMultiRegionFoam/multiRegionHeater/Allrun.pre @@ -12,10 +12,11 @@ restore0Dir runApplication splitMeshRegions -cellZones -overwrite # Remove fluid fields from solid regions (important for post-processing) +fields="nut alphat epsilon k U p_rgh" + for region in $(foamListRegions solid) do - rm -f 0/$region/{nut,alphat,epsilon,k,U,p_rgh} - rm -f processor*/0/$region/{nut,alphat,epsilon,k,U,p_rgh} + remove0DirFields -region "$region" -- $fields done for region in $(foamListRegions) diff --git a/tutorials/heatTransfer/chtMultiRegionFoam/snappyMultiRegionHeater/Allrun-parallel b/tutorials/heatTransfer/chtMultiRegionFoam/snappyMultiRegionHeater/Allrun-parallel index d7b78bfb03..44933da0fc 100755 --- a/tutorials/heatTransfer/chtMultiRegionFoam/snappyMultiRegionHeater/Allrun-parallel +++ b/tutorials/heatTransfer/chtMultiRegionFoam/snappyMultiRegionHeater/Allrun-parallel @@ -26,10 +26,11 @@ restore0Dir -processor runParallel $decompDict splitMeshRegions -cellZones -overwrite # Remove fluid fields from solid regions (important for post-processing) +fields="nut alphat epsilon k U p_rgh" + for region in $(foamListRegions solid) do - rm -f 0/"$region"/{nut,alphat,epsilon,k,U,p_rgh} - rm -f processor*/0/"$region"/{nut,alphat,epsilon,k,U,p_rgh} + remove0DirFields -region "$region" -- $fields done for region in $(foamListRegions) diff --git a/tutorials/heatTransfer/chtMultiRegionFoam/snappyMultiRegionHeater/Allrun-serial b/tutorials/heatTransfer/chtMultiRegionFoam/snappyMultiRegionHeater/Allrun-serial index de426ea49d..19c03b4a7d 100755 --- a/tutorials/heatTransfer/chtMultiRegionFoam/snappyMultiRegionHeater/Allrun-serial +++ b/tutorials/heatTransfer/chtMultiRegionFoam/snappyMultiRegionHeater/Allrun-serial @@ -21,10 +21,11 @@ restore0Dir runApplication splitMeshRegions -cellZones -overwrite # Remove fluid fields from solid regions (important for post-processing) +fields="nut alphat epsilon k U p_rgh" + for region in $(foamListRegions solid) do - rm -f 0/"$region"/{nut,alphat,epsilon,k,U,p_rgh} - rm -f processor*/0/"$region"/{nut,alphat,epsilon,k,U,p_rgh} + remove0DirFields -region "$region" -- $fields done for region in $(foamListRegions) diff --git a/tutorials/heatTransfer/chtMultiRegionFoam/snappyMultiRegionHeaterImplicit/Allrun b/tutorials/heatTransfer/chtMultiRegionFoam/snappyMultiRegionHeaterImplicit/Allrun index 0e3d605ef8..d50e65532d 100755 --- a/tutorials/heatTransfer/chtMultiRegionFoam/snappyMultiRegionHeaterImplicit/Allrun +++ b/tutorials/heatTransfer/chtMultiRegionFoam/snappyMultiRegionHeaterImplicit/Allrun @@ -32,10 +32,11 @@ restore0Dir -processor runParallel $decompDict splitMeshRegions -cellZones -overwrite # Remove fluid fields from solid regions (important for post-processing) +fields="nut alphat epsilon k U p_rgh" + for region in $(foamListRegions solid) do - rm -f 0/$region/{nut,alphat,epsilon,k,U,p_rgh} - rm -f processor*/0/$region/{nut,alphat,epsilon,k,U,p_rgh} + remove0DirFields -region "$region" -- $fields done for region in $(foamListRegions) diff --git a/tutorials/heatTransfer/chtMultiRegionFoam/solarBeamWithTrees/Allrun.pre b/tutorials/heatTransfer/chtMultiRegionFoam/solarBeamWithTrees/Allrun.pre index 1ca5a5bad8..d09ba74967 100755 --- a/tutorials/heatTransfer/chtMultiRegionFoam/solarBeamWithTrees/Allrun.pre +++ b/tutorials/heatTransfer/chtMultiRegionFoam/solarBeamWithTrees/Allrun.pre @@ -13,10 +13,11 @@ runApplication splitMeshRegions -cellZones -overwrite rm -rf 0/domain3 constant/domain3 system/domain3 # Remove fluid fields from solid regions (important for post-processing) +fields="rho nut alphat epsilon k U p_rgh qr G IDefault" + for region in $(foamListRegions solid) do - rm -f 0/"$region"/{rho,nut,alphat,epsilon,k,U,p_rgh,qr,G,IDefault} - rm -f processor*/0/"$region"/{rho,nut,alphat,epsilon,k,U,p_rgh,qr,G,IDefault} + remove0DirFields -region "$region" -- $fields done # Set the initial fields diff --git a/tutorials/heatTransfer/chtMultiRegionSimpleFoam/externalCoupledHeater/Allrun.pre b/tutorials/heatTransfer/chtMultiRegionSimpleFoam/externalCoupledHeater/Allrun.pre index ee6ca23a66..50391a329b 100755 --- a/tutorials/heatTransfer/chtMultiRegionSimpleFoam/externalCoupledHeater/Allrun.pre +++ b/tutorials/heatTransfer/chtMultiRegionSimpleFoam/externalCoupledHeater/Allrun.pre @@ -13,10 +13,11 @@ restore0Dir runApplication splitMeshRegions -cellZones -overwrite # Remove fluid fields from solid regions (important for post-processing) +fields="nut alphat epsilon k U p_rgh" + for region in $(foamListRegions solid) do - rm -f 0/"$region"/{nut,alphat,epsilon,k,U,p_rgh} - rm -f processor*/0/"$region"/{nut,alphat,epsilon,k,U,p_rgh} + remove0DirFields -region "$region" -- $fields done for region in $(foamListRegions) diff --git a/tutorials/heatTransfer/chtMultiRegionSimpleFoam/multiRegionHeaterRadiation/Allrun.pre b/tutorials/heatTransfer/chtMultiRegionSimpleFoam/multiRegionHeaterRadiation/Allrun.pre index b5fa7348a8..594f0507e6 100755 --- a/tutorials/heatTransfer/chtMultiRegionSimpleFoam/multiRegionHeaterRadiation/Allrun.pre +++ b/tutorials/heatTransfer/chtMultiRegionSimpleFoam/multiRegionHeaterRadiation/Allrun.pre @@ -13,10 +13,11 @@ restore0Dir runApplication splitMeshRegions -cellZones -overwrite # Remove fluid fields from solid regions (important for post-processing) +fields="rho nut alphat epsilon k U p_rgh qr G IDefault" + for region in $(foamListRegions solid) do - rm -f 0/"$region"/{rho,nut,alphat,epsilon,k,U,p_rgh,qr,G,IDefault} - rm -f processor*/0/"$region"/{rho,nut,alphat,epsilon,k,U,p_rgh,qr,G,IDefault} + remove0DirFields -region "$region" -- $fields done for region in $(foamListRegions)