functionObject: Improved handling of #includeFunc arguments
adding support for argument substitution into sub-dictionaries for
e.g. pressureDifferencePatch, white space before, in and after the argument list
and continuation lines, for example:
functions
{
#includeFunc flowRatePatch(name=inlet)
#includeFunc flowRatePatch ( name = outlet )
#includeFunc pressureDifferencePatch \
( \
patch1 = inlet, \
patch2 = outlet \
)
#includeFunc yPlus
#includeFunc residuals
}
This commit is contained in:
@ -131,6 +131,10 @@ public:
|
||||
//- Raw, low-level getline into a string function.
|
||||
inline ISstream& getLine(string&);
|
||||
|
||||
//- Get multiple lines using the '\' continuation character
|
||||
// into a string
|
||||
inline ISstream& getMultiLines(string&);
|
||||
|
||||
//- Raw, low-level putback character function.
|
||||
inline ISstream& putback(const char&);
|
||||
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration | Website: https://openfoam.org
|
||||
\\ / A nd | Copyright (C) 2011-2018 OpenFOAM Foundation
|
||||
\\ / A nd | Copyright (C) 2011-2019 OpenFOAM Foundation
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
@ -80,6 +80,32 @@ inline Foam::ISstream& Foam::ISstream::getLine(string& s)
|
||||
setState(is_.rdstate());
|
||||
lineNumber_++;
|
||||
|
||||
while (s.back() == '\\')
|
||||
{
|
||||
string contLine;
|
||||
getline(is_, contLine);
|
||||
setState(is_.rdstate());
|
||||
lineNumber_++;
|
||||
s.pop_back();
|
||||
s += contLine;
|
||||
}
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
|
||||
inline Foam::ISstream& Foam::ISstream::getMultiLines(string& s)
|
||||
{
|
||||
getLine(s);
|
||||
|
||||
while (s.back() == '\\')
|
||||
{
|
||||
s.pop_back();
|
||||
string contLine;
|
||||
getLine(contLine);
|
||||
s += contLine;
|
||||
}
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration | Website: https://openfoam.org
|
||||
\\ / A nd | Copyright (C) 2011-2018 OpenFOAM Foundation
|
||||
\\ / A nd | Copyright (C) 2011-2019 OpenFOAM Foundation
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
@ -153,7 +153,6 @@ bool Foam::entry::New(dictionary& parentDict, Istream& is)
|
||||
{
|
||||
if (keyword[0] == '#') // ... Function entry
|
||||
{
|
||||
word functionName = keyword(1, keyword.size()-1);
|
||||
if (disableFunctionEntries)
|
||||
{
|
||||
return parentDict.add
|
||||
@ -169,6 +168,7 @@ bool Foam::entry::New(dictionary& parentDict, Istream& is)
|
||||
}
|
||||
else
|
||||
{
|
||||
const word functionName = keyword(1, keyword.size() - 1);
|
||||
return functionEntry::execute(functionName, parentDict, is);
|
||||
}
|
||||
}
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration | Website: https://openfoam.org
|
||||
\\ / A nd | Copyright (C) 2011-2018 OpenFOAM Foundation
|
||||
\\ / A nd | Copyright (C) 2011-2019 OpenFOAM Foundation
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
@ -49,12 +49,12 @@ namespace Foam
|
||||
|
||||
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
|
||||
|
||||
Foam::token Foam::functionEntry::readLine(const word& key, Istream& is)
|
||||
Foam::string Foam::functionEntry::readLine(const word& key, Istream& is)
|
||||
{
|
||||
string s;
|
||||
dynamic_cast<ISstream&>(is).getLine(s);
|
||||
|
||||
return token(string(key+s), is.lineNumber());
|
||||
return key + s;
|
||||
}
|
||||
|
||||
|
||||
@ -69,8 +69,8 @@ Foam::functionEntry::functionEntry
|
||||
:
|
||||
primitiveEntry
|
||||
(
|
||||
word(key+dict.name()+Foam::name(is.lineNumber())),
|
||||
readLine(key, is)
|
||||
word(key + dict.name() + Foam::name(is.lineNumber())),
|
||||
readLine(key, is).c_str()
|
||||
)
|
||||
{}
|
||||
|
||||
|
||||
@ -68,7 +68,7 @@ class functionEntry
|
||||
// Private Member Functions
|
||||
|
||||
//- Read line as string token
|
||||
static token readLine(const word& key, Istream& is);
|
||||
static string readLine(const word& key, Istream& is);
|
||||
|
||||
|
||||
public:
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration | Website: https://openfoam.org
|
||||
\\ / A nd | Copyright (C) 2016-2018 OpenFOAM Foundation
|
||||
\\ / A nd | Copyright (C) 2016-2019 OpenFOAM Foundation
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
@ -25,6 +25,7 @@ License
|
||||
|
||||
#include "includeFuncEntry.H"
|
||||
#include "functionObjectList.H"
|
||||
#include "stringOps.H"
|
||||
#include "addToMemberFunctionSelectionTable.H"
|
||||
|
||||
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
||||
@ -54,7 +55,10 @@ bool Foam::functionEntries::includeFuncEntry::execute
|
||||
Istream& is
|
||||
)
|
||||
{
|
||||
const word fNameArgs(is);
|
||||
// Read line containing the function name and all the arguments
|
||||
string fNameArgs;
|
||||
dynamic_cast<ISstream&>(is).getMultiLines(fNameArgs);
|
||||
|
||||
HashSet<word> selectedFields;
|
||||
|
||||
return functionObjectList::readFunctionObject
|
||||
|
||||
@ -232,7 +232,7 @@ Foam::primitiveEntry::primitiveEntry(const keyType& key, Istream& is)
|
||||
|
||||
void Foam::primitiveEntry::write(Ostream& os, const bool contentsOnly) const
|
||||
{
|
||||
if (!contentsOnly)
|
||||
if (!contentsOnly && keyword().size() && keyword()[0] != '#')
|
||||
{
|
||||
os.writeKeyword(keyword());
|
||||
}
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration | Website: https://openfoam.org
|
||||
\\ / A nd | Copyright (C) 2011-2018 OpenFOAM Foundation
|
||||
\\ / A nd | Copyright (C) 2011-2019 OpenFOAM Foundation
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
@ -270,6 +270,9 @@ bool Foam::functionObjectList::readFunctionObject
|
||||
++i;
|
||||
}
|
||||
|
||||
// Strip whitespace from the function name
|
||||
string::stripInvalid<word>(funcName);
|
||||
|
||||
// Search for the functionObject dictionary
|
||||
fileName path = findDict(funcName, region);
|
||||
|
||||
@ -285,7 +288,12 @@ bool Foam::functionObjectList::readFunctionObject
|
||||
autoPtr<ISstream> fileStreamPtr(fileHandler().NewIFstream(path));
|
||||
ISstream& fileStream = fileStreamPtr();
|
||||
|
||||
// Delay processing the functionEntries
|
||||
// until after the function argument entries have been added
|
||||
entry::disableFunctionEntries = true;
|
||||
dictionary funcsDict(fileStream);
|
||||
entry::disableFunctionEntries = false;
|
||||
|
||||
dictionary* funcDictPtr = &funcsDict;
|
||||
|
||||
if (funcsDict.found(funcName) && funcsDict.isDict(funcName))
|
||||
@ -338,6 +346,15 @@ bool Foam::functionObjectList::readFunctionObject
|
||||
const word funcNameArgsWord = string::validate<word>(funcNameArgs);
|
||||
dictionary funcArgsDict;
|
||||
funcArgsDict.add(funcNameArgsWord, funcDict);
|
||||
|
||||
// Re-parse the funcDict to execute the functionEntries
|
||||
// now that the function argument entries have been added
|
||||
{
|
||||
OStringStream os;
|
||||
funcArgsDict.write(os);
|
||||
funcArgsDict = dictionary(IStringStream(os.str())());
|
||||
}
|
||||
|
||||
functionsDict.merge(funcArgsDict);
|
||||
functionsDict.subDict(funcNameArgsWord).name() = funcDict.name();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user