cyclicPolyPatch.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-2026 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 "cyclicPolyPatch.H"
28 #include "polyBoundaryMesh.H"
29 #include "polyMesh.H"
30 #include "demandDrivenData.H"
31 #include "OFstream.H"
32 #include "matchPoints.H"
33 #include "EdgeMap.H"
34 #include "Time.H"
35 #include "transformField.H"
36 #include "SubField.H"
37 
38 // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
39 
40 namespace Foam
41 {
43 
46 }
47 
48 
49 // * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * //
50 
52 {
54 }
55 
56 
58 (
59  const primitivePatch& referPatch,
60  pointField& nbrCtrs,
61  vectorField& nbrAreas,
62  pointField& nbrCc
63 )
64 {}
65 
66 
68 {
69  static_cast<cyclicTransform&>(*this) =
71  (
72  name(),
73  faceCentres(),
74  faceAreas(),
75  *this,
76  nbrPatchName(),
77  nbrPatch().faceCentres(),
78  nbrPatch().faceAreas(),
79  nbrPatch(),
80  matchTolerance()
81  );
82 }
83 
84 
86 (
87  PstreamBuffers& pBufs,
88  const pointField& p
89 )
90 {
92 }
93 
94 
96 (
97  PstreamBuffers& pBufs,
98  const pointField& p
99 )
100 {
101  polyPatch::movePoints(pBufs, p);
102 }
103 
104 
106 {
108 }
109 
110 
112 {
113  polyPatch::topoChange(pBufs);
114  deleteDemandDrivenData(coupledPointsPtr_);
115  deleteDemandDrivenData(coupledEdgesPtr_);
116 }
117 
118 
120 {
121  polyPatch::rename(newNames);
122  nbrPatch().nbrPatchName_ = newNames[index()];
123 }
124 
125 
126 void Foam::cyclicPolyPatch::reorder(const labelUList& newToOldIndex)
127 {
128  polyPatch::reorder(newToOldIndex);
129  if (nbrPatchIndex_ != -1)
130  {
131  nbrPatchIndex_ = findIndex(newToOldIndex, nbrPatchIndex_);
132  }
133 }
134 
135 
136 // * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * * //
137 
139 (
140  const word& name,
141  const label size,
142  const label start,
143  const label index,
144  const polyBoundaryMesh& bm
145 )
146 :
147  coupledPolyPatch(name, size, start, index, bm),
148  cyclicTransform(false),
149  nbrPatchName_(word::null),
150  nbrPatchIndex_(-1),
151  coupledPointsPtr_(nullptr),
152  coupledEdgesPtr_(nullptr),
153  ownToNbrOrderDataPtr_(nullptr),
154  ownToNbrCyclicOrderDataPtr_(nullptr),
155  ownToNbrDebugOrderDataPtr_(nullptr)
156 {}
157 
158 
160 (
161  const word& name,
162  const label size,
163  const label start,
164  const label index,
165  const polyBoundaryMesh& bm,
166  const word& nbrPatchName,
168 )
169 :
170  coupledPolyPatch(name, size, start, index, bm),
172  nbrPatchName_(nbrPatchName),
173  nbrPatchIndex_(-1),
174  coupledPointsPtr_(nullptr),
175  coupledEdgesPtr_(nullptr),
176  ownToNbrOrderDataPtr_(nullptr),
177  ownToNbrCyclicOrderDataPtr_(nullptr),
178  ownToNbrDebugOrderDataPtr_(nullptr)
179 {}
180 
181 
183 (
184  const word& name,
185  const dictionary& dict,
186  const label index,
187  const polyBoundaryMesh& bm,
188  const bool cyclicTransformDefaultIsNone
189 )
190 :
191  coupledPolyPatch(name, dict, index, bm),
192  cyclicTransform(dict, cyclicTransformDefaultIsNone),
193  nbrPatchName_(dict.lookupOrDefault("neighbourPatch", word::null)),
194  coupleGroup_(dict),
195  nbrPatchIndex_(-1),
196  coupledPointsPtr_(nullptr),
197  coupledEdgesPtr_(nullptr),
198  ownToNbrOrderDataPtr_(nullptr),
199  ownToNbrCyclicOrderDataPtr_(nullptr),
200  ownToNbrDebugOrderDataPtr_(nullptr)
201 {
202  if (nbrPatchName_ == word::null && !coupleGroup_.valid())
203  {
205  (
206  dict
207  ) << "No \"neighbourPatch\" provided." << endl
208  << exit(FatalIOError);
209  }
210 
211  if (nbrPatchName_ == name)
212  {
214  << "Neighbour patch name " << nbrPatchName_
215  << " cannot be the same as this patch " << name
216  << exit(FatalIOError);
217  }
218 
219  // Neighbour patch might not be valid yet so no transformation
220  // calculation possible.
221 }
222 
223 
225 (
226  const cyclicPolyPatch& pp,
227  const polyBoundaryMesh& bm
228 )
229 :
230  coupledPolyPatch(pp, bm),
231  cyclicTransform(pp),
232  nbrPatchName_(pp.nbrPatchName_),
233  coupleGroup_(pp.coupleGroup_),
234  nbrPatchIndex_(-1),
235  coupledPointsPtr_(nullptr),
236  coupledEdgesPtr_(nullptr),
237  ownToNbrOrderDataPtr_(nullptr),
238  ownToNbrCyclicOrderDataPtr_(nullptr),
239  ownToNbrDebugOrderDataPtr_(nullptr)
240 {
241  // Neighbour patch might not be valid yet so no transformation
242  // calculation possible.
243 }
244 
245 
247 (
248  const cyclicPolyPatch& pp,
249  const polyBoundaryMesh& bm,
250  const label index,
251  const label newSize,
252  const label newStart,
253  const word& neiName
254 )
255 :
256  coupledPolyPatch(pp, bm, index, newSize, newStart),
257  cyclicTransform(pp),
258  nbrPatchName_(neiName),
259  coupleGroup_(pp.coupleGroup_),
260  nbrPatchIndex_(-1),
261  coupledPointsPtr_(nullptr),
262  coupledEdgesPtr_(nullptr),
263  ownToNbrOrderDataPtr_(nullptr),
264  ownToNbrCyclicOrderDataPtr_(nullptr),
265  ownToNbrDebugOrderDataPtr_(nullptr)
266 {
267  if (neiName == name())
268  {
270  << "Neighbour patch name " << neiName
271  << " cannot be the same as this patch " << name()
272  << exit(FatalError);
273  }
274 
275  // Neighbour patch might not be valid yet so no transformation
276  // calculation possible.
277 }
278 
279 
280 // * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
281 
283 {
284  deleteDemandDrivenData(coupledPointsPtr_);
285  deleteDemandDrivenData(coupledEdgesPtr_);
286 }
287 
288 
289 // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
290 
292 {
293  if (nbrPatchName_.empty())
294  {
295  // Try and use patchGroup to find neighbourPatch and neighbourRegion
296  label patchID = coupleGroup_.findOtherPatchID(*this);
297 
298  nbrPatchName_ = boundaryMesh()[patchID].name();
299  }
300  return nbrPatchName_;
301 }
302 
303 
305 {
306  if (nbrPatchIndex_ == -1)
307  {
308  nbrPatchIndex_ = this->boundaryMesh().findIndex(nbrPatchName());
309 
310  if (nbrPatchIndex_ == -1)
311  {
313  << "Illegal neighbourPatch name " << nbrPatchName()
314  << endl << "Valid patch names are "
315  << this->boundaryMesh().names()
316  << exit(FatalError);
317  }
318 
319  // Check that it is a cyclic
320  const cyclicPolyPatch& nbrPatch = refCast<const cyclicPolyPatch>
321  (
322  this->boundaryMesh()[nbrPatchIndex_]
323  );
324 
325  if (nbrPatch.nbrPatchName() != name())
326  {
328  << "Patch " << name()
329  << " specifies neighbour patch " << nbrPatchName()
330  << endl << " but that in return specifies "
331  << nbrPatch.nbrPatchName()
332  << endl;
333  }
334  }
335  return nbrPatchIndex_;
336 }
337 
338 
340 {
341  if (!coupledPointsPtr_)
342  {
343  const faceList& nbrLocalFaces = nbrPatch().localFaces();
344  const labelList& nbrMeshPoints = nbrPatch().meshPoints();
345 
346  // Now all we know is that relative face index in *this is same
347  // as coupled face in nbrPatch and also that the 0th vertex
348  // corresponds.
349 
350  // From local point to nbrPatch or -1.
351  labelList coupledPoint(nPoints(), -1);
352 
353  forAll(*this, patchFacei)
354  {
355  const face& fA = localFaces()[patchFacei];
356  const face& fB = nbrLocalFaces[patchFacei];
357 
358  forAll(fA, indexA)
359  {
360  label patchPointA = fA[indexA];
361 
362  if (coupledPoint[patchPointA] == -1)
363  {
364  label indexB = (fB.size() - indexA) % fB.size();
365 
366  // Filter out points on wedge axis
367  if (meshPoints()[patchPointA] != nbrMeshPoints[fB[indexB]])
368  {
369  coupledPoint[patchPointA] = fB[indexB];
370  }
371  }
372  }
373  }
374 
375  coupledPointsPtr_ = new edgeList(nPoints());
376  edgeList& connected = *coupledPointsPtr_;
377 
378  // Extract coupled points.
379  label connectedI = 0;
380 
381  forAll(coupledPoint, i)
382  {
383  if (coupledPoint[i] != -1)
384  {
385  connected[connectedI++] = edge(i, coupledPoint[i]);
386  }
387  }
388 
389  connected.setSize(connectedI);
390 
391  if (debug)
392  {
393  OFstream str
394  (
395  mesh().time().path()
396  /name() + "_coupledPoints.obj"
397  );
398  label vertI = 0;
399 
400  Pout<< "Writing file " << str.name() << " with coordinates of "
401  << "coupled points" << endl;
402 
403  forAll(connected, i)
404  {
405  const point& a = points()[meshPoints()[connected[i][0]]];
406  const point& b = points()[nbrMeshPoints[connected[i][1]]];
407 
408  str<< "v " << a.x() << ' ' << a.y() << ' ' << a.z() << nl;
409  str<< "v " << b.x() << ' ' << b.y() << ' ' << b.z() << nl;
410  vertI += 2;
411 
412  str<< "l " << vertI-1 << ' ' << vertI << nl;
413  }
414  }
415  }
416  return *coupledPointsPtr_;
417 }
418 
419 
421 {
422  if (!coupledEdgesPtr_)
423  {
424  const edgeList& pointCouples = coupledPoints();
425 
426  // Build map from points on *this (A) to points on neighbourpatch (B)
427  Map<label> aToB(2*pointCouples.size());
428 
429  forAll(pointCouples, i)
430  {
431  const edge& e = pointCouples[i];
432 
433  aToB.insert(e[0], e[1]);
434  }
435 
436  // Map from edge on A to points (in B indices)
437  EdgeMap<label> edgeMap(nEdges());
438 
439  forAll(*this, patchFacei)
440  {
441  const labelList& fEdges = faceEdges()[patchFacei];
442 
443  forAll(fEdges, i)
444  {
445  label edgeI = fEdges[i];
446 
447  const edge& e = edges()[edgeI];
448 
449  // Convert edge end points to corresponding points on B side.
450  Map<label>::const_iterator fnd0 = aToB.find(e[0]);
451  if (fnd0 != aToB.end())
452  {
453  Map<label>::const_iterator fnd1 = aToB.find(e[1]);
454  if (fnd1 != aToB.end())
455  {
456  edgeMap.insert(edge(fnd0(), fnd1()), edgeI);
457  }
458  }
459  }
460  }
461 
462  // Use the edgeMap to get the edges on the B side.
463 
464  const cyclicPolyPatch& nbrPatch = this->nbrPatch();
465  const labelList& nbrMp = nbrPatch.meshPoints();
466  const labelList& mp = meshPoints();
467 
468 
469 
470  coupledEdgesPtr_ = new edgeList(edgeMap.size());
471  edgeList& coupledEdges = *coupledEdgesPtr_;
472  label coupleI = 0;
473 
474  forAll(nbrPatch, patchFacei)
475  {
476  const labelList& fEdges = nbrPatch.faceEdges()[patchFacei];
477 
478  forAll(fEdges, i)
479  {
480  label edgeI = fEdges[i];
481 
482  const edge& e = nbrPatch.edges()[edgeI];
483 
484  // Look up A edge from HashTable.
485  EdgeMap<label>::iterator iter = edgeMap.find(e);
486 
487  if (iter != edgeMap.end())
488  {
489  label edgeA = iter();
490  const edge& eA = edges()[edgeA];
491 
492  // Store correspondence. Filter out edges on wedge axis.
493  if
494  (
495  edge(mp[eA[0]], mp[eA[1]])
496  != edge(nbrMp[e[0]], nbrMp[e[1]])
497  )
498  {
499  coupledEdges[coupleI++] = edge(edgeA, edgeI);
500  }
501 
502  // Remove so we build unique list
503  edgeMap.erase(iter);
504  }
505  }
506  }
507  coupledEdges.setSize(coupleI);
508 
509 
510  // Some checks
511 
512  forAll(coupledEdges, i)
513  {
514  const edge& e = coupledEdges[i];
515 
516  if (e[0] < 0 || e[1] < 0)
517  {
519  << "Problem : at position " << i
520  << " illegal couple:" << e
521  << abort(FatalError);
522  }
523  }
524 
525  if (debug)
526  {
527  OFstream str
528  (
529  mesh().time().path()
530  /name() + "_coupledEdges.obj"
531  );
532  label vertI = 0;
533 
534  Pout<< "Writing file " << str.name() << " with centres of "
535  << "coupled edges" << endl;
536 
537  forAll(coupledEdges, i)
538  {
539  const edge& e = coupledEdges[i];
540 
541  const point& a = edges()[e[0]].centre(localPoints());
542  const point& b = nbrPatch.edges()[e[1]].centre
543  (
544  nbrPatch.localPoints()
545  );
546 
547  str<< "v " << a.x() << ' ' << a.y() << ' ' << a.z() << nl;
548  str<< "v " << b.x() << ' ' << b.y() << ' ' << b.z() << nl;
549  vertI += 2;
550 
551  str<< "l " << vertI-1 << ' ' << vertI << nl;
552  }
553  }
554  }
555  return *coupledEdgesPtr_;
556 }
557 
558 
560 (
562  const primitivePatch& pp
563 ) const
564 {
565  if (pp.empty())
566  {
567  return;
568  }
569 
570  if (owner())
571  {
572  ownToNbrOrderDataPtr_ = new ownToNbrOrderData();
573  if (coupledPolyPatch::debug)
574  {
575  ownToNbrDebugOrderDataPtr_ = new ownToNbrDebugOrderData();
576  }
577 
579  (
580  ownToNbrOrderDataPtr_(),
581  ownToNbrDebugOrderDataPtr_,
582  pp
583  );
584 
585  const scalarField magAreas(mag(pp.faceAreas()));
586 
587  ownToNbrCyclicOrderDataPtr_ = new ownToNbrCyclicOrderData();
588  ownToNbrCyclicOrderDataPtr_->ctr =
589  sum(pp.faceCentres()*magAreas)/sum(magAreas);
590  ownToNbrCyclicOrderDataPtr_->area = sum(pp.faceAreas());
591  }
592 }
593 
594 
596 (
597  PstreamBuffers& pBufs,
598  const primitivePatch& pp,
600  labelList& rotation
601 ) const
602 {
603  if (pp.empty())
604  {
605  return false;
606  }
607 
608  ownToNbrOrderData ownToNbr;
609  autoPtr<ownToNbrDebugOrderData> ownToNbrDebugPtr(nullptr);
610 
611  if (!owner())
612  {
613  ownToNbr = nbrPatch().ownToNbrOrderDataPtr_();
614  ownToNbrDebugPtr = nbrPatch().ownToNbrDebugOrderDataPtr_;
615 
616  cyclicTransform ct
617  (
618  name(),
619  pp.faceCentres(),
620  pp.faceAreas(),
621  *this,
622  nbrPatchName(),
623  pointField(1, nbrPatch().ownToNbrCyclicOrderDataPtr_->ctr),
624  vectorField(1, nbrPatch().ownToNbrCyclicOrderDataPtr_->area),
625  nbrPatch(),
626  matchTolerance()
627  );
628 
629  ownToNbr.transform(ct.transform());
630  if (ownToNbrDebugPtr.valid())
631  {
632  ownToNbrDebugPtr->transform(ct.transform());
633  }
634  }
635 
636  return
638  (
639  ownToNbr,
640  ownToNbrDebugPtr,
641  pp,
642  faceMap,
643  rotation
644  );
645 }
646 
647 
649 {
651 
652  if (!nbrPatchName_.empty())
653  {
654  writeEntry(os, "neighbourPatch", nbrPatchName_);
655  }
656 
657  coupleGroup_.write(os);
658 
660 }
661 
662 
663 // ************************************************************************* //
#define forAll(list, i)
Loop across all elements in list.
Definition: UList.H:449
Macros for easy insertion into run-time selection tables.
bool erase(const iterator &)
Erase a hashedEntry specified by given iterator.
Definition: HashTable.C:445
label size() const
Return number of elements in table.
Definition: HashTableI.H:65
bool insert(const Key &, const T &newElmt)
Insert a new hashedEntry.
Definition: HashTableI.H:80
iterator find(const Key &)
Find and return an iterator set at the hashedEntry.
Definition: HashTable.C:167
void size(const label)
Override size to be inconsistent with allocated storage.
Definition: ListI.H:164
void setSize(const label)
Reset size of List.
Definition: List.C:281
Output to file stream.
Definition: OFstream.H:87
const fileName & name() const
Return the name of the stream.
Definition: OFstream.H:121
An Ostream is an abstract base class for all output systems (streams, files, token lists,...
Definition: Ostream.H:57
const edgeList & edges() const
Return list of edges, address into LOCAL point list.
const labelList & meshPoints() const
Return labelList of mesh points in patch. They are constructed.
const Field< PointType > & faceAreas() const
Return face areas for patch.
const labelListList & faceEdges() const
Return face-edge addressing.
const Field< PointType > & localPoints() const
Return pointField of points in patch.
const Field< PointType > & faceCentres() const
Return face centres for patch.
Buffers for inter-processor communications streams (UOPstream, UIPstream).
bool empty() const
Return true if the UList is empty (ie, size() is zero)
Definition: UListI.H:325
const Cmpt & z() const
Definition: VectorI.H:87
const Cmpt & y() const
Definition: VectorI.H:81
const Cmpt & x() const
Definition: VectorI.H:75
const Vector< Cmpt > & centre(const Foam::List< Vector< Cmpt >> &) const
Return *this (used for point which is a typedef to Vector<scalar>.
Definition: VectorI.H:116
bool valid() const
Return true if the autoPtr valid (ie, the pointer is set)
Definition: autoPtrI.H:83
bool valid() const
Is a valid patchGroup.
The coupledPolyPatch is an abstract base class for patches that couple regions of the computational d...
virtual void write(Ostream &) const
Write the polyPatch data as a dictionary.
virtual bool order(const ownToNbrOrderData &ownToNbr, const autoPtr< ownToNbrDebugOrderData > &ownToNbrDebugPtr, const primitivePatch &, labelList &faceMap, labelList &rotation) const
Return new ordering for the given primitivePatch.
virtual void initOrder(ownToNbrOrderData &ownToNbr, autoPtr< ownToNbrDebugOrderData > &ownToNbrDebugPtr, const primitivePatch &) const
Initialise ordering for the given primitivePatch. Fills the.
Cyclic plane patch.
virtual void write(Ostream &) const
Write the polyPatch data as a dictionary.
virtual void initMovePoints(PstreamBuffers &, const pointField &)
Initialise the patches for moving points.
virtual void rename(const wordList &newNames)
Reset the patch name.
const edgeList & coupledEdges() const
Return connected edges (from patch local to neighbour patch local).
const word & nbrPatchName() const
Neighbour patch name.
virtual void calcGeometry(PstreamBuffers &)
Calculate the patch geometry.
const edgeList & coupledPoints() const
Return connected points (from patch local to neighbour patch local)
virtual void reorder(const labelUList &newToOldIndex)
Reset the patch index.
virtual void initOrder(PstreamBuffers &, const primitivePatch &) const
Initialise ordering for primitivePatch. Does not.
virtual void initCalcGeometry(PstreamBuffers &)
Initialise the calculation of the patch geometry.
virtual label nbrPatchIndex() const
Neighbour patchID.
virtual bool order(PstreamBuffers &, const primitivePatch &, labelList &faceMap, labelList &rotation) const
Return new ordering for primitivePatch.
cyclicPolyPatch(const word &name, const label size, const label start, const label index, const polyBoundaryMesh &bm)
Construct from components.
virtual void movePoints(PstreamBuffers &, const pointField &)
Correct patches after moving points.
virtual void initTopoChange(PstreamBuffers &)
Initialise the update of the patch topology.
virtual ~cyclicPolyPatch()
Destructor.
virtual void topoChange(PstreamBuffers &)
Update of the patch topology.
Cyclic plane transformation.
void write(Ostream &os) const
Write the data to a dictionary.
const transformer & transform() const
Return transformation between the coupled patches.
A list of keywords followed by any number of values (e.g. words and numbers) or sub-dictionaries.
Definition: dictionary.H:162
An edge is a list of two point labels. The functionality it provides supports the discretisation on a...
Definition: edge.H:61
A face is a list of labels corresponding to mesh vertices.
Definition: face.H:76
const word & name() const
Return name.
Foam::polyBoundaryMesh.
A patch is a list of labels that address the faces in the global face list.
Definition: polyPatch.H:71
virtual void rename(const wordList &newNames)
Reset the patch name.
Definition: polyPatch.C:81
virtual void reorder(const labelUList &newToOldIndex)
Reset the patch index.
Definition: polyPatch.C:87
virtual void movePoints(const pointField &p)
Correct patches after moving points.
Definition: polyPatch.C:56
virtual void initCalcGeometry(PstreamBuffers &)
Initialise the calculation of the patch geometry.
Definition: polyPatch.H:98
virtual void initTopoChange(PstreamBuffers &)
Initialise the update of the patch topology.
Definition: polyPatch.H:116
virtual void initMovePoints(PstreamBuffers &, const pointField &)
Initialise the patches for moving points.
Definition: polyPatch.H:109
virtual void topoChange(PstreamBuffers &)
Update of the patch topology.
Definition: polyPatch.C:68
A class for handling words, derived from string.
Definition: word.H:63
static const word null
An empty word.
Definition: word.H:78
Foam::fvMesh mesh(Foam::IOobject(regionName, runTime.name(), runTime, Foam::IOobject::MUST_READ), false)
Template functions to aid in the implementation of demand driven data.
#define FatalIOErrorInFunction(ios)
Report an error message using Foam::FatalIOError.
Definition: error.H:346
#define FatalErrorInFunction
Report an error message using Foam::FatalError.
Definition: error.H:334
const pointField & points
label nPoints
volScalarField & b
Definition: createFields.H:27
Determine correspondence between points. See below.
#define WarningInFunction
Report a warning using Foam::Warning.
const dimensionedScalar mp
Proton mass.
const dimensionSet time
Namespace for OpenFOAM.
errorManipArg< error, int > exit(error &err, const int errNo=1)
Definition: errorManip.H:124
const doubleScalar e
Definition: doubleScalar.H:106
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
addToRunTimeSelectionTable(polyPatch, mergedCyclicPolyPatch, word)
Ostream & endl(Ostream &os)
Add newline and flush stream.
Definition: Ostream.H:288
void transform(GeometricField< Type, GeoMesh > &rtf, const GeometricField< tensor, GeoMesh > &trf, const GeometricField< Type, GeoMesh > &tf)
void deleteDemandDrivenData(DataType *&dataPtr)
errorManip< error > abort(error &err)
Definition: errorManip.H:131
vectorField pointField
pointField is a vectorField.
Definition: pointFieldFwd.H:42
dimensioned< Type > sum(const DimensionedField< Type, GeoMesh, PrimitiveField > &df)
Pair< int > faceMap(const label facePi, const face &faceP, const label faceNi, const face &faceN)
IOerror FatalIOError
word name(const LagrangianState state)
Return a string representation of a Lagrangian state enumeration.
prefixOSstream Pout(cout, "Pout")
Definition: IOstreams.H:53
tmp< DimensionedField< scalar, GeoMesh, Field > > mag(const DimensionedField< Type, GeoMesh, PrimitiveField > &df)
label findIndex(const ListType &, typename ListType::const_reference, const label start=0)
Find first occurrence of given element and return index,.
error FatalError
List< edge > edgeList
Definition: edgeList.H:38
defineTypeNameAndDebug(atmosphericBoundaryLayer, 0)
void writeEntry(Ostream &os, const word &key, const DimensionedFieldFunction< DimensionedFieldType > &f)
static const char nl
Definition: Ostream.H:297
dictionary dict
volScalarField & p
static iteratorEnd end()
iteratorEnd set to beyond the end of any HashTable
Definition: HashTable.H:112
Data to pass from owner.initOrder to nbr.order if debugging.
Data to pass from owner.initOrder to nbr.order.
void transform(const transformer &tr)
Spatial transformation functions for primitive fields.