Foam::label Foam::solution::upgradeSolverDict ( dictionary& dict, const bool verbose ) { label nChanged = 0; // backward compatibility: // recast primitive entries into dictionary entries forAllIter(dictionary, dict, iter) { if (!iter().isDict()) { Istream& is = iter().stream(); word name(is); dictionary subdict; if (name == "BICCG") { // special treatment for very old syntax subdict = BICCG::solverDict(is); } else if (name == "ICCG") { // special treatment for very old syntax subdict = ICCG::solverDict(is); } else { subdict.add("solver", name); subdict <<= dictionary(is); // preconditioner and smoother entries can be // 1) primitiveEntry w/o settings, // 2) or a dictionaryEntry. // transform primitiveEntry with settings -> dictionaryEntry forAll(subDictNames, dictI) { const word& dictName = subDictNames[dictI]; entry* ePtr = subdict.lookupEntryPtr(dictName,false,false); if (ePtr && !ePtr->isDict()) { Istream& is = ePtr->stream(); is >> name; if (!is.eof()) { dictionary newDict; newDict.add(dictName, name); newDict <<= dictionary(is); subdict.set(dictName, newDict); } } } } // write out information to help people adjust to the new syntax if (verbose && Pstream::master()) { Info<< "// using new solver syntax:\n" << iter().keyword() << subdict << endl; } // overwrite with dictionary entry dict.set(iter().keyword(), subdict); nChanged++; }
void setScoped ( dictionary& dict, const word& keyword, const bool overwrite, entry* d ) { if (keyword[0] == ':') { // Go up to top level and recurse to find entries setScoped ( const_cast<dictionary&>(dict.topDict()), keyword.substr(1, keyword.size()-1), overwrite, d ); return; } else { string::size_type dotPos = keyword.find('.'); if (dotPos == string::npos) { // Non-scoped lookup if (overwrite) { dict.set(d); } else { dict.add(d, false); } return; } else { if (dotPos == 0) { // Starting with a '.'. Go up for every 2nd '.' found const dictionary* dictPtr = &dict; string::size_type begVar = dotPos + 1; string::const_iterator iter = keyword.begin() + begVar; string::size_type endVar = begVar; while ( iter != keyword.end() && *iter == '.' ) { ++iter; ++endVar; // Go to parent if (&dictPtr->parent() == &dictionary::null) { FatalIOErrorInFunction(dict) << "No parent of current dictionary" << " when searching for " << keyword.substr ( begVar, keyword.size() - begVar ) << exit(FatalIOError); } dictPtr = &dictPtr->parent(); } setScoped ( const_cast<dictionary&>(*dictPtr), keyword.substr(endVar), overwrite, d ); return; } else { // Extract the first word word firstWord = keyword.substr(0, dotPos); const entry* entPtr = dict.lookupScopedEntryPtr ( firstWord, false, // Recursive false ); if (!entPtr || !entPtr->isDict()) { FatalIOErrorInFunction(dict) << "keyword " << firstWord << " is undefined in dictionary " << dict.name() << " or is not a dictionary" << endl << "Valid keywords are " << dict.keys() << exit(FatalIOError); } const dictionary& firstDict = entPtr->dict(); setScoped ( const_cast<dictionary&>(firstDict), keyword.substr(dotPos, keyword.size()-dotPos), overwrite, d ); return; } } } }