primitiveMeshCheckEdgeLength.C
Go to the documentation of this file.
1 /*---------------------------------------------------------------------------*\
2  ========= |
3  \\ / F ield | foam-extend: Open Source CFD
4  \\ / O peration | Version: 3.2
5  \\ / A nd | Web: http://www.foam-extend.org
6  \\/ M anipulation | For copyright notice see file Copyright
7 -------------------------------------------------------------------------------
8 License
9  This file is part of foam-extend.
10 
11  foam-extend is free software: you can redistribute it and/or modify it
12  under the terms of the GNU General Public License as published by the
13  Free Software Foundation, either version 3 of the License, or (at your
14  option) any later version.
15 
16  foam-extend is distributed in the hope that it will be useful, but
17  WITHOUT ANY WARRANTY; without even the implied warranty of
18  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19  General Public License for more details.
20 
21  You should have received a copy of the GNU General Public License
22  along with foam-extend. 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 // ************************************************************************* //
Foam::maxOp
Definition: ops.H:172
forAll
#define forAll(list, i)
Loop across all elements in list.
Definition: UList.H:406
Foam::HashTable::transfer
void transfer(HashTable< T, Key, Hash > &)
Transfer the contents of the argument table into this table.
Definition: HashTable.C:518
Foam::minOp
Definition: ops.H:173
Foam::endl
Ostream & endl(Ostream &os)
Add newline and flush stream.
Definition: Ostream.H:251
Foam::HashSet< label, Hash< label > >
nPoints
label nPoints
Definition: gmvOutputHeader.H:2
Foam::reduce
void reduce(const List< UPstream::commsStruct > &comms, T &Value, const BinaryOp &bop, const int tag, const label comm)
Definition: PstreamReduceOps.H:43
Foam::label
intWM_LABEL_SIZE_t label
A label is an int32_t or int64_t as specified by the pre-processor macro WM_LABEL_SIZE.
Definition: label.H:59
Foam::Field
Pre-declare SubField and related Field type.
Definition: Field.H:57
Foam::primitiveMesh::checkEdgeLength
bool checkEdgeLength(const bool report, const scalar minLenSqr, labelHashSet *setPtr=NULL) const
Check edge length.
Definition: primitiveMeshCheckEdgeLength.C:31
Foam::Info
messageStream Info
Foam::HashTable::size
label size() const
Return number of elements in table.
Definition: HashTableI.H:65
Foam::max
dimensioned< Type > max(const dimensioned< Type > &, const dimensioned< Type > &)
Foam::sqr
dimensionedSymmTensor sqr(const dimensionedVector &dv)
Definition: dimensionedSymmTensor.C:49
Foam::sumOp
Definition: ops.H:162
f
labelList f(nPoints)
Foam::List
A 1D array of objects of type <T>, where the size of the vector is known and used for subscript bound...
Definition: HashTable.H:59
Foam::sqrt
dimensionedScalar sqrt(const dimensionedScalar &ds)
Definition: dimensionedScalar.C:142
points
const pointField & points
Definition: gmvOutputHeader.H:1
Foam::HashSet::insert
bool insert(const Key &key)
Insert a new entry.
Definition: HashSet.H:116
Foam::face
A face is a list of labels corresponding to mesh vertices.
Definition: face.H:75
Foam::min
dimensioned< Type > min(const dimensioned< Type > &, const dimensioned< Type > &)
Foam::magSqr
dimensioned< scalar > magSqr(const dimensioned< Type > &)