void Foam::multiSolver::buildDictionary ( dictionary& outputDict, const dictionary& inputDict, const word& solverDomainName ) { outputDict.remove("sameAs"); outputDict.remove("multiLoad"); wordList alreadyMerged(0); wordList mergeMe(0); if (inputDict.found("default")) { if (outputDict.found("multiLoad")) { mergeMe = wordList(outputDict.lookup("multiLoad")); outputDict.remove("multiLoad"); } if (outputDict.found("sameAs")) { label newIndex(mergeMe.size()); mergeMe.setSize(newIndex + 1); mergeMe[newIndex] = word(outputDict.lookup("sameAs")); outputDict.remove("sameAs"); } } // We load solverDomain last, but we need its sameAs / multiLoad now if (inputDict.found(solverDomainName)) { const dictionary& solverDict(inputDict.subDict(solverDomainName)); if (solverDict.found("multiLoad")) { mergeMe.append(wordList(solverDict.lookup("multiLoad"))); } if (solverDict.found("sameAs")) { label newIndex(mergeMe.size()); mergeMe.setSize(newIndex + 1); mergeMe[newIndex] = word(solverDict.lookup("sameAs")); } } label mergeI(-1); while ((mergeI + 1) < mergeMe.size()) { mergeI++; bool skipMe(false); forAll(alreadyMerged, alreadyI) { if (mergeMe[mergeI] == alreadyMerged[alreadyI]) { skipMe = true; break; } } if (skipMe) { break; } outputDict.merge(inputDict.subDict(mergeMe[mergeI])); // Add to alreadyMerged label mergedIndex(alreadyMerged.size()); alreadyMerged.setSize(mergedIndex + 1); alreadyMerged[mergedIndex] = mergeMe[mergeI]; // Recursive search if (outputDict.found("multiLoad")) { mergeMe.append(wordList(outputDict.lookup("multiLoad"))); outputDict.remove("multiLoad"); } if (outputDict.found("sameAs")) { label newMergeMeIndex(mergeMe.size()); mergeMe.setSize(newMergeMeIndex + 1); mergeMe[newMergeMeIndex] = word(outputDict.lookup("sameAs")); outputDict.remove("sameAs"); } } // Merge the solverDomain name, even if it already has merged if (inputDict.found(solverDomainName)) { outputDict.merge(inputDict.subDict(solverDomainName)); // These have been handled already outputDict.remove("sameAs"); outputDict.remove("multiLoad"); } }