diff --git a/applications/utilities/miscellaneous/foamDictionary/foamDictionary.C b/applications/utilities/miscellaneous/foamDictionary/foamDictionary.C index 8ef8a729e3..2092ab5659 100644 --- a/applications/utilities/miscellaneous/foamDictionary/foamDictionary.C +++ b/applications/utilities/miscellaneous/foamDictionary/foamDictionary.C @@ -27,11 +27,14 @@ Application Description Interrogates and manipulates dictionaries. + Supports parallel operation for decomposed dictionary files associated with + a case. These may be mesh or field files or any other decomposed + dictionaries. + Usage \b foamDictionary [OPTION] dictionary - \par -case \ - Select a case directory, - required to process decomposed fields in parallel cases + Select a case directory - \par -parallel Specify case as a parallel job @@ -105,7 +108,7 @@ Usage - Change bc parameter in parallel: \verbatim - mpirun -np 4 foamDictionary -case . 0/U \ + mpirun -np 4 foamDictionary 0.5/U \ -entry boundaryField.movingWall.value \ -set "uniform (2 0 0)" -parallel \endverbatim @@ -316,7 +319,9 @@ int main(int argc, char *argv[]) writeInfoHeader = false; argList::addNote("manipulates dictionaries"); + argList::validArgs.append("dictionary file"); + argList::addBoolOption("keywords", "list keywords"); argList::addOption("entry", "name", "report/select the named entry"); argList::addBoolOption @@ -389,7 +394,7 @@ int main(int argc, char *argv[]) entry::disableFunctionEntries = true; } - const fileName dictFileName(args[1]); + const fileName dictPath(args[1]); Time* runTimePtr = nullptr; localIOdictionary* localDictPtr = nullptr; @@ -397,9 +402,9 @@ int main(int argc, char *argv[]) dictionary* dictPtr = nullptr; IOstream::streamFormat dictFormat = IOstream::ASCII; - // If the case option is specified read the dictionary as a - // case localIOdictionary supporting parallel operation and file handlers - if (args.optionFound("case")) + // When running in parallel read the dictionary as a case localIOdictionary + // supporting file handlers + if (Pstream::parRun()) { if (!args.checkRootCase()) { @@ -408,6 +413,28 @@ int main(int argc, char *argv[]) runTimePtr = new Time(Time::controlDictName, args); + const wordList dictPathComponents(dictPath.components()); + + if (dictPathComponents.size() == 1) + { + FatalErrorInFunction + << "File name " << dictPath + << " does not contain an instance path needed in parallel" + << exit(FatalError, 1); + } + + const word instance = dictPathComponents[0]; + const fileName dictFileName + ( + SubList(dictPathComponents, dictPathComponents.size() - 1, 1) + ); + + scalar time; + if (readScalar(instance.c_str(), time)) + { + runTimePtr->setTime(time, 0); + } + const word oldTypeName = localIOdictionary::typeName; const_cast(localIOdictionary::typeName) = word::null; @@ -416,6 +443,7 @@ int main(int argc, char *argv[]) IOobject ( dictFileName, + instance, *runTimePtr, IOobject::MUST_READ, IOobject::NO_WRITE, @@ -428,7 +456,7 @@ int main(int argc, char *argv[]) else { dictPtr = new dictionary; - dictFormat = readDict(*dictPtr, dictFileName); + dictFormat = readDict(*dictPtr, dictPath); } dictionary& dict = localDictPtr ? *localDictPtr : *dictPtr; @@ -442,7 +470,7 @@ int main(int argc, char *argv[]) else if (args.optionFound("expand")) { IOobject::writeBanner(Info) - <<"//\n// " << dictFileName << "\n//\n"; + <<"//\n// " << dictPath << "\n//\n"; dict.dictionary::write(Info, false); IOobject::writeDivider(Info); @@ -656,7 +684,7 @@ int main(int argc, char *argv[]) } else if (dictPtr) { - OFstream os(dictFileName, dictFormat); + OFstream os(dictPath, dictFormat); IOobject::writeBanner(os); dictPtr->write(os, false); IOobject::writeEndDivider(os);