mirror of
https://develop.openfoam.com/Development/openfoam.git
synced 2025-11-28 03:28:01 +00:00
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:
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user