FreeFOAM The Cross-Platform CFD Toolkit
printMeshStats.C
Go to the documentation of this file.
1 #include "printMeshStats.H"
2 #include <OpenFOAM/polyMesh.H>
4 
5 #include <OpenFOAM/hexMatcher.H>
8 #include <OpenFOAM/pyrMatcher.H>
10 #include <OpenFOAM/tetMatcher.H>
11 
12 
13 void Foam::printMeshStats(const polyMesh& mesh, const bool allTopology)
14 {
15  Info<< "Mesh stats" << nl
16  << " points: "
17  << returnReduce(mesh.points().size(), sumOp<label>()) << nl;
18 
19  label nInternalPoints = returnReduce
20  (
21  mesh.nInternalPoints(),
22  sumOp<label>()
23  );
24 
25  if (nInternalPoints != -Pstream::nProcs())
26  {
27  Info<< " internal points: " << nInternalPoints << nl;
28 
29  if (returnReduce(mesh.nInternalPoints(), minOp<label>()) == -1)
30  {
31  WarningIn("Foam::printMeshStats(const polyMesh&, const bool)")
32  << "Some processors have their points sorted into internal"
33  << " and external and some do not." << endl
34  << "This can cause problems later on." << endl;
35  }
36  }
37 
38  if (allTopology && nInternalPoints != -Pstream::nProcs())
39  {
40  label nEdges = returnReduce(mesh.nEdges(), sumOp<label>());
41  label nInternalEdges = returnReduce
42  (
43  mesh.nInternalEdges(),
44  sumOp<label>()
45  );
46  label nInternal1Edges = returnReduce
47  (
48  mesh.nInternal1Edges(),
49  sumOp<label>()
50  );
51  label nInternal0Edges = returnReduce
52  (
53  mesh.nInternal0Edges(),
54  sumOp<label>()
55  );
56 
57  Info<< " edges: " << nEdges << nl
58  << " internal edges: " << nInternalEdges << nl
59  << " internal edges using one boundary point: "
60  << nInternal1Edges-nInternal0Edges << nl
61  << " internal edges using two boundary points: "
62  << nInternalEdges-nInternal1Edges << nl;
63  }
64 
65  Info<< " faces: "
66  << returnReduce(mesh.faces().size(), sumOp<label>()) << nl
67  << " internal faces: "
68  << returnReduce(mesh.faceNeighbour().size(), sumOp<label>()) << nl
69  << " cells: "
70  << returnReduce(mesh.cells().size(), sumOp<label>()) << nl
71  << " boundary patches: "
72  << mesh.boundaryMesh().size() << nl
73  << " point zones: "
74  << mesh.pointZones().size() << nl
75  << " face zones: "
76  << mesh.faceZones().size() << nl
77  << " cell zones: "
78  << mesh.cellZones().size() << nl
79  << endl;
80 
81 
82  // Construct shape recognizers
83  hexMatcher hex;
84  prismMatcher prism;
85  wedgeMatcher wedge;
86  pyrMatcher pyr;
87  tetWedgeMatcher tetWedge;
88  tetMatcher tet;
89 
90  // Counters for different cell types
91  label nHex = 0;
92  label nWedge = 0;
93  label nPrism = 0;
94  label nPyr = 0;
95  label nTet = 0;
96  label nTetWedge = 0;
97  label nUnknown = 0;
98 
99  for(label cellI = 0; cellI < mesh.nCells(); cellI++)
100  {
101  if (hex.isA(mesh, cellI))
102  {
103  nHex++;
104  }
105  else if (tet.isA(mesh, cellI))
106  {
107  nTet++;
108  }
109  else if (pyr.isA(mesh, cellI))
110  {
111  nPyr++;
112  }
113  else if (prism.isA(mesh, cellI))
114  {
115  nPrism++;
116  }
117  else if (wedge.isA(mesh, cellI))
118  {
119  nWedge++;
120  }
121  else if (tetWedge.isA(mesh, cellI))
122  {
123  nTetWedge++;
124  }
125  else
126  {
127  nUnknown++;
128  }
129  }
130 
131  reduce(nHex,sumOp<label>());
132  reduce(nPrism,sumOp<label>());
133  reduce(nWedge,sumOp<label>());
134  reduce(nPyr,sumOp<label>());
135  reduce(nTetWedge,sumOp<label>());
136  reduce(nTet,sumOp<label>());
137  reduce(nUnknown,sumOp<label>());
138 
139  Info<< "Overall number of cells of each type:" << nl
140  << " hexahedra: " << nHex << nl
141  << " prisms: " << nPrism << nl
142  << " wedges: " << nWedge << nl
143  << " pyramids: " << nPyr << nl
144  << " tet wedges: " << nTetWedge << nl
145  << " tetrahedra: " << nTet << nl
146  << " polyhedra: " << nUnknown
147  << nl << endl;
148 }
149 
150 // ************************ vim: set sw=4 sts=4 et: ************************ //