diff --git a/applications/test/dictionary/testDict b/applications/test/dictionary/testDict index 5fd1c07e86..92cd475adb 100644 --- a/applications/test/dictionary/testDict +++ b/applications/test/dictionary/testDict @@ -14,8 +14,8 @@ FoamFile } // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // -#includeIfPresent "someUnknownFile" -#includeIfPresent "$FOAM_CASE/someUnknownFile" +#sinclude "someUnknownFile" +#sinclude "$FOAM_CASE/someUnknownFile" #includeIfPresent "$FOAM_CASE/someUnknownFile-$FOAM_CASENAME" internalField uniform 1; diff --git a/applications/utilities/miscellaneous/foamDictionary/foamDictionary.C b/applications/utilities/miscellaneous/foamDictionary/foamDictionary.C index 88a4df557c..c8d972fd51 100644 --- a/applications/utilities/miscellaneous/foamDictionary/foamDictionary.C +++ b/applications/utilities/miscellaneous/foamDictionary/foamDictionary.C @@ -59,7 +59,7 @@ Usage the resulting dictionary to standard output. - \par -includes - List the \c \#include and \c \#includeIfPresent files to standard output + List the \c \#include and \c \#sinclude files to standard output - \par -disableFunctionEntries Do not expand macros or directives (\#include etc) @@ -307,7 +307,7 @@ int main(int argc, char *argv[]) argList::addBoolOption ( "includes", - "List the #include/#includeIfPresent files to standard output" + "List the #include/#sinclude files to standard output" ); argList::addBoolOption ( diff --git a/etc/config.csh/aliases b/etc/config.csh/aliases index 1f63a50900..d423c053e4 100644 --- a/etc/config.csh/aliases +++ b/etc/config.csh/aliases @@ -49,6 +49,11 @@ alias util 'cd $FOAM_UTILITIES' alias tut 'cd $FOAM_TUTORIALS' alias run 'cd $FOAM_RUN' +alias ufoam 'cd $WM_PROJECT_USER_DIR' +alias uapp 'cd $WM_PROJECT_USER_DIR/applications' +alias usol 'cd $WM_PROJECT_USER_DIR/applications/solvers' +alias uutil 'cd $WM_PROJECT_USER_DIR/applications/utilities' + # Refresh the environment # ~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/etc/config.csh/unset b/etc/config.csh/unset index 92cef08d00..7769d74e61 100644 --- a/etc/config.csh/unset +++ b/etc/config.csh/unset @@ -175,6 +175,11 @@ unalias util unalias tut unalias run +unalias ufoam +unalias uapp +unalias usol +unalias uutil + unalias wmRefresh unalias foamVersion unalias foamPV diff --git a/etc/config.sh/aliases b/etc/config.sh/aliases index 088d653ce0..f93b5c6818 100644 --- a/etc/config.sh/aliases +++ b/etc/config.sh/aliases @@ -47,6 +47,11 @@ alias util='cd $FOAM_UTILITIES' alias tut='cd $FOAM_TUTORIALS' alias run='cd $FOAM_RUN' +alias ufoam='cd $WM_PROJECT_USER_DIR' +alias uapp='cd $WM_PROJECT_USER_DIR/applications' +alias usol='cd $WM_PROJECT_USER_DIR/applications/solvers' +alias uutil='cd $WM_PROJECT_USER_DIR/applications/utilities' + # Refresh the environment # ~~~~~~~~~~~~~~~~~~~~~~~ @@ -106,4 +111,22 @@ foamPV() } +# OpenFOAM working directory with basic env replacements +# ~~~~~~~~~~~~~~~~~~~~~~~~~~ +unset -f foamPwd 2>/dev/null +foamPwd() +{ + if [ -d "$WM_PROJECT_DIR" ] + then + echo $PWD | sed \ + -e "s#^${FOAM_RUN}#\$FOAM_RUN#;" \ + -e "s#^${WM_PROJECT_DIR}#\$WM_PROJECT_DIR#;" \ + -e "s#^${WM_PROJECT_USER_DIR}#\$WM_PROJECT_USER_DIR#;" \ + -e "s#^${HOME}#\$HOME#"; + else + echo $PWD | sed -e "s#^${HOME}#\$HOME#;" + fi +} + + #------------------------------------------------------------------------------ diff --git a/etc/config.sh/unset b/etc/config.sh/unset index 09aa585579..871afe1ecd 100644 --- a/etc/config.sh/unset +++ b/etc/config.sh/unset @@ -170,10 +170,19 @@ unalias util 2>/dev/null unalias tut 2>/dev/null unalias run 2>/dev/null +unalias ufoam 2>/dev/null +unalias uapp 2>/dev/null +unalias usol 2>/dev/null +unalias uutil 2>/dev/null + unset -f wmRefresh 2>/dev/null +unset -f foamPwd 2>/dev/null unset -f foamVersion 2>/dev/null unset -f foamPV 2>/dev/null +# NB: no good way to remove foamPwd reference in PS1. + + # Remove old completions, which look like # "complete ... -F _of_complete_ APPNAME # For economy, obtain list first diff --git a/src/OSspecific/POSIX/printStack.C b/src/OSspecific/POSIX/printStack.C index 19db2c6303..e9310dfb7e 100644 --- a/src/OSspecific/POSIX/printStack.C +++ b/src/OSspecific/POSIX/printStack.C @@ -50,7 +50,7 @@ string pOpen(const string& cmd, label line=0) char *buf = nullptr; // Read line number of lines - for (label cnt = 0; cnt <= line; cnt++) + for (label cnt = 0; cnt <= line; ++cnt) { size_t linecap = 0; ssize_t linelen = ::getline(&buf, &linecap, cmdPipe); @@ -96,6 +96,14 @@ inline word addressToWord(const uintptr_t addr) } +inline string& shorterPath(string& s) +{ + s.replace(cwd() + '/', ""); + s.replace(home(), "~"); + return s; +} + + void printSourceFileAndLine ( Ostream& os, @@ -132,14 +140,12 @@ void printSourceFileAndLine } else if (line == "??:0") { - os << " in " << filename; + line = filename; + os << " in " << shorterPath(line).c_str(); } else { - string cwdLine(line.replaceAll(cwd() + '/', "")); - string homeLine(cwdLine.replaceAll(home(), "~")); - - os << " at " << homeLine.c_str(); + os << " at " << shorterPath(line).c_str(); } } } @@ -202,7 +208,7 @@ void Foam::error::safePrintStack(std::ostream& os) // See if they contain function between () e.g. "(__libc_start_main+0xd0)" // and see if cplus_demangle can make sense of part before + - for (size_t i = 0; i < size; i++) + for (size_t i = 0; i < size; ++i) { string msg(strings[i]); fileName programFile; @@ -226,7 +232,7 @@ void Foam::error::printStack(Ostream& os) fileName fname = "???"; word address; - for(size_t i=0; i | | #include | dict/primitive | string - #includeEtc | dict/primitive | string + #sinclude | dict/primitive | string #includeIfPresent | dict/primitive | string + #includeEtc | dict/primitive | string #includeFunc | dict | word | | #calc | dict/primitive | string @@ -27,4 +28,4 @@ Pending future extensions #undef | dict | keyType or List -2017-11-26 +2018-05-28 diff --git a/src/OpenFOAM/db/dictionary/functionEntries/includeEntry/includeEntry.C b/src/OpenFOAM/db/dictionary/functionEntries/includeEntry/includeEntry.C index 90fe356885..e39e9a657a 100644 --- a/src/OpenFOAM/db/dictionary/functionEntries/includeEntry/includeEntry.C +++ b/src/OpenFOAM/db/dictionary/functionEntries/includeEntry/includeEntry.C @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2011-2017 OpenFOAM Foundation - \\/ M anipulation | + \\/ M anipulation | Copyright (C) 2018 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -57,9 +57,47 @@ namespace functionEntries primitiveEntryIstream, include ); + + addNamedToMemberFunctionSelectionTable + ( + functionEntry, + sincludeEntry, + execute, + dictionaryIstream, + sinclude + ); + + addNamedToMemberFunctionSelectionTable + ( + functionEntry, + sincludeEntry, + execute, + primitiveEntryIstream, + sinclude + ); + + // Compat 1712 and earlier + addNamedToMemberFunctionSelectionTable + ( + functionEntry, + sincludeEntry, + execute, + dictionaryIstream, + includeIfPresent + ); + + addNamedToMemberFunctionSelectionTable + ( + functionEntry, + sincludeEntry, + execute, + primitiveEntryIstream, + includeIfPresent + ); } } + // * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * * // Foam::fileName Foam::functionEntries::includeEntry::resolveFile @@ -97,7 +135,7 @@ bool Foam::functionEntries::includeEntry::execute const fileName fName(resolveFile(is.name().path(), rawName, parentDict)); autoPtr ifsPtr(fileHandler().NewIFstream(fName)); - ISstream& ifs = ifsPtr(); + auto& ifs = *ifsPtr; if (ifs) { @@ -144,7 +182,7 @@ bool Foam::functionEntries::includeEntry::execute const fileName fName(resolveFile(is.name().path(), rawName, parentDict)); autoPtr ifsPtr(fileHandler().NewIFstream(fName)); - ISstream& ifs = ifsPtr(); + auto& ifs = *ifsPtr; if (ifs) { @@ -180,4 +218,79 @@ bool Foam::functionEntries::includeEntry::execute } +bool Foam::functionEntries::sincludeEntry::execute +( + dictionary& parentDict, + Istream& is +) +{ + const fileName rawName(is); + const fileName fName(resolveFile(is.name().path(), rawName, parentDict)); + + autoPtr ifsPtr(fileHandler().NewIFstream(fName)); + auto& ifs = *ifsPtr; + + if (ifs) + { + if (Foam::functionEntries::includeEntry::log) + { + Info<< fName << endl; + } + + // Add watch on included file + const dictionary& top = parentDict.topDict(); + if (isA(top)) + { + regIOobject& rio = const_cast + ( + dynamic_cast(top) + ); + rio.addWatch(fName); + } + + parentDict.read(ifs); + } + + return true; // Never fails +} + + +bool Foam::functionEntries::sincludeEntry::execute +( + const dictionary& parentDict, + primitiveEntry& entry, + Istream& is +) +{ + const fileName rawName(is); + const fileName fName(resolveFile(is.name().path(), rawName, parentDict)); + + autoPtr ifsPtr(fileHandler().NewIFstream(fName)); + auto& ifs = *ifsPtr; + + if (ifs) + { + if (Foam::functionEntries::includeEntry::log) + { + Info<< fName << endl; + } + + // Add watch on included file + const dictionary& top = parentDict.topDict(); + if (isA(top)) + { + regIOobject& rio = const_cast + ( + dynamic_cast(top) + ); + rio.addWatch(fName); + } + + entry.read(parentDict, ifs); + } + + return true; // Never fails +} + + // ************************************************************************* // diff --git a/src/OpenFOAM/db/dictionary/functionEntries/includeEntry/includeEntry.H b/src/OpenFOAM/db/dictionary/functionEntries/includeEntry/includeEntry.H index a2e7f5c909..cda8acb28a 100644 --- a/src/OpenFOAM/db/dictionary/functionEntries/includeEntry/includeEntry.H +++ b/src/OpenFOAM/db/dictionary/functionEntries/includeEntry/includeEntry.H @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation - \\/ M anipulation | + \\/ M anipulation | Copyright (C) 2018 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -25,19 +25,25 @@ Class Foam::functionEntries::includeEntry Description - Specify an include file when reading dictionaries, expects a - single string to follow. + A dictionary directive for including a file, expects a single string + to follow. - An example of the \c \#include directive: + An example of the \c \#include directive to include a file: \verbatim - #include "includeFile" + #include "includeFileMustExist" \endverbatim - The usual expansion of environment variables and other constructs - (eg, the \c ~OpenFOAM/ expansion) is retained. + An example of the \c \#sinclude directive to conditionally include a file + when it exists. + \verbatim + #sinclude "includeFileCanBeMissing" + \endverbatim + + The usual expansion of environment variables and other expansions + (eg, a leading "/", "/", "/", ...) are retained. See also - fileName, string::expand() + fileName, string::expand(), functionEntries::sincludeEntry SourceFiles includeEntry.C @@ -97,7 +103,35 @@ public: primitiveEntry& entry, Istream& is ); +}; + +/*---------------------------------------------------------------------------*\ + Class sincludeEntry Declaration +\*---------------------------------------------------------------------------*/ + +//- A dictionary directive for conditionally including a file, +//- expects a single string to follow. +// +// The \c \#sinclude directive (and the \c \#includeIfPresent alias) behaves +// identically to the \c \#include directive, but does not generate an error +// if the file does not exist. +class sincludeEntry +: + public includeEntry +{ +public: + + //- Include file (if it exists) in a sub-dict context + static bool execute(dictionary& parentDict, Istream& is); + + //- Include file (if it exists) in a primitiveEntry context + static bool execute + ( + const dictionary& parentDict, + primitiveEntry& entry, + Istream& is + ); }; diff --git a/src/OpenFOAM/db/dictionary/functionEntries/includeEtcEntry/includeEtcEntry.C b/src/OpenFOAM/db/dictionary/functionEntries/includeEtcEntry/includeEtcEntry.C index 8fd559b7d6..da008f6842 100644 --- a/src/OpenFOAM/db/dictionary/functionEntries/includeEtcEntry/includeEtcEntry.C +++ b/src/OpenFOAM/db/dictionary/functionEntries/includeEtcEntry/includeEtcEntry.C @@ -96,7 +96,7 @@ bool Foam::functionEntries::includeEtcEntry::execute const fileName fName(resolveEtcFile(rawName, parentDict)); autoPtr ifsPtr(fileHandler().NewIFstream(fName)); - ISstream& ifs = ifsPtr(); + auto& ifs = *ifsPtr; if (ifs) { @@ -131,7 +131,7 @@ bool Foam::functionEntries::includeEtcEntry::execute const fileName fName(resolveEtcFile(rawName, parentDict)); autoPtr ifsPtr(fileHandler().NewIFstream(fName)); - ISstream& ifs = ifsPtr(); + auto& ifs = *ifsPtr; if (ifs) { diff --git a/src/OpenFOAM/db/dictionary/functionEntries/includeEtcEntry/includeEtcEntry.H b/src/OpenFOAM/db/dictionary/functionEntries/includeEtcEntry/includeEtcEntry.H index 9d6ccae409..28564375b2 100644 --- a/src/OpenFOAM/db/dictionary/functionEntries/includeEtcEntry/includeEtcEntry.H +++ b/src/OpenFOAM/db/dictionary/functionEntries/includeEtcEntry/includeEtcEntry.H @@ -25,6 +25,9 @@ Class Foam::functionEntries::includeEtcEntry Description + A dictionary directive for including a file found using the findEtcFile() + mechanism. + Specify an etc file to include when reading dictionaries, expects a single string to follow. diff --git a/src/OpenFOAM/db/dictionary/functionEntries/includeIfPresentEntry/includeIfPresentEntry.C b/src/OpenFOAM/db/dictionary/functionEntries/includeIfPresentEntry/includeIfPresentEntry.C deleted file mode 100644 index a110e55cd9..0000000000 --- a/src/OpenFOAM/db/dictionary/functionEntries/includeIfPresentEntry/includeIfPresentEntry.C +++ /dev/null @@ -1,136 +0,0 @@ -/*---------------------------------------------------------------------------*\ - ========= | - \\ / F ield | OpenFOAM: The Open Source CFD Toolbox - \\ / O peration | - \\ / A nd | Copyright (C) 2011-2017 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 . - -\*---------------------------------------------------------------------------*/ - -#include "includeIfPresentEntry.H" -#include "dictionary.H" -#include "IFstream.H" -#include "regIOobject.H" -#include "addToMemberFunctionSelectionTable.H" -#include "fileOperation.H" - -// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // - -namespace Foam -{ -namespace functionEntries -{ - addNamedToMemberFunctionSelectionTable - ( - functionEntry, - includeIfPresentEntry, - execute, - dictionaryIstream, - includeIfPresent - ); - - addNamedToMemberFunctionSelectionTable - ( - functionEntry, - includeIfPresentEntry, - execute, - primitiveEntryIstream, - includeIfPresent - ); -} -} - -// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // - -bool Foam::functionEntries::includeIfPresentEntry::execute -( - dictionary& parentDict, - Istream& is -) -{ - const fileName rawName(is); - const fileName fName(resolveFile(is.name().path(), rawName, parentDict)); - - autoPtr ifsPtr(fileHandler().NewIFstream(fName)); - ISstream& ifs = ifsPtr(); - - if (ifs) - { - if (Foam::functionEntries::includeEntry::log) - { - Info<< fName << endl; - } - - // Add watch on included file - const dictionary& top = parentDict.topDict(); - if (isA(top)) - { - regIOobject& rio = const_cast - ( - dynamic_cast(top) - ); - rio.addWatch(fName); - } - - parentDict.read(ifs); - } - - return true; -} - - -bool Foam::functionEntries::includeIfPresentEntry::execute -( - const dictionary& parentDict, - primitiveEntry& entry, - Istream& is -) -{ - const fileName rawName(is); - const fileName fName(resolveFile(is.name().path(), rawName, parentDict)); - - autoPtr ifsPtr(fileHandler().NewIFstream(fName)); - ISstream& ifs = ifsPtr(); - - if (ifs) - { - if (Foam::functionEntries::includeEntry::log) - { - Info<< fName << endl; - } - - // Add watch on included file - const dictionary& top = parentDict.topDict(); - if (isA(top)) - { - regIOobject& rio = const_cast - ( - dynamic_cast(top) - ); - rio.addWatch(fName); - } - - entry.read(parentDict, ifs); - } - - return true; -} - - -// ************************************************************************* // diff --git a/src/OpenFOAM/db/dictionary/functionEntries/includeIfPresentEntry/includeIfPresentEntry.H b/src/OpenFOAM/db/dictionary/functionEntries/includeIfPresentEntry/includeIfPresentEntry.H deleted file mode 100644 index a6d581e608..0000000000 --- a/src/OpenFOAM/db/dictionary/functionEntries/includeIfPresentEntry/includeIfPresentEntry.H +++ /dev/null @@ -1,86 +0,0 @@ -/*---------------------------------------------------------------------------*\ - ========= | - \\ / F ield | OpenFOAM: The Open Source CFD Toolbox - \\ / O peration | - \\ / A nd | Copyright (C) 2011-2016 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 . - -Class - Foam::functionEntries::includeIfPresentEntry - -Description - Specify a file to include if it exists. Expects a single string to follow. - - The \c \#includeIfPresent directive is similar to the \c \#include - directive, but does not generate an error if the file does not exist. - -See also - Foam::functionEntries::includeEntry - -SourceFiles - includeIfPresentEntry.C - -\*---------------------------------------------------------------------------*/ - -#ifndef includeIfPresentEntry_H -#define includeIfPresentEntry_H - -#include "includeEntry.H" - -// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // - -namespace Foam -{ -namespace functionEntries -{ - -/*---------------------------------------------------------------------------*\ - Class includeIfPresentEntry Declaration -\*---------------------------------------------------------------------------*/ - -class includeIfPresentEntry -: - public includeEntry -{ -public: - - //- Include (if present) in a sub-dict context - static bool execute(dictionary& parentDict, Istream& is); - - //- Include (if present) in a primitiveEntry context - static bool execute - ( - const dictionary& parentDict, - primitiveEntry& entry, - Istream& is - ); - -}; - - -// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // - -} // End namespace functionEntries -} // End namespace Foam - -// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // - -#endif - -// ************************************************************************* // diff --git a/src/OpenFOAM/global/etcFiles/etcFiles.C b/src/OpenFOAM/global/etcFiles/etcFiles.C index 5271b4de48..448bf64f27 100644 --- a/src/OpenFOAM/global/etcFiles/etcFiles.C +++ b/src/OpenFOAM/global/etcFiles/etcFiles.C @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2016 OpenFOAM Foundation - \\/ M anipulation | Copyright (C) 2017 OpenCFD Ltd. + \\/ M anipulation | Copyright (C) 2017-2018 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -32,8 +32,10 @@ License // // These could be exposed too (if required), but are fairly special purpose. // -//! \cond fileScope -// + +namespace +{ + // Assign 'queried' parameter to the user resource directory. // Return true if this directory exists. // @@ -62,9 +64,15 @@ static inline bool groupResourceDir(Foam::fileName& queried) return Foam::isDir(queried); } - // Fallback (when WM_PROJECT_SITE is unset) + // When WM_PROJECT_SITE is unset: queried = Foam::getEnv("WM_PROJECT_INST_DIR")/"site"; - return (queried.size() > 5 && Foam::isDir(queried)); + return (queried.size() > 4 && Foam::isDir(queried)); + + // NOTE: this alternative bit of code corresponds to how we patch things + // for spack (and EasyBuild?) to avoid leaking out to the parent directory + // + // queried = Foam::getEnv("WM_PROJECT_DIR")/"site"; + // return (queried.size() > 4 && Foam::isDir(queried)); } @@ -77,87 +85,100 @@ static inline bool groupResourceDir(Foam::fileName& queried) static inline bool projectResourceDir(Foam::fileName& queried) { queried = Foam::getEnv("WM_PROJECT_DIR")/"etc"; - return (queried.size() > 4 && Foam::isDir(queried)); + return (queried.size() > 3 && Foam::isDir(queried)); } -//! \endcond + +Foam::fileNameList searchEtc +( + const Foam::fileName& name, + const bool findFirst, + bool (*accept)(const Foam::fileName&) +) +{ + Foam::fileNameList list; + Foam::fileName dir, candidate; + + // User resource directories + if (userResourceDir(dir)) + { + candidate = dir/Foam::FOAMversion/name; + if (accept(candidate)) + { + list.append(std::move(candidate)); + if (findFirst) + { + return list; + } + } + + candidate = dir/name; + if (accept(candidate)) + { + list.append(std::move(candidate)); + if (findFirst) + { + return list; + } + } + } + + // Group resource directories + if (groupResourceDir(dir)) + { + candidate = dir/Foam::FOAMversion/name; + if (accept(candidate)) + { + list.append(std::move(candidate)); + if (findFirst) + { + return list; + } + } + + candidate = dir/name; + if (accept(candidate)) + { + list.append(std::move(candidate)); + if (findFirst) + { + return list; + } + } + } + + // Other (project) resource directory + if (projectResourceDir(dir)) + { + candidate = dir/name; + if (accept(candidate)) + { + list.append(std::move(candidate)); + } + } + + return list; +} + +} // End anonymous namespace // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + Foam::fileNameList Foam::findEtcDirs ( const fileName& name, const bool findFirst ) { - fileNameList results; - - do - { - fileName dir, candidate; - - // User resource directories - if (userResourceDir(dir)) - { - candidate = dir/FOAMversion/name; - if (isDir(candidate)) - { - results.append(candidate); - if (findFirst) - { - break; - } - } - - candidate = dir/name; - if (isDir(candidate)) - { - results.append(candidate); - if (findFirst) - { - break; - } - } - } - - // Group resource directories - if (groupResourceDir(dir)) - { - candidate = dir/FOAMversion/name; - if (isDir(candidate)) - { - results.append(candidate); - if (findFirst) - { - break; - } - } - - candidate = dir/name; - if (isDir(candidate)) - { - results.append(candidate); - if (findFirst) - { - break; - } - } - } - - // Other (project) resource directory - if (projectResourceDir(dir)) - { - candidate = dir/name; - if (isDir(dir) && isDir(candidate)) - { - results.append(candidate); - } - } - } - while (false); // Run exactly once - - return results; + return + searchEtc + ( + name, + findFirst, + [](const fileName& f){ return isDir(f); } + ); } @@ -168,79 +189,20 @@ Foam::fileNameList Foam::findEtcFiles const bool findFirst ) { - fileNameList results; + fileNameList list; - do + if (name.size()) { - fileName dir, candidate; - - // User resource directories - if (userResourceDir(dir)) - { - candidate = dir/FOAMversion/name; - if (isFile(candidate)) - { - results.append(candidate); - if (findFirst) - { - break; - } - } - - candidate = dir/name; - if (isFile(candidate)) - { - results.append(candidate); - if (findFirst) - { - break; - } - } - } - - // Group resource directories - if (groupResourceDir(dir)) - { - candidate = dir/FOAMversion/name; - if (isFile(candidate)) - { - results.append(candidate); - if (findFirst) - { - break; - } - } - - candidate = dir/name; - if (isFile(candidate)) - { - results.append(candidate); - if (findFirst) - { - break; - } - } - } - - // Other (project) resource directory - if (projectResourceDir(dir)) - { - candidate = dir/name; - if (isDir(dir) && isFile(candidate)) - { - results.append(candidate); - } - } - } - while (false); // Run exactly once - - // No name? It cannot be a file! - if (name.empty()) - { - results.clear(); + // A file must have a name! + list = searchEtc + ( + name, + findFirst, + [](const fileName& f){ return isFile(f); } + ); } - if (mandatory && results.empty()) + if (mandatory && list.empty()) { // Abort if file is mandatory but not found std::cerr @@ -250,21 +212,21 @@ Foam::fileNameList Foam::findEtcFiles ::exit(1); } - return results; + return list; } Foam::fileName Foam::findEtcFile(const fileName& name, const bool mandatory) { - fileNameList results(findEtcFiles(name, mandatory, true)); + fileName file; - if (results.size()) + fileNameList list(findEtcFiles(name, mandatory, true)); + if (list.size()) { - return results[0]; + file = std::move(list.first()); } - // Return null-constructed fileName rather than fileName::null - return fileName(); + return file; } diff --git a/src/OpenFOAM/global/etcFiles/etcFiles.H b/src/OpenFOAM/global/etcFiles/etcFiles.H index 5e3532148c..7c190fb1a8 100644 --- a/src/OpenFOAM/global/etcFiles/etcFiles.H +++ b/src/OpenFOAM/global/etcFiles/etcFiles.H @@ -45,19 +45,8 @@ namespace Foam // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // //- Search for directories from user/group/other directories. -// The search scheme allows for version-specific and -// version-independent files using the following hierarchy: -// - \b user settings: -// - ~/.OpenFOAM/\ -// - ~/.OpenFOAM/ -// - \b group (site) settings (when $WM_PROJECT_SITE is set): -// - $WM_PROJECT_SITE/\ -// - $WM_PROJECT_SITE -// - \b group (site) settings (when $WM_PROJECT_SITE is not set): -// - $WM_PROJECT_INST_DIR/site/\ -// - $WM_PROJECT_INST_DIR/site/ -// - \b other (project) settings: -// - $WM_PROJECT_DIR/etc/ +// +// \note Uses search hierarchy as per findEtcFiles(). // // \return The list of full paths of all the matching directories or // an empty list if the name cannot be found. @@ -68,19 +57,22 @@ fileNameList findEtcDirs const bool findFirst = false ); + //- Search for files from user/group/other directories. -// The search scheme allows for version-specific and -// version-independent files using the following hierarchy: +// +// \note +// The following search hierarchy is also used by the foamEtcFile shell +// script, which allows for version-specific and version-independent files: // - \b user settings: // - ~/.OpenFOAM/\ // - ~/.OpenFOAM/ -// - \b group (site) settings (when $WM_PROJECT_SITE is set): +// - \b group settings (when $WM_PROJECT_SITE is set): // - $WM_PROJECT_SITE/\ // - $WM_PROJECT_SITE -// - \b group (site) settings (when $WM_PROJECT_SITE is not set): +// - \b group settings (when $WM_PROJECT_SITE is not set): // - $WM_PROJECT_INST_DIR/site/\ // - $WM_PROJECT_INST_DIR/site/ -// - \b other (project) settings: +// - \b other (shipped) settings: // - $WM_PROJECT_DIR/etc/ // // \return The list of full paths of all the matching files or @@ -94,7 +86,9 @@ fileNameList findEtcFiles const bool findFirst = false ); -//- Search for a single file using findEtcFiles. + +//- Search for a single file using findEtcFiles(). +// // \return The full path name of the first file found in the // search hierarchy or an empty fileName if the name cannot be found. // Optionally abort if the file cannot be found but is mandatory. diff --git a/src/functionObjects/field/reference/referenceTemplates.C b/src/functionObjects/field/reference/referenceTemplates.C index a09b89ca80..f32150d233 100644 --- a/src/functionObjects/field/reference/referenceTemplates.C +++ b/src/functionObjects/field/reference/referenceTemplates.C @@ -53,13 +53,15 @@ bool Foam::functionObjects::reference::calcType() { cellValue.value() = -pTraits::one*GREAT; + // Might trigger parallel comms (e.g. volPointInterpolation, if + // result is not yet cached) so have all processors do it + autoPtr> interpolator + ( + interpolation::New(interpolationScheme_, vf) + ); + if (celli_ != -1) { - autoPtr> interpolator - ( - interpolation::New(interpolationScheme_, vf) - ); - cellValue.value() = interpolator().interpolate(position_, celli_, -1); } diff --git a/src/meshTools/AMIInterpolation/patches/cyclicPeriodicAMI/cyclicPeriodicAMIPolyPatch/cyclicPeriodicAMIPolyPatch.C b/src/meshTools/AMIInterpolation/patches/cyclicPeriodicAMI/cyclicPeriodicAMIPolyPatch/cyclicPeriodicAMIPolyPatch.C index 0433f1a405..6e4206e650 100644 --- a/src/meshTools/AMIInterpolation/patches/cyclicPeriodicAMI/cyclicPeriodicAMIPolyPatch/cyclicPeriodicAMIPolyPatch.C +++ b/src/meshTools/AMIInterpolation/patches/cyclicPeriodicAMI/cyclicPeriodicAMIPolyPatch/cyclicPeriodicAMIPolyPatch.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2015 OpenCFD Ltd. + \\ / A nd | Copyright (C) 2015-2018 OpenCFD Ltd. \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -548,10 +548,13 @@ void Foam::cyclicPeriodicAMIPolyPatch::resetAMI if (nFace) { scalarField srcWghtSum(size(), 0); - scalarField tgtWghtSum(size(), 0); - forAll(*this, faceI) + forAll(srcWghtSum, faceI) { srcWghtSum[faceI] = sum(AMIPtr_->srcWeights()[faceI]); + } + scalarField tgtWghtSum(neighbPatch().size(), 0); + forAll(tgtWghtSum, faceI) + { tgtWghtSum[faceI] = sum(AMIPtr_->tgtWeights()[faceI]); } diff --git a/src/parallel/decompose/decompose/decompositionModel.C b/src/parallel/decompose/decompose/decompositionModel.C index 8f156c64b5..b2c948c919 100644 --- a/src/parallel/decompose/decompose/decompositionModel.C +++ b/src/parallel/decompose/decompose/decompositionModel.C @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2014-2016 OpenFOAM Foundation - \\/ M anipulation | Copyright (C) 2015 OpenCFD Ltd. + \\/ M anipulation | Copyright (C) 2015-2018 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -58,7 +58,7 @@ Foam::decompositionModel::decompositionModel "decomposeParDict", mesh.time().system(), mesh.local(), - mesh.db(), + mesh.thisDb(), IOobject::MUST_READ, IOobject::NO_WRITE, false, //io.registerObject(), @@ -92,7 +92,7 @@ Foam::decompositionModel::decompositionModel "decomposeParDict", mesh.time().system(), mesh.local(), - mesh.db(), + mesh.thisDb(), (dict.size() ? IOobject::NO_READ : IOobject::MUST_READ), IOobject::NO_WRITE, false, //io.registerObject(), diff --git a/tutorials/multiphase/interFoam/laminar/damBreak/damBreak/system/controlDict b/tutorials/multiphase/interFoam/laminar/damBreak/damBreak/system/controlDict index 06168ee7c2..974e73771c 100644 --- a/tutorials/multiphase/interFoam/laminar/damBreak/damBreak/system/controlDict +++ b/tutorials/multiphase/interFoam/laminar/damBreak/damBreak/system/controlDict @@ -52,6 +52,6 @@ maxAlphaCo 1; maxDeltaT 1; -#includeIfPresent "sampling" +#sinclude "sampling" // ************************************************************************* // diff --git a/wmake/makefiles/files b/wmake/makefiles/files index e28c353d4b..4c32b2f26e 100644 --- a/wmake/makefiles/files +++ b/wmake/makefiles/files @@ -31,7 +31,7 @@ FILES = $(OBJECTS_DIR)/files VARS = $(OBJECTS_DIR)/variables SFILES = $(OBJECTS_DIR)/sourceFiles --include $(OPTIONS) +sinclude $(OPTIONS) #------------------------------------------------------------------------------ diff --git a/wmake/makefiles/general b/wmake/makefiles/general index 4973e14891..5d0bc95d74 100644 --- a/wmake/makefiles/general +++ b/wmake/makefiles/general @@ -212,7 +212,7 @@ dep: $(DEPENDENCIES) updatedep: dep ifeq ($(findstring lnInclude,$(MAKECMDGOALS))$(findstring updatedep,$(MAKECMDGOALS)),) --include $(DEPENDENCIES) +sinclude $(DEPENDENCIES) endif