diff --git a/src/OpenFOAM/db/dictionary/dictionary.C b/src/OpenFOAM/db/dictionary/dictionary.C index fb6f28af5b89516118eaf0597e46b176122ef1b2..9d022d5111e86400df9d64fa2ef371d0824c87fe 100644 --- a/src/OpenFOAM/db/dictionary/dictionary.C +++ b/src/OpenFOAM/db/dictionary/dictionary.C @@ -109,14 +109,21 @@ Foam::dictionary::dictionary() {} +Foam::dictionary::dictionary(const fileName& name) +: + dictionaryName(name), + parent_(dictionary::null) +{} + + Foam::dictionary::dictionary ( const dictionary& parentDict, const dictionary& dict ) : + dictionaryName(parentDict.name() + "::" + dict.name()), IDLList<entry>(dict, *this), - name_(dict.name()), parent_(parentDict) { forAllIter(IDLList<entry>, *this, iter) @@ -140,8 +147,8 @@ Foam::dictionary::dictionary const dictionary& dict ) : + dictionaryName(dict.name()), IDLList<entry>(dict, *this), - name_(dict.name()), parent_(dictionary::null) { forAllIter(IDLList<entry>, *this, iter) @@ -183,6 +190,7 @@ Foam::dictionary::dictionary parent_(parentDict) { transfer(dict()); + name() = parentDict.name() + "::" + name(); } @@ -472,6 +480,24 @@ Foam::dictionary& Foam::dictionary::subDict(const word& keyword) } +Foam::dictionary Foam::dictionary::subOrEmptyDict +( + const word& keyword +) const +{ + const entry* entryPtr = lookupEntryPtr(keyword, false, true); + + if (entryPtr == NULL) + { + return dictionary(*this, dictionary(keyword)); + } + else + { + return entryPtr->dict(); + } +} + + Foam::wordList Foam::dictionary::toc() const { wordList keys(size()); @@ -530,7 +556,7 @@ bool Foam::dictionary::add(entry* entryPtr, bool mergeEntry) if (hashedEntries_.insert(entryPtr->keyword(), entryPtr)) { - entryPtr->name() = name_ + "::" + entryPtr->keyword(); + entryPtr->name() = name() + "::" + entryPtr->keyword(); if (entryPtr->keyword().isPattern()) { @@ -558,7 +584,7 @@ bool Foam::dictionary::add(entry* entryPtr, bool mergeEntry) if (hashedEntries_.insert(entryPtr->keyword(), entryPtr)) { - entryPtr->name() = name_ + "::" + entryPtr->keyword(); + entryPtr->name() = name() + "::" + entryPtr->keyword(); IDLList<entry>::append(entryPtr); if (entryPtr->keyword().isPattern()) @@ -763,7 +789,7 @@ bool Foam::dictionary::changeKeyword // change name and HashTable, but leave DL-List untouched iter()->keyword() = newKeyword; - iter()->name() = name_ + "::" + newKeyword; + iter()->name() = name() + "::" + newKeyword; hashedEntries_.erase(oldKeyword); hashedEntries_.insert(newKeyword, iter()); @@ -838,7 +864,7 @@ void Foam::dictionary::transfer(dictionary& dict) { // changing parents probably doesn't make much sense, // but what about the names? - name_ = dict.name_; + name() = dict.name(); IDLList<entry>::transfer(dict); hashedEntries_.transfer(dict.hashedEntries_); @@ -871,7 +897,7 @@ void Foam::dictionary::operator=(const dictionary& rhs) << abort(FatalError); } - name_ = rhs.name(); + name() = rhs.name(); clear(); // Create clones of the entries in the given dictionary diff --git a/src/OpenFOAM/db/dictionary/dictionary.H b/src/OpenFOAM/db/dictionary/dictionary.H index 31ac3142378cb5d10013fa0b7e1ac20191dfacf7..bdfb7e4a8f11c79a2f19537eb7d1270e22830796 100644 --- a/src/OpenFOAM/db/dictionary/dictionary.H +++ b/src/OpenFOAM/db/dictionary/dictionary.H @@ -41,7 +41,7 @@ Description ToDo A merge() member function with a non-const dictionary parameter. - This would avoid unnecessary cloning in the add(entry*,bool) method + This would avoid unnecessary cloning in the add(entry*, bool) method. SourceFiles dictionary.C @@ -74,6 +74,47 @@ class SHA1Digest; Istream& operator>>(Istream&, dictionary&); Ostream& operator<<(Ostream&, const dictionary&); +/*---------------------------------------------------------------------------*\ + Class dictionaryName Declaration +\*---------------------------------------------------------------------------*/ + +class dictionaryName +{ + // Private data + + fileName name_; + + +public: + + // Constructors + + //- Construct dictionaryName null + dictionaryName() + {} + + //- Construct dictionaryName as copy of the given fileName + dictionaryName(const fileName& name) + : + name_(name) + {} + + + // Member functions + + //- Return the dictionary name + const fileName& name() const + { + return name_; + } + + //- Return the dictionary name + fileName& name() + { + return name_; + } +}; + /*---------------------------------------------------------------------------*\ Class dictionary Declaration @@ -81,13 +122,11 @@ Ostream& operator<<(Ostream&, const dictionary&); class dictionary : + public dictionaryName, public IDLList<entry> { // Private data - //- Dictionary name - fileName name_; - //- HashTable of the entries held on the DL-list for quick lookup HashTable<entry*> hashedEntries_; @@ -100,6 +139,7 @@ class dictionary //- Patterns as precompiled regular expressions DLList<autoPtr<regExp> > patternRegexps_; + // Private Member Functions //- Search patterns table for exact match or regular expression match @@ -121,16 +161,6 @@ class dictionary ); -public: - - //- Read dictionary from Istream - bool read(Istream&); - - //- Substitute the given keyword prepended by '$' with the - // corresponding sub-dictionary entries - bool substituteKeyword(const word& keyword); - - public: //- Declare friendship with the entry class for IO @@ -150,10 +180,14 @@ public: //- Construct top-level dictionary null dictionary(); - //- Construct from the parent dictionary and Istream, reading entries - // until lastEntry or EOF + //- Construct top-level empty dictionary with given name + dictionary(const fileName& name); + + //- Construct given the entry name, parent dictionary and Istream, + // reading entries until lastEntry or EOF dictionary ( + const fileName& name, const dictionary& parentDict, Istream& ); @@ -192,18 +226,6 @@ public: // Member functions - //- Return the dictionary name - const fileName& name() const - { - return name_; - } - - //- Return the dictionary name - fileName& name() - { - return name_; - } - //- Return the parent dictionary const dictionary& parent() const { @@ -320,14 +342,23 @@ public: //- Find and return a sub-dictionary for manipulation dictionary& subDict(const word&); + //- Find and return a sub-dictionary as a copy, or + // return an empty dictionary if the sub-dictionary does not exist + dictionary subOrEmptyDict(const word&) const; + //- Return the table of contents wordList toc() const; //- Return the list of available keys or patterns List<keyType> keys(bool patterns=false) const; + // Editing + //- Substitute the given keyword prepended by '$' with the + // corresponding sub-dictionary entries + bool substituteKeyword(const word& keyword); + //- Add a new entry // With the merge option, dictionaries are interwoven and // primitive entries are overwritten @@ -407,6 +438,12 @@ public: Xfer<dictionary> xfer(); + // Read + + //- Read dictionary from Istream + bool read(Istream&); + + // Write void write(Ostream&, bool subDict=true) const; diff --git a/src/OpenFOAM/db/dictionary/dictionaryEntry/dictionaryEntryIO.C b/src/OpenFOAM/db/dictionary/dictionaryEntry/dictionaryEntryIO.C index 4ed38340530820d2d88a4852c4c1e15e96abbc80..175553e23ae0007323441d6cfd795efe34400e5f 100644 --- a/src/OpenFOAM/db/dictionary/dictionaryEntry/dictionaryEntryIO.C +++ b/src/OpenFOAM/db/dictionary/dictionaryEntry/dictionaryEntryIO.C @@ -58,10 +58,8 @@ Foam::dictionaryEntry::dictionaryEntry ) : entry(key), - dictionary(parentDict, is) + dictionary(key, parentDict, is) { - name() += "::" + key; - is.fatalCheck ( "dictionaryEntry::dictionaryEntry" diff --git a/src/OpenFOAM/db/dictionary/dictionaryIO.C b/src/OpenFOAM/db/dictionary/dictionaryIO.C index 96196e3a11ab9a9b8e2913405f54f85f28262302..446aba828db4d353e2606a6eca374834f16abb62 100644 --- a/src/OpenFOAM/db/dictionary/dictionaryIO.C +++ b/src/OpenFOAM/db/dictionary/dictionaryIO.C @@ -95,11 +95,12 @@ bool Foam::dictionary::substituteKeyword(const word& keyword) Foam::dictionary::dictionary ( + const fileName& name, const dictionary& parentDict, Istream& is ) : - name_(is.name()), + dictionaryName(parentDict.name() + "::" + name), parent_(parentDict) { read(is); @@ -108,7 +109,7 @@ Foam::dictionary::dictionary Foam::dictionary::dictionary(Istream& is) : - name_(is.name()), + dictionaryName(is.name()), parent_(dictionary::null) { // Reset input mode as this is a "top-level" dictionary @@ -132,6 +133,7 @@ Foam::Istream& Foam::operator>>(Istream& is, dictionary& dict) functionEntries::inputModeEntry::clear(); dict.clear(); + dict.name() = is.name(); dict.read(is); return is; diff --git a/src/OpenFOAM/db/dictionary/entry/entry.H b/src/OpenFOAM/db/dictionary/entry/entry.H index ddaefe74402a3a04b6ac00e7270a11a1d6c54cb3..2286c4b4ebac1284d25869196c952f9bd39dba8c 100644 --- a/src/OpenFOAM/db/dictionary/entry/entry.H +++ b/src/OpenFOAM/db/dictionary/entry/entry.H @@ -108,10 +108,9 @@ public: static autoPtr<entry> New(Istream& is); - // Destructor - - virtual ~entry() - {} + //- Destructor + virtual ~entry() + {} // Member functions diff --git a/src/turbulenceModels/compressible/LES/LESModel/LESModel.C b/src/turbulenceModels/compressible/LES/LESModel/LESModel.C index c32cb077d8a82a5425ec70060bd6dfb371187e32..6ac295dea68c6bcf8ec213714e6fee2f40b45ed1 100644 --- a/src/turbulenceModels/compressible/LES/LESModel/LESModel.C +++ b/src/turbulenceModels/compressible/LES/LESModel/LESModel.C @@ -77,7 +77,7 @@ LESModel::LESModel ), printCoeffs_(lookupOrDefault<Switch>("printCoeffs", false)), - coeffDict_(subDictPtr(type + "Coeffs")), + coeffDict_(subOrEmptyDict(type + "Coeffs")), k0_("k0", dimVelocity*dimVelocity, SMALL), diff --git a/src/turbulenceModels/compressible/RAS/RASModel/RASModel.C b/src/turbulenceModels/compressible/RAS/RASModel/RASModel.C index 642fc686d695e583ef83fe4b3ea0bbada5c986c8..ffab28703b52976b621b8dd3506ded787962e2e6 100644 --- a/src/turbulenceModels/compressible/RAS/RASModel/RASModel.C +++ b/src/turbulenceModels/compressible/RAS/RASModel/RASModel.C @@ -79,7 +79,7 @@ RASModel::RASModel turbulence_(lookup("turbulence")), printCoeffs_(lookupOrDefault<Switch>("printCoeffs", false)), - coeffDict_(subDictPtr(type + "Coeffs")), + coeffDict_(subOrEmptyDict(type + "Coeffs")), k0_("k0", dimVelocity*dimVelocity, SMALL), epsilon0_("epsilon", k0_.dimensions()/dimTime, SMALL), diff --git a/src/turbulenceModels/incompressible/LES/LESModel/LESModel.C b/src/turbulenceModels/incompressible/LES/LESModel/LESModel.C index 76c2ef0ba475c0ba25be0728c787087a2bff2db4..fd7791d9f322cfae4c5ba3bd81335d714fe00903 100644 --- a/src/turbulenceModels/incompressible/LES/LESModel/LESModel.C +++ b/src/turbulenceModels/incompressible/LES/LESModel/LESModel.C @@ -76,7 +76,7 @@ LESModel::LESModel ), printCoeffs_(lookupOrDefault<Switch>("printCoeffs", false)), - coeffDict_(subDictPtr(type + "Coeffs")), + coeffDict_(subOrEmptyDict(type + "Coeffs")), k0_("k0", dimVelocity*dimVelocity, SMALL), delta_(LESdelta::New("delta", U.mesh(), *this)) diff --git a/src/turbulenceModels/incompressible/RAS/RASModel/RASModel.C b/src/turbulenceModels/incompressible/RAS/RASModel/RASModel.C index 9a6a447166bac7a3616a7092fc9ccf28b197afd8..1803075428c9e1ac2a8b9b0317fe9f9ef6f49b79 100644 --- a/src/turbulenceModels/incompressible/RAS/RASModel/RASModel.C +++ b/src/turbulenceModels/incompressible/RAS/RASModel/RASModel.C @@ -78,7 +78,7 @@ RASModel::RASModel turbulence_(lookup("turbulence")), printCoeffs_(lookupOrDefault<Switch>("printCoeffs", false)), - coeffDict_(subDictPtr(type + "Coeffs")), + coeffDict_(subOrEmptyDict(type + "Coeffs")), k0_("k0", dimVelocity*dimVelocity, SMALL), epsilon0_("epsilon", k0_.dimensions()/dimTime, SMALL),