ENH: checkMesh : wedge & empty checking improved

- aspect ratio and cellDeterminant do not use 3rd direction
- wedges are properly check for having opposite one
This commit is contained in:
mattijs
2010-07-23 12:06:42 +01:00
parent c7bc9216d4
commit e3f20df12f
6 changed files with 415 additions and 56 deletions

View File

@ -2,7 +2,7 @@
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 1991-2009 OpenCFD Ltd.
\\ / A nd | Copyright (C) 1991-2010 OpenCFD Ltd.
\\/ M anipulation |
-------------------------------------------------------------------------------
License

View File

@ -2,7 +2,7 @@
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 1991-2009 OpenCFD Ltd.
\\ / A nd | Copyright (C) 1991-2010 OpenCFD Ltd.
\\/ M anipulation |
-------------------------------------------------------------------------------
License
@ -544,7 +544,8 @@ public:
(
const bool report = false,
labelHashSet* setPtr = NULL,
labelHashSet* highAspectSetPtr = NULL
labelHashSet* highAspectSetPtr = NULL,
const Vector<label>& solutionD = Vector<label>::one
) const;
//- Check for negative face areas
@ -645,7 +646,8 @@ public:
bool checkCellDeterminant
(
const bool report = false,
labelHashSet* setPtr = NULL
labelHashSet* setPtr = NULL,
const Vector<label>& solutionD = Vector<label>::one
) const;
//- Check for concave cells by the planes of faces

View File

@ -2,7 +2,7 @@
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 1991-2009 OpenCFD Ltd.
\\ / A nd | Copyright (C) 1991-2010 OpenCFD Ltd.
\\/ M anipulation |
-------------------------------------------------------------------------------
License
@ -98,13 +98,15 @@ bool Foam::primitiveMesh::checkClosedCells
(
const bool report,
labelHashSet* setPtr,
labelHashSet* aspectSetPtr
labelHashSet* aspectSetPtr,
const Vector<label>& meshD
) const
{
if (debug)
{
Info<< "bool primitiveMesh::checkClosedCells("
<< "const bool, labelHashSet*, labelHashSet*) const: "
<< "const bool, labelHashSet*, labelHashSet*"
<< ", const Vector<label>&) const: "
<< "checking whether cells are closed" << endl;
}
@ -171,6 +173,16 @@ bool Foam::primitiveMesh::checkClosedCells
const scalarField& vols = cellVolumes();
label nDims = 0;
for (direction dir = 0; dir < vector::nComponents; dir++)
{
if (meshD[dir] == 1)
{
nDims++;
}
}
// Check the sums
forAll(sumClosed, cellI)
{
@ -200,12 +212,26 @@ bool Foam::primitiveMesh::checkClosedCells
// Calculate the aspect ration as the maximum of Cartesian component
// aspect ratio to the total area hydraulic area aspect ratio
scalar aspectRatio = max
(
cmptMax(sumMagClosed[cellI])
/(cmptMin(sumMagClosed[cellI]) + VSMALL),
1.0/6.0*cmptSum(sumMagClosed[cellI])/pow(vols[cellI], 2.0/3.0)
);
scalar minCmpt = VGREAT;
scalar maxCmpt = -VGREAT;
for (direction dir = 0; dir < vector::nComponents; dir++)
{
if (meshD[dir] == 1)
{
minCmpt = min(minCmpt, sumMagClosed[cellI][dir]);
maxCmpt = max(maxCmpt, sumMagClosed[cellI][dir]);
}
}
scalar aspectRatio = maxCmpt/(minCmpt + VSMALL);
if (nDims == 3)
{
aspectRatio = max
(
aspectRatio,
1.0/6.0*cmptSum(sumMagClosed[cellI])/pow(vols[cellI], 2.0/3.0)
);
}
maxAspectRatio = max(maxAspectRatio, aspectRatio);
@ -1977,7 +2003,8 @@ bool Foam::primitiveMesh::checkFaceFaces
bool Foam::primitiveMesh::checkCellDeterminant
(
const bool report, // report,
labelHashSet* setPtr // setPtr
labelHashSet* setPtr, // setPtr
const Vector<label>& meshD
) const
{
if (debug)
@ -1987,6 +2014,22 @@ bool Foam::primitiveMesh::checkCellDeterminant
<< "checking for under-determined cells" << endl;
}
// Determine number of dimensions and (for 2D) missing dimension
label nDims = 0;
label twoD = -1;
for (direction dir = 0; dir < vector::nComponents; dir++)
{
if (meshD[dir] == 1)
{
nDims++;
}
else
{
twoD = dir;
}
}
const cellList& c = cells();
label nErrorCells = 0;
@ -1995,55 +2038,34 @@ bool Foam::primitiveMesh::checkCellDeterminant
scalar sumDet = 0;
label nSummed = 0;
forAll(c, cellI)
if (nDims == 1)
{
const labelList& curFaces = c[cellI];
// Calculate local normalization factor
scalar avgArea = 0;
label nInternalFaces = 0;
forAll(curFaces, i)
minDet = 1;
sumDet = c.size()*minDet;
nSummed = c.size();
}
else
{
forAll (c, cellI)
{
if (isInternalFace(curFaces[i]))
{
avgArea += mag(faceAreas()[curFaces[i]]);
const labelList& curFaces = c[cellI];
nInternalFaces++;
}
}
// Calculate local normalization factor
scalar avgArea = 0;
if (nInternalFaces == 0)
{
if (setPtr)
{
setPtr->insert(cellI);
}
nErrorCells++;
}
else
{
avgArea /= nInternalFaces;
symmTensor areaTensor(symmTensor::zero);
label nInternalFaces = 0;
forAll(curFaces, i)
{
if (isInternalFace(curFaces[i]))
{
areaTensor += sqr(faceAreas()[curFaces[i]]/avgArea);
avgArea += mag(faceAreas()[curFaces[i]]);
nInternalFaces++;
}
}
scalar determinant = mag(det(areaTensor));
minDet = min(determinant, minDet);
sumDet += determinant;
nSummed++;
if (determinant < 1e-3)
if (nInternalFaces == 0)
{
if (setPtr)
{
@ -2052,6 +2074,54 @@ bool Foam::primitiveMesh::checkCellDeterminant
nErrorCells++;
}
else
{
avgArea /= nInternalFaces;
symmTensor areaTensor(symmTensor::zero);
forAll(curFaces, i)
{
if (isInternalFace(curFaces[i]))
{
areaTensor += sqr(faceAreas()[curFaces[i]]/avgArea);
}
}
if (nDims == 2)
{
// Add the missing eigenvector (such that it does not
// affect the determinant)
if (twoD == 0)
{
areaTensor.xx() = 1;
}
else if (twoD == 1)
{
areaTensor.yy() = 1;
}
else
{
areaTensor.zz() = 1;
}
}
scalar determinant = mag(det(areaTensor));
minDet = min(determinant, minDet);
sumDet += determinant;
nSummed++;
if (determinant < 1e-3)
{
if (setPtr)
{
setPtr->insert(cellI);
}
nErrorCells++;
}
}
}
}