From df74e8448ccac53b3bb832db27ee2de535885e58 Mon Sep 17 00:00:00 2001 From: Mark Olesen Date: Fri, 4 Dec 2020 21:33:50 +0100 Subject: [PATCH] ENH: robuster fileOperations splitProcessorPath - robuster matching behaviour when encountering paths that themselves contain the word "processor" in them. For example, "/path/processor0generation2/case1/processor10/system" will now correctly match on processor10 instead of failing. - use procRangeType for encapsulating the processor ranges - provision for information of distributed vs non-distributed roots. The information is currently available from the initial setup, but can useful to access directly within fileOperation. STYLE: modernize list iteration --- applications/test/fileOperation1/Make/files | 3 + applications/test/fileOperation1/Make/options | 2 + .../test/fileOperation1/Test-fileOperation1.C | 125 +++++ .../foamListTimes/foamListTimes.C | 9 +- .../foamRestoreFields/foamRestoreFields.C | 17 +- .../decomposePar/decomposePar.C | 31 +- .../profilingSummary/profilingSummary.C | 10 +- .../collatedFileOperation/OFstreamCollator.C | 4 +- .../collatedFileOperation.C | 22 +- .../fileOperation/fileOperation.C | 427 ++++++++++++------ .../fileOperation/fileOperation.H | 55 ++- .../masterUncollatedFileOperation.C | 45 +- .../uncollatedFileOperation.C | 31 +- .../uncollatedFileOperation.H | 4 +- 14 files changed, 521 insertions(+), 264 deletions(-) create mode 100644 applications/test/fileOperation1/Make/files create mode 100644 applications/test/fileOperation1/Make/options create mode 100644 applications/test/fileOperation1/Test-fileOperation1.C diff --git a/applications/test/fileOperation1/Make/files b/applications/test/fileOperation1/Make/files new file mode 100644 index 0000000000..3f4a231f16 --- /dev/null +++ b/applications/test/fileOperation1/Make/files @@ -0,0 +1,3 @@ +Test-fileOperation1.C + +EXE = $(FOAM_USER_APPBIN)/Test-fileOperation1 diff --git a/applications/test/fileOperation1/Make/options b/applications/test/fileOperation1/Make/options new file mode 100644 index 0000000000..18e6fe47af --- /dev/null +++ b/applications/test/fileOperation1/Make/options @@ -0,0 +1,2 @@ +/* EXE_INC = */ +/* EXE_LIBS = */ diff --git a/applications/test/fileOperation1/Test-fileOperation1.C b/applications/test/fileOperation1/Test-fileOperation1.C new file mode 100644 index 0000000000..be4480d12e --- /dev/null +++ b/applications/test/fileOperation1/Test-fileOperation1.C @@ -0,0 +1,125 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | www.openfoam.com + \\/ M anipulation | +------------------------------------------------------------------------------- + Copyright (C) 2020 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 . + +Application + Test-fileOperation1 + +Description + Test string parsing and other bits for fileOperation + +\*---------------------------------------------------------------------------*/ + +#include "argList.H" +#include "fileName.H" +#include "fileOperation.H" +#include "SubList.H" +#include "IOobject.H" +#include "IOstreams.H" +#include "OSspecific.H" + + +using namespace Foam; + +word toString(const fileOperation::procRangeType& group) +{ + if (group.empty()) + { + return word::null; + } + return Foam::name(group.first()) + "-" + Foam::name(group.last()); +} + + +void testSplitPath(const fileName& pathName) +{ + fileName path, procDir, local; + fileOperation::procRangeType group; + label nProcs; + + const label proci = + fileOperation::splitProcessorPath + ( + pathName, + path, + procDir, + local, + group, + nProcs + ); + + + Info<< nl + << "Input = " << pathName << nl + << " path = " << path << nl + << " proc = " << procDir << nl + << " local = " << local << nl + << " group = " << group << " = " << toString(group) << nl + << " proci = " << proci << nl + << " nProcs = " << nProcs << nl; +} + + +void testSplitPaths(std::initializer_list dirNames) +{ + for (const auto& dirName : dirNames) + { + testSplitPath(fileName(dirName)); + } +} + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // +// Main program: + +int main(int argc, char *argv[]) +{ + argList::addArgument("fileName .. fileNameN"); + argList::addOption("istream", "file", "test Istream values"); + + + testSplitPaths + ({ + "foo/bar", + "foo/processor5/system", + "foo/processors100_0-5/constant", + "foo/processors20_12-16/constant", + "/new-processor-gen/case1/processors20", + "/new-processor-gen/case1/processors100_0-5/constant", + "/new-processor-gen/case1/processors/input", + "devel/processor/ideas/processor0/system", + + "/path/processor0Generation1/case1/processor10/input", + + "path/processors100_ab-cd/constant", + "path/processors100_a11-d00/constant", + }); + + + Info<< "\nEnd\n" << endl; + return 0; +} + + +// ************************************************************************* // diff --git a/applications/utilities/miscellaneous/foamListTimes/foamListTimes.C b/applications/utilities/miscellaneous/foamListTimes/foamListTimes.C index d7469d9f05..82d78c654d 100644 --- a/applications/utilities/miscellaneous/foamListTimes/foamListTimes.C +++ b/applications/utilities/miscellaneous/foamListTimes/foamListTimes.C @@ -66,19 +66,14 @@ using namespace Foam; // Many ways to name processor directories // // Uncollated | "processor0", "processor1" ... -// Collated (old) | "processors" -// Collated (new) | "processors" +// Collated | "processors" // Host collated | "processors_-" const regExp matcher("processors?[0-9]+(_[0-9]+-[0-9]+)?"); bool isProcessorDir(const string& dir) { - return - ( - dir.starts_with("processor") - && (dir == "processors" || matcher.match(dir)) - ); + return (dir.starts_with("processor") && matcher.match(dir)); } diff --git a/applications/utilities/miscellaneous/foamRestoreFields/foamRestoreFields.C b/applications/utilities/miscellaneous/foamRestoreFields/foamRestoreFields.C index 45235ea0d5..03518dcc0c 100644 --- a/applications/utilities/miscellaneous/foamRestoreFields/foamRestoreFields.C +++ b/applications/utilities/miscellaneous/foamRestoreFields/foamRestoreFields.C @@ -71,19 +71,14 @@ using namespace Foam; // Many ways to name processor directories // // Uncollated | "processor0", "processor1" ... -// Collated (old) | "processors" -// Collated (new) | "processors" +// Collated | "processors" // Host collated | "processors_-" const regExp matcher("processors?[0-9]+(_[0-9]+-[0-9]+)?"); bool isProcessorDir(const string& dir) { - return - ( - dir.starts_with("processor") - && (dir == "processors" || matcher.match(dir)) - ); + return (dir.starts_with("processor") && matcher.match(dir)); } @@ -384,13 +379,7 @@ int main(int argc, char *argv[]) { if (leadProcIdx < 0) { - // Collated (old) - leadProcIdx = procDirs.find("processors"); - } - - if (leadProcIdx < 0) - { - // Collated (new) + // Collated leadProcIdx = procDirs.find("processors" + Foam::name(nProcs)); } diff --git a/applications/utilities/parallelProcessing/decomposePar/decomposePar.C b/applications/utilities/parallelProcessing/decomposePar/decomposePar.C index 0fef72da77..bbbc6b63bf 100644 --- a/applications/utilities/parallelProcessing/decomposePar/decomposePar.C +++ b/applications/utilities/parallelProcessing/decomposePar/decomposePar.C @@ -519,29 +519,26 @@ int main(int argc, char *argv[]) { const fileName& d = dirs[diri]; - // Starts with 'processors' - if (d.find("processors") == 0) + label proci = -1; + + if + ( + d.starts_with("processor") + && + ( + // Collated is "processors" + d[9] == 's' + + // Uncollated has integer(s) after 'processor' + || Foam::read(d.substr(9), proci) + ) + ) { if (fileHandler().exists(d)) { fileHandler().rmDir(d); } } - - // Starts with 'processor' - if (d.find("processor") == 0) - { - // Check that integer after processor - fileName num(d.substr(9)); - label proci = -1; - if (Foam::read(num.c_str(), proci)) - { - if (fileHandler().exists(d)) - { - fileHandler().rmDir(d); - } - } - } } procDirsProblem = false; diff --git a/applications/utilities/postProcessing/miscellaneous/profilingSummary/profilingSummary.C b/applications/utilities/postProcessing/miscellaneous/profilingSummary/profilingSummary.C index a9fe33dc08..f37f7bc685 100644 --- a/applications/utilities/postProcessing/miscellaneous/profilingSummary/profilingSummary.C +++ b/applications/utilities/postProcessing/miscellaneous/profilingSummary/profilingSummary.C @@ -5,7 +5,7 @@ \\ / A nd | www.openfoam.com \\/ M anipulation | ------------------------------------------------------------------------------- - Copyright (C) 2017 OpenCFD Ltd. + Copyright (C) 2017-2020 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -86,15 +86,7 @@ int main(int argc, char *argv[]) #include "createTime.H" // Determine the processor count - #ifdef fileOperation_H const label nProcs = fileHandler().nProcs(args.path()); - #else - label nProcs = 0; - while (isDir(args.path()/("processor" + Foam::name(nProcs)))) - { - ++nProcs; - } - #endif // Create the processor databases PtrList