polyDualMeshApp.C
Go to the documentation of this file.
1 /*---------------------------------------------------------------------------*\
2  ========= |
3  \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
4  \\ / O peration |
5  \\ / A nd | Copyright (C) 2011-2015 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 Application
25  polyDualMesh
26 
27 Description
28  Calculates the dual of a polyMesh. Adheres to all the feature and patch
29  edges.
30 
31 Usage
32 
33  - polyDualMesh featureAngle
34 
35  Detects any boundary edge > angle and creates multiple boundary faces
36  for it. Normal behaviour is to have each point become a cell
37  (1.5 behaviour)
38 
39  \param -concaveMultiCells
40  Creates multiple cells for each point on a concave edge. Might limit
41  the amount of distortion on some meshes.
42 
43  \param -splitAllFaces
44  Normally only constructs a single face between two cells. This single face
45  might be too distorted. splitAllFaces will create a single face for every
46  original cell the face passes through. The mesh will thus have
47  multiple faces inbetween two cells! (so is not strictly upper-triangular
48  anymore - checkMesh will complain)
49 
50  \param -doNotPreserveFaceZones:
51  By default all faceZones are preserved by marking all faces, edges and
52  points on them as features. The -doNotPreserveFaceZones disables this
53  behaviour.
54 
55  Note: is just a driver for meshDualiser. Substitute your own
56  simpleMarkFeatures to have different behaviour.
57 
58 \*---------------------------------------------------------------------------*/
59 
60 #include "argList.H"
61 #include "Time.H"
62 #include "fvMesh.H"
63 #include "unitConversion.H"
64 #include "polyTopoChange.H"
65 #include "mapPolyMesh.H"
66 #include "PackedBoolList.H"
67 #include "meshTools.H"
68 #include "OFstream.H"
69 #include "meshDualiser.H"
70 #include "ReadFields.H"
71 #include "volFields.H"
72 #include "surfaceFields.H"
73 
74 using namespace Foam;
75 
76 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
77 
78 // Naive feature detection. All boundary edges with angle > featureAngle become
79 // feature edges. All points on feature edges become feature points. All
80 // boundary faces become feature faces.
81 void simpleMarkFeatures
82 (
83  const polyMesh& mesh,
84  const PackedBoolList& isBoundaryEdge,
85  const scalar featureAngle,
86  const bool concaveMultiCells,
87  const bool doNotPreserveFaceZones,
88 
89  labelList& featureFaces,
90  labelList& featureEdges,
91  labelList& singleCellFeaturePoints,
92  labelList& multiCellFeaturePoints
93 )
94 {
95  scalar minCos = Foam::cos(degToRad(featureAngle));
96 
98 
99  // Working sets
100  labelHashSet featureEdgeSet;
101  labelHashSet singleCellFeaturePointSet;
102  labelHashSet multiCellFeaturePointSet;
103 
104 
105  // 1. Mark all edges between patches
106  // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
107 
108  forAll(patches, patchI)
109  {
110  const polyPatch& pp = patches[patchI];
111  const labelList& meshEdges = pp.meshEdges();
112 
113  // All patch corner edges. These need to be feature points & edges!
114  for (label edgeI = pp.nInternalEdges(); edgeI < pp.nEdges(); edgeI++)
115  {
116  label meshEdgeI = meshEdges[edgeI];
117  featureEdgeSet.insert(meshEdgeI);
118  singleCellFeaturePointSet.insert(mesh.edges()[meshEdgeI][0]);
119  singleCellFeaturePointSet.insert(mesh.edges()[meshEdgeI][1]);
120  }
121  }
122 
123 
124 
125  // 2. Mark all geometric feature edges
126  // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
127  // Make distinction between convex features where the boundary point becomes
128  // a single cell and concave features where the boundary point becomes
129  // multiple 'half' cells.
130 
131  // Addressing for all outside faces
132  primitivePatch allBoundary
133  (
135  (
136  mesh.faces(),
139  ),
140  mesh.points()
141  );
142 
143  // Check for non-manifold points (surface pinched at point)
144  allBoundary.checkPointManifold(false, &singleCellFeaturePointSet);
145 
146  // Check for non-manifold edges (surface pinched at edge)
147  const labelListList& edgeFaces = allBoundary.edgeFaces();
148  const labelList& meshPoints = allBoundary.meshPoints();
149 
150  forAll(edgeFaces, edgeI)
151  {
152  const labelList& eFaces = edgeFaces[edgeI];
153 
154  if (eFaces.size() > 2)
155  {
156  const edge& e = allBoundary.edges()[edgeI];
157 
158  //Info<< "Detected non-manifold boundary edge:" << edgeI
159  // << " coords:"
160  // << allBoundary.points()[meshPoints[e[0]]]
161  // << allBoundary.points()[meshPoints[e[1]]] << endl;
162 
163  singleCellFeaturePointSet.insert(meshPoints[e[0]]);
164  singleCellFeaturePointSet.insert(meshPoints[e[1]]);
165  }
166  }
167 
168  // Check for features.
169  forAll(edgeFaces, edgeI)
170  {
171  const labelList& eFaces = edgeFaces[edgeI];
172 
173  if (eFaces.size() == 2)
174  {
175  label f0 = eFaces[0];
176  label f1 = eFaces[1];
177 
178  // check angle
179  const vector& n0 = allBoundary.faceNormals()[f0];
180  const vector& n1 = allBoundary.faceNormals()[f1];
181 
182  if ((n0 & n1) < minCos)
183  {
184  const edge& e = allBoundary.edges()[edgeI];
185  label v0 = meshPoints[e[0]];
186  label v1 = meshPoints[e[1]];
187 
188  label meshEdgeI = meshTools::findEdge(mesh, v0, v1);
189  featureEdgeSet.insert(meshEdgeI);
190 
191  // Check if convex or concave by looking at angle
192  // between face centres and normal
193  vector c1c0
194  (
195  allBoundary[f1].centre(allBoundary.points())
196  - allBoundary[f0].centre(allBoundary.points())
197  );
198 
199  if (concaveMultiCells && (c1c0 & n0) > SMALL)
200  {
201  // Found concave edge. Make into multiCell features
202  Info<< "Detected concave feature edge:" << edgeI
203  << " cos:" << (c1c0 & n0)
204  << " coords:"
205  << allBoundary.points()[v0]
206  << allBoundary.points()[v1]
207  << endl;
208 
209  singleCellFeaturePointSet.erase(v0);
210  multiCellFeaturePointSet.insert(v0);
211  singleCellFeaturePointSet.erase(v1);
212  multiCellFeaturePointSet.insert(v1);
213  }
214  else
215  {
216  // Convex. singleCell feature.
217  if (!multiCellFeaturePointSet.found(v0))
218  {
219  singleCellFeaturePointSet.insert(v0);
220  }
221  if (!multiCellFeaturePointSet.found(v1))
222  {
223  singleCellFeaturePointSet.insert(v1);
224  }
225  }
226  }
227  }
228  }
229 
230 
231  // 3. Mark all feature faces
232  // ~~~~~~~~~~~~~~~~~~~~~~~~~
233 
234  // Face centres that need inclusion in the dual mesh
235  labelHashSet featureFaceSet(mesh.nFaces()-mesh.nInternalFaces());
236  // A. boundary faces.
237  for (label faceI = mesh.nInternalFaces(); faceI < mesh.nFaces(); faceI++)
238  {
239  featureFaceSet.insert(faceI);
240  }
241 
242  // B. face zones.
243  const faceZoneMesh& faceZones = mesh.faceZones();
244 
245  if (doNotPreserveFaceZones)
246  {
247  if (faceZones.size() > 0)
248  {
250  << "Detected " << faceZones.size()
251  << " faceZones. These will not be preserved."
252  << endl;
253  }
254  }
255  else
256  {
257  if (faceZones.size() > 0)
258  {
259  Info<< "Detected " << faceZones.size()
260  << " faceZones. Preserving these by marking their"
261  << " points, edges and faces as features." << endl;
262  }
263 
264  forAll(faceZones, zoneI)
265  {
266  const faceZone& fz = faceZones[zoneI];
267 
268  Info<< "Inserting all faces in faceZone " << fz.name()
269  << " as features." << endl;
270 
271  forAll(fz, i)
272  {
273  label faceI = fz[i];
274  const face& f = mesh.faces()[faceI];
275  const labelList& fEdges = mesh.faceEdges()[faceI];
276 
277  featureFaceSet.insert(faceI);
278  forAll(f, fp)
279  {
280  // Mark point as multi cell point (since both sides of
281  // face should have different cells)
282  singleCellFeaturePointSet.erase(f[fp]);
283  multiCellFeaturePointSet.insert(f[fp]);
284 
285  // Make sure there are points on the edges.
286  featureEdgeSet.insert(fEdges[fp]);
287  }
288  }
289  }
290  }
291 
292  // Transfer to arguments
293  featureFaces = featureFaceSet.toc();
294  featureEdges = featureEdgeSet.toc();
295  singleCellFeaturePoints = singleCellFeaturePointSet.toc();
296  multiCellFeaturePoints = multiCellFeaturePointSet.toc();
297 }
298 
299 
300 // Dump features to .obj files
301 void dumpFeatures
302 (
303  const polyMesh& mesh,
304  const labelList& featureFaces,
305  const labelList& featureEdges,
306  const labelList& singleCellFeaturePoints,
307  const labelList& multiCellFeaturePoints
308 )
309 {
310  {
311  OFstream str("featureFaces.obj");
312  Info<< "Dumping centres of featureFaces to obj file " << str.name()
313  << endl;
314  forAll(featureFaces, i)
315  {
316  meshTools::writeOBJ(str, mesh.faceCentres()[featureFaces[i]]);
317  }
318  }
319  {
320  OFstream str("featureEdges.obj");
321  Info<< "Dumping featureEdges to obj file " << str.name() << endl;
322  label vertI = 0;
323 
324  forAll(featureEdges, i)
325  {
326  const edge& e = mesh.edges()[featureEdges[i]];
327  meshTools::writeOBJ(str, mesh.points()[e[0]]);
328  vertI++;
329  meshTools::writeOBJ(str, mesh.points()[e[1]]);
330  vertI++;
331  str<< "l " << vertI-1 << ' ' << vertI << nl;
332  }
333  }
334  {
335  OFstream str("singleCellFeaturePoints.obj");
336  Info<< "Dumping featurePoints that become a single cell to obj file "
337  << str.name() << endl;
338  forAll(singleCellFeaturePoints, i)
339  {
340  meshTools::writeOBJ(str, mesh.points()[singleCellFeaturePoints[i]]);
341  }
342  }
343  {
344  OFstream str("multiCellFeaturePoints.obj");
345  Info<< "Dumping featurePoints that become multiple cells to obj file "
346  << str.name() << endl;
347  forAll(multiCellFeaturePoints, i)
348  {
349  meshTools::writeOBJ(str, mesh.points()[multiCellFeaturePoints[i]]);
350  }
351  }
352 }
353 
354 
355 int main(int argc, char *argv[])
356 {
357  #include "addOverwriteOption.H"
359 
360  argList::validArgs.append("featureAngle [0-180]");
362  (
363  "splitAllFaces",
364  "have multiple faces inbetween cells"
365  );
367  (
368  "concaveMultiCells",
369  "split cells on concave boundary edges into multiple cells"
370  );
372  (
373  "doNotPreserveFaceZones",
374  "disable the default behaviour of preserving faceZones by having"
375  " multiple faces inbetween cells"
376  );
377 
378  #include "setRootCase.H"
379  #include "createTime.H"
380  #include "createMesh.H"
381 
382  const word oldInstance = mesh.pointsInstance();
383 
384  // Mark boundary edges and points.
385  // (Note: in 1.4.2 we can use the built-in mesh point ordering
386  // facility instead)
387  PackedBoolList isBoundaryEdge(mesh.nEdges());
388  for (label faceI = mesh.nInternalFaces(); faceI < mesh.nFaces(); faceI++)
389  {
390  const labelList& fEdges = mesh.faceEdges()[faceI];
391 
392  forAll(fEdges, i)
393  {
394  isBoundaryEdge.set(fEdges[i], 1);
395  }
396  }
397 
398  const scalar featureAngle = args.argRead<scalar>(1);
399  const scalar minCos = Foam::cos(degToRad(featureAngle));
400 
401  Info<< "Feature:" << featureAngle << endl
402  << "minCos :" << minCos << endl
403  << endl;
404 
405 
406  const bool splitAllFaces = args.optionFound("splitAllFaces");
407  if (splitAllFaces)
408  {
409  Info<< "Splitting all internal faces to create multiple faces"
410  << " between two cells." << nl
411  << endl;
412  }
413 
414  const bool overwrite = args.optionFound("overwrite");
415  const bool doNotPreserveFaceZones = args.optionFound
416  (
417  "doNotPreserveFaceZones"
418  );
419  const bool concaveMultiCells = args.optionFound("concaveMultiCells");
420  if (concaveMultiCells)
421  {
422  Info<< "Generating multiple cells for points on concave feature edges."
423  << nl << endl;
424  }
425 
426 
427  // Face(centre)s that need inclusion in the dual mesh
428  labelList featureFaces;
429  // Edge(centre)s ,,
430  labelList featureEdges;
431  // Points (that become a single cell) that need inclusion in the dual mesh
432  labelList singleCellFeaturePoints;
433  // Points (that become a multiple cells) ,,
434  labelList multiCellFeaturePoints;
435 
436  // Sample implementation of feature detection.
437  simpleMarkFeatures
438  (
439  mesh,
440  isBoundaryEdge,
441  featureAngle,
442  concaveMultiCells,
443  doNotPreserveFaceZones,
444 
445  featureFaces,
446  featureEdges,
447  singleCellFeaturePoints,
448  multiCellFeaturePoints
449  );
450 
451  // If we want to split all polyMesh faces into one dualface per cell
452  // we are passing through we also need a point
453  // at the polyMesh facecentre and edgemid of the faces we want to
454  // split.
455  if (splitAllFaces)
456  {
457  featureEdges = identity(mesh.nEdges());
458  featureFaces = identity(mesh.nFaces());
459  }
460 
461  // Write obj files for debugging
462  dumpFeatures
463  (
464  mesh,
465  featureFaces,
466  featureEdges,
467  singleCellFeaturePoints,
468  multiCellFeaturePoints
469  );
470 
471 
472 
473  // Read objects in time directory
474  IOobjectList objects(mesh, runTime.timeName());
475 
476  // Read vol fields.
478  ReadFields(mesh, objects, vsFlds);
479 
481  ReadFields(mesh, objects, vvFlds);
482 
484  ReadFields(mesh, objects, vstFlds);
485 
486  PtrList<volSymmTensorField> vsymtFlds;
487  ReadFields(mesh, objects, vsymtFlds);
488 
490  ReadFields(mesh, objects, vtFlds);
491 
492  // Read surface fields.
494  ReadFields(mesh, objects, ssFlds);
495 
497  ReadFields(mesh, objects, svFlds);
498 
500  ReadFields(mesh, objects, sstFlds);
501 
503  ReadFields(mesh, objects, ssymtFlds);
504 
506  ReadFields(mesh, objects, stFlds);
507 
508 
509  // Topo change container
510  polyTopoChange meshMod(mesh.boundaryMesh().size());
511 
512  // Mesh dualiser engine
513  meshDualiser dualMaker(mesh);
514 
515  // Insert all commands into polyTopoChange to create dual of mesh. This does
516  // all the hard work.
517  dualMaker.setRefinement
518  (
519  splitAllFaces,
520  featureFaces,
521  featureEdges,
522  singleCellFeaturePoints,
523  multiCellFeaturePoints,
524  meshMod
525  );
526 
527  // Create mesh, return map from old to new mesh.
528  autoPtr<mapPolyMesh> map = meshMod.changeMesh(mesh, false);
529 
530  // Update fields
531  mesh.updateMesh(map);
532 
533  // Optionally inflate mesh
534  if (map().hasMotionPoints())
535  {
536  mesh.movePoints(map().preMotionPoints());
537  }
538 
539  if (!overwrite)
540  {
541  runTime++;
542  }
543  else
544  {
545  mesh.setInstance(oldInstance);
546  }
547 
548  Info<< "Writing dual mesh to " << runTime.timeName() << endl;
549 
550  mesh.write();
551 
552  Info<< "End\n" << endl;
553 
554  return 0;
555 }
556 
557 
558 // ************************************************************************* //
Foam::argList::validArgs
static SLList< string > validArgs
A list of valid (mandatory) arguments.
Definition: argList.H:143
volFields.H
Foam::polyMesh::points
virtual const pointField & points() const
Return raw points.
Definition: polyMesh.C:979
meshTools.H
Foam::PackedBoolList
A bit-packed bool list.
Definition: PackedBoolList.H:63
Foam::word
A class for handling words, derived from string.
Definition: word.H:59
Foam::polyBoundaryMesh
Foam::polyBoundaryMesh.
Definition: polyBoundaryMesh.H:60
Foam::HashTable::toc
List< Key > toc() const
Return the table of contents.
Definition: HashTable.C:201
forAll
#define forAll(list, i)
Loop across all elements in list.
Definition: UList.H:406
Foam::meshTools::writeOBJ
void writeOBJ(Ostream &os, const point &pt)
Write obj representation of point.
Definition: meshTools.C:203
addOverwriteOption.H
Foam::SubList
A List obtained as a section of another List.
Definition: SubList.H:53
Foam::ReadFields
wordList ReadFields(const typename GeoMesh::Mesh &mesh, const IOobjectList &objects, PtrList< GeometricField< Type, PatchField, GeoMesh > > &fields, const bool syncPar=true, const bool readOldTime=false)
Helper routine to read Geometric fields.
mapPolyMesh.H
Foam::PackedBoolList::set
void set(const PackedList< 1 > &)
Set specified bits.
Definition: PackedBoolList.C:169
Foam::PrimitivePatch::nEdges
label nEdges() const
Return number of edges in patch.
Definition: PrimitivePatchTemplate.H:299
polyTopoChange.H
Foam::polyTopoChange
Direct mesh changes based on v1.3 polyTopoChange syntax.
Definition: polyTopoChange.H:97
Foam::edge
An edge is a list of two point labels. The functionality it provides supports the discretisation on a...
Definition: edge.H:58
Foam::argList::addBoolOption
static void addBoolOption(const word &opt, const string &usage="")
Add to a bool option to validOptions with usage information.
Definition: argList.C:98
unitConversion.H
Unit conversion functions.
Foam::fvMesh::movePoints
virtual tmp< scalarField > movePoints(const pointField &)
Move points, returns volumes swept by faces in motion.
Definition: fvMesh.C:726
Foam::polyMesh::boundaryMesh
const polyBoundaryMesh & boundaryMesh() const
Return boundary mesh.
Definition: polyMesh.H:421
Foam::endl
Ostream & endl(Ostream &os)
Add newline and flush stream.
Definition: Ostream.H:251
surfaceFields.H
Foam::surfaceFields.
Foam::primitiveMesh::edges
const edgeList & edges() const
Return mesh edges. Uses calcEdges.
Definition: primitiveMeshEdges.C:353
Foam::HashSet< label, Hash< label > >
Foam::primitiveMesh::nEdges
label nEdges() const
Definition: primitiveMeshI.H:41
Foam::polyMesh
Mesh consisting of general polyhedral cells.
Definition: polyMesh.H:74
OFstream.H
Foam::polyMesh::faceZones
const faceZoneMesh & faceZones() const
Return face zone mesh.
Definition: polyMesh.H:463
Foam::fvMesh::write
virtual bool write() const
Write mesh using IO settings from time.
Definition: fvMesh.C:873
Foam::polyMesh::pointsInstance
const fileName & pointsInstance() const
Return the current instance directory for points.
Definition: polyMesh.C:772
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::meshTools::findEdge
label findEdge(const edgeList &edges, const labelList &candidates, const label v0, const label v1)
Return edge among candidates that uses the two vertices.
Definition: meshTools.C:336
Foam::faceZone
A subset of mesh faces organised as a primitive patch.
Definition: faceZone.H:64
Foam::nl
static const char nl
Definition: Ostream.H:260
Foam::Info
messageStream Info
Foam::polyPatch
A patch is a list of labels that address the faces in the global face list.
Definition: polyPatch.H:66
PackedBoolList.H
argList.H
Foam::primitiveMesh::faceEdges
const labelListList & faceEdges() const
Definition: primitiveMeshEdges.C:366
Foam::fvMesh::updateMesh
virtual void updateMesh(const mapPolyMesh &mpm)
Update mesh corresponding to the given map.
Definition: fvMesh.C:802
Foam::ZoneMesh< faceZone, polyMesh >
f1
scalar f1
Definition: createFields.H:28
Foam::HashTable::erase
bool erase(const iterator &)
Erase a hashedEntry specified by given iterator.
main
int main(int argc, char *argv[])
Definition: postCalc.C:54
Foam::PtrList
A templated 1D list of pointers to objects of type <T>, where the size of the array is known and used...
Definition: List.H:61
Foam::identity
labelList identity(const label len)
Create identity map (map[i] == i) of given length.
Definition: ListOps.C:104
Foam::primitiveMesh::nInternalFaces
label nInternalFaces() const
Definition: primitiveMeshI.H:52
mesh
dynamicFvMesh & mesh
Definition: createDynamicFvMesh.H:18
Foam::HashTable::found
bool found(const Key &) const
Return true if hashedEntry is found in table.
Definition: HashTable.C:109
fvMesh.H
Foam
Namespace for OpenFOAM.
Definition: combustionModel.C:30
Foam::zone::name
const word & name() const
Return name.
Definition: zone.H:150
Foam::e
const double e
Elementary charge.
Definition: doubleFloat.H:94
Foam::IOobjectList
List of IOobjects with searching and retrieving facilities.
Definition: IOobjectList.H:50
Foam::OFstream
Output to file stream.
Definition: OFstream.H:81
Foam::PrimitivePatch::nInternalEdges
label nInternalEdges() const
Number of internal edges.
Definition: PrimitivePatchTemplate.C:232
Foam::polyMesh::setInstance
void setInstance(const fileName &)
Set the instance for mesh files.
Definition: polyMeshIO.C:32
Foam::autoPtr
An auto-pointer similar to the STL auto_ptr but with automatic casting to a reference to the type and...
Definition: PtrList.H:117
setRootCase.H
Foam::polyMesh::faces
virtual const faceList & faces() const
Return raw faces.
Definition: polyMesh.C:1004
meshDualiser.H
Foam::primitiveMesh::nFaces
label nFaces() const
Definition: primitiveMeshI.H:58
ReadFields.H
Helper routine to read fields.
f
labelList f(nPoints)
Foam::Vector< scalar >
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::primitiveMesh::faceCentres
const vectorField & faceCentres() const
Definition: primitiveMeshFaceCentresAndAreas.C:130
createMesh.H
Foam::PtrList::size
label size() const
Return the number of elements in the PtrList.
Definition: PtrListI.H:32
Foam::HashSet::insert
bool insert(const Key &key)
Insert a new entry.
Definition: HashSet.H:116
createTime.H
Foam::argList::optionFound
bool optionFound(const word &opt) const
Return true if the named option is found.
Definition: argListI.H:108
Foam::argList::argRead
T argRead(const label index) const
Read a value from the argument at index.
Definition: argListI.H:177
patches
patches[0]
Definition: createSingleCellMesh.H:36
Foam::face
A face is a list of labels corresponding to mesh vertices.
Definition: face.H:75
Foam::List::size
void size(const label)
Override size to be inconsistent with allocated storage.
Foam::argList::noParallel
static void noParallel()
Remove the parallel options.
Definition: argList.C:161
Foam::polyPatch::meshEdges
const labelList & meshEdges() const
Return global edge index for local edges.
Definition: polyPatch.C:354
args
Foam::argList args(argc, argv)
WarningInFunction
#define WarningInFunction
Report a warning using Foam::Warning.
Definition: messageStream.H:259
Foam::meshDualiser
Creates dual of polyMesh. Every point becomes a cell (or multiple cells for feature points),...
Definition: meshDualiser.H:66
Foam::PrimitivePatch
A list of faces which address into the list of points.
Definition: PrimitivePatchTemplate.H:88
Foam::degToRad
scalar degToRad(const scalar deg)
Conversion from degrees to radians.
Definition: unitConversion.H:45
Foam::cos
dimensionedScalar cos(const dimensionedScalar &ds)
Definition: dimensionedScalar.C:256