Initial commit for version 2.0.x patch release
[OpenFOAM-2.0.x.git] / src / OpenFOAM / meshes / primitiveMesh / primitiveMeshCheck / primitiveMeshCheckEdgeLength.C
blob7b34e4aa40af3d552548937b638b0003d6b19ac5
1 /*---------------------------------------------------------------------------*\
2   =========                 |
3   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
4    \\    /   O peration     |
5     \\  /    A nd           | Copyright (C) 2004-2010 OpenCFD Ltd.
6      \\/     M anipulation  |
7 -------------------------------------------------------------------------------
8 License
9     This file is part of OpenFOAM.
11     OpenFOAM is free software: you can redistribute it and/or modify it
12     under the terms of the GNU General Public License as published by
13     the Free Software Foundation, either version 3 of the License, or
14     (at your option) any later version.
16     OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
17     ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
18     FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
19     for more details.
21     You should have received a copy of the GNU General Public License
22     along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
24 \*---------------------------------------------------------------------------*/
26 #include "primitiveMesh.H"
28 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
30 bool Foam::primitiveMesh::checkEdgeLength
32     const bool report,
33     const scalar reportLenSqr,
34     labelHashSet* setPtr
35 ) const
37     const pointField& points = this->points();
38     const faceList& faces = this->faces();
40     scalar minLenSqr = sqr(GREAT);
41     scalar maxLenSqr = -sqr(GREAT);
43     labelHashSet smallEdgeSet(nPoints()/100);
45     forAll(faces, faceI)
46     {
47         const face& f = faces[faceI];
49         forAll(f, fp)
50         {
51             label fp1 = f.fcIndex(fp);
53             scalar magSqrE = magSqr(points[f[fp]] - points[f[fp1]]);
55             if (magSqrE < reportLenSqr)
56             {
57                 smallEdgeSet.insert(f[fp]);
58                 smallEdgeSet.insert(f[fp1]);
59             }
61             minLenSqr = min(minLenSqr, magSqrE);
62             maxLenSqr = max(maxLenSqr, magSqrE);
63         }
64     }
66     reduce(minLenSqr, minOp<scalar>());
67     reduce(maxLenSqr, maxOp<scalar>());
69     label nSmall = smallEdgeSet.size();
70     reduce(nSmall, sumOp<label>());
72     if (setPtr)
73     {
74         setPtr->transfer(smallEdgeSet);
75     }
77     if (nSmall > 0)
78     {
79         if (report)
80         {
81             Info<< "   *Edges too small, min/max edge length = "
82                 << sqrt(minLenSqr) << " " << sqrt(maxLenSqr)
83                 << ", number too small: " << nSmall << endl;
84         }
86         return true;
87     }
88     else
89     {
90         if (report)
91         {
92             Info<< "    Min/max edge length = "
93                 << sqrt(minLenSqr) << " " << sqrt(maxLenSqr)
94                 << " OK." << endl;
95         }
97         return false;
98     }
102 // ************************************************************************* //