Commit e7615709 authored by Mark OLESEN's avatar Mark OLESEN
Browse files

ENH: reduce number of warnings emitted by hierarchGeomDecomp

- it is sufficient to provide the total number of times that findBinary()
  failed instead of flooding the screen with messages

  Full verbose warnings still emitted when debugging is on.
parent d64a738d
......@@ -28,7 +28,7 @@ License
#include "PstreamReduceOps.H"
#include "SortableList.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
namespace Foam
{
......@@ -49,7 +49,8 @@ namespace Foam
);
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
void Foam::hierarchGeomDecomp::setDecompOrder()
{
......@@ -167,7 +168,7 @@ void Foam::hierarchGeomDecomp::calculateSortedWeightedSizes
// Find position in values so between minIndex and this position there
// are wantedSize elements.
void Foam::hierarchGeomDecomp::findBinary
bool Foam::hierarchGeomDecomp::findBinary
(
const label sizeTol,
const List<scalar>& values,
......@@ -228,20 +229,26 @@ void Foam::hierarchGeomDecomp::findBinary
if (returnReduce(hasNotChanged, andOp<bool>()))
{
WarningInFunction
<< "unable to find desired decomposition split, making do!"
<< endl;
break;
if (debug)
{
WarningInFunction
<< "unable to find desired decomposition split, making do!"
<< endl;
}
return false;
}
midValuePrev = midValue;
}
return true;
}
// Find position in values so between minIndex and this position there
// are wantedSize elements.
void Foam::hierarchGeomDecomp::findBinary
bool Foam::hierarchGeomDecomp::findBinary
(
const label sizeTol,
const List<scalar>& sortedWeightedSizes,
......@@ -308,19 +315,25 @@ void Foam::hierarchGeomDecomp::findBinary
if (returnReduce(hasNotChanged, andOp<bool>()))
{
WarningInFunction
<< "unable to find desired deomposition split, making do!"
<< endl;
break;
if (debug)
{
WarningInFunction
<< "Unable to find desired decomposition split, making do!"
<< endl;
}
return false;
}
midValuePrev = midValue;
}
return true;
}
// Sort points into bins according to one component. Recurses to next component.
void Foam::hierarchGeomDecomp::sortComponent
Foam::label Foam::hierarchGeomDecomp::sortComponent
(
const label sizeTol,
const pointField& points,
......@@ -331,7 +344,10 @@ void Foam::hierarchGeomDecomp::sortComponent
) const
{
// Current component
label compI = decompOrder_[componentIndex];
const label compI = decompOrder_[componentIndex];
// Track the number of times that findBinary() did not converge
label nWarnings = 0;
if (debug)
{
......@@ -426,7 +442,7 @@ void Foam::hierarchGeomDecomp::sortComponent
rightCoord = maxCoord;
// Calculate rightIndex/rightCoord to have wanted size
findBinary
bool ok = findBinary
(
sizeTol,
sortedCoord,
......@@ -439,6 +455,11 @@ void Foam::hierarchGeomDecomp::sortComponent
rightCoord
);
localSize = rightIndex - leftIndex;
if (!ok)
{
++nWarnings;
}
}
if (debug)
......@@ -477,7 +498,7 @@ void Foam::hierarchGeomDecomp::sortComponent
Pout.prefix() = " " + oldPrefix;
}
sortComponent
nWarnings += sortComponent
(
sizeTol,
points,
......@@ -497,11 +518,13 @@ void Foam::hierarchGeomDecomp::sortComponent
leftIndex += localSize;
leftCoord = rightCoord;
}
return nWarnings;
}
// Sort points into bins according to one component. Recurses to next component.
void Foam::hierarchGeomDecomp::sortComponent
Foam::label Foam::hierarchGeomDecomp::sortComponent
(
const label sizeTol,
const scalarField& weights,
......@@ -513,7 +536,10 @@ void Foam::hierarchGeomDecomp::sortComponent
) const
{
// Current component
label compI = decompOrder_[componentIndex];
const label compI = decompOrder_[componentIndex];
// Track the number of times that findBinary() did not converge
label nWarnings = 0;
if (debug)
{
......@@ -608,7 +634,7 @@ void Foam::hierarchGeomDecomp::sortComponent
rightCoord = maxCoord;
// Calculate rightIndex/rightCoord to have wanted size
findBinary
bool ok = findBinary
(
sizeTol,
sortedWeightedSizes,
......@@ -622,6 +648,11 @@ void Foam::hierarchGeomDecomp::sortComponent
rightCoord
);
localSize = rightIndex - leftIndex;
if (!ok)
{
++nWarnings;
}
}
if (debug)
......@@ -660,7 +691,7 @@ void Foam::hierarchGeomDecomp::sortComponent
Pout.prefix() = " " + oldPrefix;
}
sortComponent
nWarnings += sortComponent
(
sizeTol,
weights,
......@@ -681,6 +712,8 @@ void Foam::hierarchGeomDecomp::sortComponent
leftIndex += localSize;
leftCoord = rightCoord;
}
return nWarnings;
}
......@@ -722,24 +755,18 @@ Foam::labelList Foam::hierarchGeomDecomp::decompose
labelList finalDecomp(points.size(), Zero);
// Start off with every point sorted onto itself.
labelList slice(points.size());
forAll(slice, i)
{
slice[i] = i;
}
labelList slice(identity(points.size()));
pointField rotatedPoints(rotDelta_ & points);
// Calculate tolerance of cell distribution. For large cases finding
// distribution to the cell exact would cause too many iterations so allow
// some slack.
label allSize = points.size();
reduce(allSize, sumOp<label>());
const label allSize = returnReduce(points.size(), sumOp<label>());
const label sizeTol = max(1, label(1e-3*allSize/nDomains_));
// Sort recursive
sortComponent
const label nWarnings = sortComponent
(
sizeTol,
rotatedPoints,
......@@ -749,6 +776,13 @@ Foam::labelList Foam::hierarchGeomDecomp::decompose
finalDecomp
);
if (nWarnings)
{
WarningInFunction
<< "\nEncountered " << nWarnings << " occurrences where the desired"
" decomposition split could not be properly satisfied" << endl;
}
return finalDecomp;
}
......@@ -763,24 +797,18 @@ Foam::labelList Foam::hierarchGeomDecomp::decompose
labelList finalDecomp(points.size(), Zero);
// Start off with every point sorted onto itself.
labelList slice(points.size());
forAll(slice, i)
{
slice[i] = i;
}
labelList slice(identity(points.size()));
pointField rotatedPoints(rotDelta_ & points);
// Calculate tolerance of cell distribution. For large cases finding
// distribution to the cell exact would cause too many iterations so allow
// some slack.
label allSize = points.size();
reduce(allSize, sumOp<label>());
const label allSize = returnReduce(points.size(), sumOp<label>());
const label sizeTol = max(1, label(1e-3*allSize/nDomains_));
// Sort recursive
sortComponent
const label nWarnings = sortComponent
(
sizeTol,
weights,
......@@ -791,6 +819,13 @@ Foam::labelList Foam::hierarchGeomDecomp::decompose
finalDecomp
);
if (nWarnings)
{
WarningInFunction
<< "\nEncountered " << nWarnings << " occurrences where the desired"
" decomposition split could not be properly satisfied" << endl;
}
return finalDecomp;
}
......
......@@ -111,7 +111,9 @@ class hierarchGeomDecomp
//- Find midValue (at local index mid) such that the number of
// elements between mid and leftIndex are (globally summed) the
// wantedSize. Binary search.
static void findBinary
//
// \Return False if the binary search completed
static bool findBinary
(
const label sizeTol, // size difference considered acceptable
const List<scalar>&,
......@@ -126,7 +128,7 @@ class hierarchGeomDecomp
//- Find midValue (at local index mid) such that the number of
// elements between mid and leftIndex are (globally summed) the
// wantedSize. Binary search.
static void findBinary
static bool findBinary
(
const label sizeTol, // size difference considered acceptable
const List<scalar>& sortedWeightedSizes,
......@@ -140,7 +142,8 @@ class hierarchGeomDecomp
);
//- Recursively sort in x,y,z (or rather acc. to decompOrder_)
void sortComponent
// \return the number of warnings from findBinary
label sortComponent
(
const label sizeTol,
const pointField&,
......@@ -152,7 +155,8 @@ class hierarchGeomDecomp
//- Recursively sort in x,y,z (or rather acc. to decompOrder_)
//- Using weighted points.
void sortComponent
// \return the number of warnings from findBinary
label sortComponent
(
const label sizeTol,
const scalarField& weights,
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment