BUG: multiLevelCoeffs entry not mandatory (closes #620)

This commit is contained in:
Mark Olesen
2017-10-10 19:32:53 +02:00
parent e816d5cc80
commit 8acd80c54c

View File

@ -275,21 +275,27 @@ void Foam::multiLevelDecomp::decompose
const label nNext = methods_[nextLevel].nDomains(); const label nNext = methods_[nextLevel].nDomains();
const label nTotal = nCurrDomains * nNext; const label nTotal = nCurrDomains * nNext;
// Retrieve original level0 dictionary and modify number of domains // Get original level0 dictionary and modify numberOfSubdomains
dictionary::const_iterator iter = dictionary level0Dict;
decompositionDict_.optionalSubDict(typeName + "Coeffs").begin(); forAllConstIter(dictionary, methodsDict_, iter)
dictionary myDict = iter().dict(); {
myDict.set("numberOfSubdomains", nTotal); if (iter().isDict())
{
level0Dict = iter().dict();
break;
}
}
level0Dict.set("numberOfSubdomains", nTotal);
if (debug && Pstream::master()) if (debug && Pstream::master())
{ {
Pout<< "Reference decomposition with " << myDict << " :" Pout<< "Reference decomposition with " << level0Dict << " :"
<< endl; << endl;
} }
autoPtr<decompositionMethod> method0 = decompositionMethod::New autoPtr<decompositionMethod> method0 = decompositionMethod::New
( (
myDict level0Dict
); );
labelList dist labelList dist
( (
@ -364,31 +370,37 @@ void Foam::multiLevelDecomp::decompose
Foam::multiLevelDecomp::multiLevelDecomp(const dictionary& decompositionDict) Foam::multiLevelDecomp::multiLevelDecomp(const dictionary& decompositionDict)
: :
decompositionMethod(decompositionDict), decompositionMethod(decompositionDict),
methodsDict_(decompositionDict_.optionalSubDict(typeName + "Coeffs")) methodsDict_(decompositionDict_.subDict(typeName + "Coeffs"))
{ {
methods_.setSize(methodsDict_.size()); methods_.setSize(methodsDict_.size());
label i = 0; label nLevels = 0;
forAllConstIter(dictionary, methodsDict_, iter) forAllConstIter(dictionary, methodsDict_, iter)
{ {
methods_.set(i++, decompositionMethod::New(iter().dict())); // Ignore primitive entries which may be there for additional control
if (iter().isDict())
{
methods_.set(nLevels++, decompositionMethod::New(iter().dict()));
}
} }
label n = 1; methods_.setSize(nLevels);
label nTot = 1;
Info<< "decompositionMethod " << type() << " :" << endl; Info<< "decompositionMethod " << type() << " :" << endl;
forAll(methods_, i) forAll(methods_, i)
{ {
Info<< " level " << i << " decomposing with " << methods_[i].type() Info<< " level " << i << " decomposing with " << methods_[i].type()
<< " into " << methods_[i].nDomains() << " subdomains." << endl; << " into " << methods_[i].nDomains() << " subdomains." << endl;
n *= methods_[i].nDomains(); nTot *= methods_[i].nDomains();
} }
if (n != nDomains()) if (nTot != nDomains())
{ {
FatalErrorInFunction FatalErrorInFunction
<< "Top level decomposition specifies " << nDomains() << "Top level decomposition specifies " << nDomains()
<< " domains which is not equal to the product of" << " domains which is not equal to the product of"
<< " all sub domains " << n << " all sub domains " << nTot
<< exit(FatalError); << exit(FatalError);
} }
} }