primitiveMeshCheckEdgeLength.C
Go to the documentation of this file.
1 /*---------------------------------------------------------------------------*\
2  ========= |
3  \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
4  \\ / O peration | Website: https://openfoam.org
5  \\ / A nd | Copyright (C) 2011-2018 OpenFOAM Foundation
6  \\/ M anipulation |
7 -------------------------------------------------------------------------------
8 License
9  This file is part of OpenFOAM.
10 
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.
15 
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.
20 
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/>.
23 
24 \*---------------------------------------------------------------------------*/
25 
26 #include "primitiveMesh.H"
27 
28 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
29 
31 (
32  const bool report,
33  const scalar reportLenSqr,
34  labelHashSet* setPtr
35 ) const
36 {
37  const pointField& points = this->points();
38  const faceList& faces = this->faces();
39 
40  scalar minLenSqr = sqr(great);
41  scalar maxLenSqr = -sqr(great);
42 
43  labelHashSet smallEdgeSet(nPoints()/100);
44 
45  forAll(faces, facei)
46  {
47  const face& f = faces[facei];
48 
49  forAll(f, fp)
50  {
51  label fp1 = f.fcIndex(fp);
52 
53  scalar magSqrE = magSqr(points[f[fp]] - points[f[fp1]]);
54 
55  if (magSqrE < reportLenSqr)
56  {
57  smallEdgeSet.insert(f[fp]);
58  smallEdgeSet.insert(f[fp1]);
59  }
60 
61  minLenSqr = min(minLenSqr, magSqrE);
62  maxLenSqr = max(maxLenSqr, magSqrE);
63  }
64  }
65 
66  reduce(minLenSqr, minOp<scalar>());
67  reduce(maxLenSqr, maxOp<scalar>());
68 
69  label nSmall = smallEdgeSet.size();
70  reduce(nSmall, sumOp<label>());
71 
72  if (setPtr)
73  {
74  setPtr->transfer(smallEdgeSet);
75  }
76 
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  }
85 
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  }
96 
97  return false;
98  }
99 }
100 
101 
102 // ************************************************************************* //
#define forAll(list, i)
Loop across all elements in list.
Definition: UList.H:434
layerAndWeight max(const layerAndWeight &a, const layerAndWeight &b)
A face is a list of labels corresponding to mesh vertices.
Definition: face.H:75
dimensionedSymmTensor sqr(const dimensionedVector &dv)
label fcIndex(const label i) const
Return the forward circular index, i.e. the next index.
Definition: UListI.H:58
dimensionedScalar sqrt(const dimensionedScalar &ds)
Ostream & endl(Ostream &os)
Add newline and flush stream.
Definition: Ostream.H:251
void transfer(HashTable< T, Key, Hash > &)
Transfer the contents of the argument table into this table.
Definition: HashTable.C:513
bool insert(const Key &key)
Insert a new entry.
Definition: HashSet.H:111
label size() const
Return number of elements in table.
Definition: HashTableI.H:65
const pointField & points
label nPoints
layerAndWeight min(const layerAndWeight &a, const layerAndWeight &b)
virtual bool checkEdgeLength(const bool report, const scalar minLenSqr, labelHashSet *setPtr=nullptr) const
Check edge length.
dimensioned< scalar > magSqr(const dimensioned< Type > &)
labelList f(nPoints)
void reduce(const List< UPstream::commsStruct > &comms, T &Value, const BinaryOp &bop, const int tag, const label comm)
messageStream Info