faceZone.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 | www.openfoam.com
6  \\/ M anipulation |
7 -------------------------------------------------------------------------------
8  Copyright (C) 2011-2016 OpenFOAM Foundation
9  Copyright (C) 2017-2023 OpenCFD Ltd.
10 -------------------------------------------------------------------------------
11 License
12  This file is part of OpenFOAM.
13 
14  OpenFOAM is free software: you can redistribute it and/or modify it
15  under the terms of the GNU General Public License as published by
16  the Free Software Foundation, either version 3 of the License, or
17  (at your option) any later version.
18 
19  OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
20  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
21  FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
22  for more details.
23 
24  You should have received a copy of the GNU General Public License
25  along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
26 
27 \*---------------------------------------------------------------------------*/
28 
29 #include "faceZone.H"
31 #include "faceZoneMesh.H"
32 #include "polyMesh.H"
33 #include "primitiveMesh.H"
34 #include "mapPolyMesh.H"
35 #include "syncTools.H"
36 
37 // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
38 
39 namespace Foam
40 {
41  defineTypeNameAndDebug(faceZone, 0);
42  defineRunTimeSelectionTable(faceZone, dictionary);
43  addToRunTimeSelectionTable(faceZone, faceZone, dictionary);
44 }
45 
46 const char* const Foam::faceZone::labelsName = "faceLabels";
47 
48 
49 // * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
50 
51 void Foam::faceZone::setFlipMap(const bool val)
52 {
53  // Match size for flipMap
54  flipMap_.resize_nocopy(this->size());
55  flipMap_ = val;
56 }
57 
58 
59 // * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * //
60 
61 void Foam::faceZone::calcFaceZonePatch() const
62 {
63  DebugInFunction << "Calculating primitive patch" << endl;
64 
65  if (patchPtr_)
66  {
68  << "primitive face zone patch already calculated"
69  << abort(FatalError);
70  }
71 
72  patchPtr_.reset
73  (
75  (
76  faceList(size()),
77  zoneMesh().mesh().points()
78  )
79  );
80  auto& patch = *patchPtr_;
81 
82  const faceList& f = zoneMesh().mesh().faces();
83 
84  const labelList& addr = *this;
85  const boolList& flips = flipMap();
86 
87  forAll(addr, facei)
88  {
89  if (flips[facei])
90  {
91  patch[facei] = f[addr[facei]].reverseFace();
92  }
93  else
94  {
95  patch[facei] = f[addr[facei]];
96  }
97  }
98 
99  DebugInfo << "Finished calculating primitive patch" << endl;
100 }
101 
102 
103 void Foam::faceZone::calcCellLayers() const
104 {
105  DebugInFunction << "Calculating cell layers" << endl;
106 
107  if (frontCellsPtr_ || backCellsPtr_)
108  {
110  << "cell layers already calculated"
111  << abort(FatalError);
112  }
113  else
114  {
115  // Go through all the faces in the zone.
116  // Choose the front/back cell based on the face flip
117 
118  const labelList& own = zoneMesh().mesh().faceOwner();
119  const labelList& nei = zoneMesh().mesh().faceNeighbour();
120 
121  const labelList& addr = *this;
122  const boolList& flips = flipMap();
123 
124  frontCellsPtr_.reset(new labelList(addr.size()));
125  backCellsPtr_.reset(new labelList(addr.size()));
126 
127  auto& fronts = *frontCellsPtr_;
128  auto& backs = *backCellsPtr_;
129 
130  forAll(addr, facei)
131  {
132  const label ownCelli = own[addr[facei]];
133  const label neiCelli =
134  (
135  zoneMesh().mesh().isInternalFace(addr[facei])
136  ? nei[addr[facei]]
137  : -1
138  );
139 
140  if (flips[facei])
141  {
142  fronts[facei] = ownCelli;
143  backs[facei] = neiCelli;
144  }
145  else
146  {
147  fronts[facei] = neiCelli;
148  backs[facei] = ownCelli;
149  }
150  }
151  }
152 }
153 
154 
155 // Foam::label Foam::faceZone::getLayerCell
156 // (
157 // const side which,
158 // const label i
159 // ) const
160 // {
161 // const label facei = labelList::operator[](i);
162 // const bool flipped = flipMap_[i];
163 //
164 // if (which == side::FRONT ? flipped : !flipped)
165 // {
166 // return zoneMesh().mesh().faceOwner()[facei];
167 // }
168 // else if (zoneMesh().mesh().isInternalFace(facei))
169 // {
170 // return zoneMesh().mesh().faceNeighbour()[facei];
171 // }
172 // else
173 // {
174 // return -1;
175 // }
176 // }
177 //
178 //
179 // Foam::label Foam::faceZone::frontCell(const label i) const
180 // {
181 // return getLayerCell(side::FRONT, i);
182 // }
183 //
184 //
185 // Foam::label Foam::faceZone::backCell(const label i) const
186 // {
187 // return getLayerCell(side::BACK, i);
188 // }
189 
190 
191 void Foam::faceZone::checkAddressing() const
192 {
193  const labelList& addr = *this;
194 
195  if (addr.size() != flipMap_.size())
196  {
198  << "Size of addressing: " << addr.size()
199  << " size of flip map: " << flipMap_.size()
200  << abort(FatalError);
201  }
202 
203  // Note: nFaces, nCells might not be set yet on mesh so use owner size
204  const label nFaces = zoneMesh().mesh().faceOwner().size();
205 
206  for (const label facei : addr)
207  {
208  if (facei < 0 || facei >= nFaces)
209  {
211  << "Illegal face index " << facei
212  << " outside range 0.." << nFaces-1 << endl;
213  break; // Only report once
214  }
215  }
216 }
217 
218 
219 // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
220 
222 :
223  faceZone(word::null, 0, zm)
224 {}
225 
226 
228 (
229  const word& name,
230  const label index,
231  const faceZoneMesh& zm
232 )
233 :
234  zone(name, index),
235  zoneMesh_(zm)
236 {}
237 
238 
240 (
241  const word& name,
242  const labelUList& addr,
243  const bool flipMapValue,
244  const label index,
245  const faceZoneMesh& zm
246 )
247 :
248  faceZone(name, index, zm)
249 {
250  labelList::operator=(addr);
251  flipMap_.resize(labelList::size(), flipMapValue);
252 
253  checkAddressing();
254 }
255 
256 
258 (
259  const word& name,
260  labelList&& addr,
261  const bool flipMapValue,
262  const label index,
263  const faceZoneMesh& zm
264 )
265 :
266  faceZone(name, index, zm)
267 {
269  flipMap_.resize(labelList::size(), flipMapValue);
270  checkAddressing();
271 }
272 
273 
275 (
276  const word& name,
277  const labelUList& addr,
278  const boolUList& fm,
279  const label index,
280  const faceZoneMesh& zm
281 )
282 :
283  faceZone(name, index, zm)
284 {
285  labelList::operator=(addr);
286  flipMap_ = fm;
287 
288  // TBD
289  // if (flipMap_.empty())
290  // {
291  // // An empty flipMap is treated like 'false' instead of as an error
292  // flipMap_.resize(labelList::size(), false);
293  // }
294 
295  checkAddressing();
296 }
297 
298 
300 (
301  const word& name,
302  labelList&& addr,
303  boolList&& fm,
304  const label index,
305  const faceZoneMesh& zm
306 )
307 :
308  faceZone(name, index, zm)
309 {
310  labelList::transfer(addr);
311  flipMap_.transfer(fm);
312 
313  // TBD
314  // if (flipMap_.empty())
315  // {
316  // // An empty flipMap is treated like 'false' instead of as an error
317  // flipMap_.resize(labelList::size(), false);
318  // }
319 
320  checkAddressing();
321 }
322 
323 
325 (
326  const word& name,
327  const dictionary& dict,
328  const label index,
329  const faceZoneMesh& zm
330 )
331 :
332  zone(name, dict, this->labelsName, index),
333  flipMap_(dict.lookup("flipMap")), // OR: dict.get<boolList>("flipMap")
334  zoneMesh_(zm)
335 {
336  checkAddressing();
337 }
338 
339 
341 (
342  const faceZone& originalZone,
343  const Foam::zero,
344  const faceZoneMesh& zm,
345  const label newIndex
346 )
347 :
348  zone(originalZone, labelList(), newIndex),
349  zoneMesh_(zm)
350 {}
351 
352 
354 (
355  const faceZone& originalZone,
356  const Foam::zero,
357  const label index,
358  const faceZoneMesh& zm
359 )
360 :
361  zone(originalZone, labelList(), index),
362  zoneMesh_(zm)
363 {}
364 
365 
367 (
368  const faceZone& originalZone,
369  const labelUList& addr,
370  const boolUList& fm,
371  const label index,
372  const faceZoneMesh& zm
373 )
374 :
375  faceZone(originalZone, Foam::zero{}, index, zm)
376 {
377  labelList::operator=(addr);
378  flipMap_ = fm;
379 
380  checkAddressing();
381 }
382 
383 
385 (
386  const faceZone& originalZone,
387  labelList&& addr,
388  boolList&& fm,
389  const label index,
390  const faceZoneMesh& zm
391 )
392 :
393  faceZone(originalZone, Foam::zero{}, index, zm)
394 {
395  labelList::transfer(addr);
396  flipMap_.transfer(fm);
398  checkAddressing();
399 }
400 
401 
402 // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
404 Foam::label Foam::faceZone::whichFace(const label globalFaceID) const
405 {
406  return zone::localID(globalFaceID);
407 }
408 
409 
411 {
412  if (!patchPtr_)
413  {
414  calcFaceZonePatch();
415  }
416  return *patchPtr_;
417 }
418 
419 
421 {
422  if (!frontCellsPtr_)
423  {
424  calcCellLayers();
425  }
426  return *frontCellsPtr_;
427 }
428 
429 
431 {
432  if (!backCellsPtr_)
433  {
434  calcCellLayers();
435  }
436  return *backCellsPtr_;
437 }
438 
439 
441 {
442  if (!mePtr_)
443  {
444  mePtr_.reset
445  (
446  new labelList
447  (
448  this->patch().meshEdges
449  (
450  zoneMesh().mesh().edges(),
451  zoneMesh().mesh().pointEdges()
452  )
453  )
454  );
455  }
456 
457  return *mePtr_;
458 }
459 
460 
461 void Foam::faceZone::clearGeom()
462 {
463  patchPtr_.reset(nullptr);
464  frontCellsPtr_.reset(nullptr);
465  backCellsPtr_.reset(nullptr);
466  mePtr_.reset(nullptr);
467 }
468 
469 
471 {
473  clearGeom();
474 }
475 
476 
478 {
480  flipMap_.clear();
481 }
482 
483 
485 {
486  // TDB: clearGeom();
487  if (this == &zn)
488  {
489  return; // Self-assignment is a no-op
490  }
491 
492  clearAddressing();
493  labelList::transfer(static_cast<labelList&>(zn));
494  flipMap_.transfer(zn.flipMap_);
495  zn.clearAddressing();
496 }
497 
498 
500 {
501  // TDB: clearGeom();
502  if (this == &zn)
503  {
504  return; // Self-assignment is a no-op
505  }
506 
507  clearAddressing();
508  labelList::operator=(static_cast<const labelList&>(zn));
509  flipMap_ = zn.flipMap_;
510 }
511 
512 
514 (
515  const labelUList& addr,
516  const bool flipMapValue
517 )
518 {
519  clearAddressing();
520  labelList::operator=(addr);
521  setFlipMap(flipMapValue);
522 }
523 
524 
526 (
527  labelList&& addr,
528  const bool flipMapValue
529 )
530 {
531  clearAddressing();
532  labelList::transfer(addr);
533  setFlipMap(flipMapValue);
534 }
535 
536 
538 (
539  const labelUList& addr,
540  const boolUList& flipMap
541 )
542 {
543  clearAddressing();
544  labelList::operator=(addr);
545  flipMap_ = flipMap;
546 }
547 
548 
550 {
551  clearAddressing();
552 
553  labelList newAddressing(size());
554  boolList newFlipMap(flipMap_.size());
555  label nFaces = 0;
556 
557  const labelList& addr = *this;
558  const boolList& flips = flipMap();
559  const labelList& faceMap = mpm.reverseFaceMap();
560 
561  forAll(addr, i)
562  {
563  const label facei = addr[i];
564 
565  if (faceMap[facei] >= 0)
566  {
567  newAddressing[nFaces] = faceMap[facei];
568  newFlipMap[nFaces] = flips[i]; // Keep flip map
569  ++nFaces;
570  }
571  }
572 
573  newAddressing.resize(nFaces);
574  newFlipMap.resize(nFaces);
575 
576  labelList::transfer(newAddressing);
577  flipMap_.transfer(newFlipMap);
578 }
579 
581 bool Foam::faceZone::checkDefinition(const bool report) const
582 {
583  return zone::checkDefinition(zoneMesh().mesh().faces().size(), report);
584 }
585 
586 
587 bool Foam::faceZone::checkParallelSync(const bool report) const
588 {
589  const polyMesh& mesh = zoneMesh().mesh();
590  const polyBoundaryMesh& bm = mesh.boundaryMesh();
591 
592  bool hasError = false;
593 
594 
595  // Check that zone faces are synced
596  // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
597 
598  {
599  const labelList& addr = *this;
600  const boolList& flips = flipMap();
601 
602  boolList neiZoneFace(mesh.nBoundaryFaces(), false);
603  boolList neiZoneFlip(mesh.nBoundaryFaces(), false);
604 
605  forAll(addr, i)
606  {
607  const label facei = addr[i];
608 
609  if (!mesh.isInternalFace(facei))
610  {
611  const label bFacei = facei-mesh.nInternalFaces();
612  neiZoneFace[bFacei] = true;
613  neiZoneFlip[bFacei] = flips[i];
614  }
615  }
616  boolList myZoneFace(neiZoneFace);
617  boolList myZoneFlip(neiZoneFlip);
620 
621  forAll(addr, i)
622  {
623  const label facei = addr[i];
624  const label patchi = bm.whichPatch(facei);
625 
626  if (patchi != -1 && bm[patchi].coupled())
627  {
628  const label bFacei = facei-mesh.nInternalFaces();
629 
630  // Check face in zone on both sides
631  if (myZoneFace[bFacei] != neiZoneFace[bFacei])
632  {
633  hasError = true;
634 
635  if (report)
636  {
637  Pout<< " ***Problem with faceZone " << index()
638  << " named " << name()
639  << ". Face " << facei
640  << " on coupled patch " << bm[patchi].name()
641  << " is inconsistent with its coupled neighbour."
642  << endl;
643  }
644  else
645  {
646  // w/o report - can stop checking now
647  break;
648  }
649  }
650  else if (myZoneFlip[bFacei] == neiZoneFlip[bFacei])
651  {
652  // Flip state should be opposite.
653  hasError = true;
654 
655  if (report)
656  {
657  Pout<< " ***Problem with faceZone " << index()
658  << " named " << name()
659  << ". Face " << facei
660  << " on coupled patch " << bm[patchi].name()
661  << " has inconsistent flipMap across coupled faces."
662  << endl;
663  }
664  else
665  {
666  // w/o report - can stop checking now
667  break;
668  }
669  }
670  }
671  }
672  }
673 
674  return returnReduceOr(hasError);
675 }
676 
677 
679 {
680  if (patchPtr_)
681  {
682  patchPtr_->movePoints(pts);
683  }
684 }
685 
686 void Foam::faceZone::write(Ostream& os) const
687 {
688  os << nl << name()
689  << nl << static_cast<const labelList&>(*this)
690  << nl << flipMap();
691 }
692 
693 
695 {
696  os.beginBlock(name());
697 
698  os.writeEntry("type", type());
700  writeEntry(this->labelsName, os);
701  flipMap().writeEntry("flipMap", os);
703  os.endBlock();
704 }
705 
706 
707 // * * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * //
708 
709 void Foam::faceZone::operator=(const faceZone& zn)
710 {
711  if (this == &zn)
712  {
713  return; // Self-assignment is a no-op
714  }
715 
716  clearAddressing();
717  labelList::operator=(static_cast<const labelList&>(zn));
718  flipMap_ = zn.flipMap_;
719 }
720 
721 
722 // * * * * * * * * * * * * * * * Ostream Operator * * * * * * * * * * * * * //
723 
724 Foam::Ostream& Foam::operator<<(Ostream& os, const faceZone& zn)
725 {
726  zn.write(os);
728  return os;
729 }
730 
731 
732 // ************************************************************************* //
virtual void clearAddressing()
Clear addressing (remove lookup maps and other auxiliary information)
Definition: zone.C:146
dictionary dict
virtual void movePoints(const pointField &pts)
Correct patch after moving points.
Definition: faceZone.C:671
label localID(const label globalID) const
Lookup local address in zone for given global index.
Definition: zone.C:140
void resize(const label len)
Adjust allocated size of list.
Definition: ListI.H:160
void transfer(List< label > &list)
Transfer the contents of the argument List into this list and annul the argument list.
Definition: List.C:326
error FatalError
Error stream (stdout output on all processes), with additional &#39;FOAM FATAL ERROR&#39; header text and sta...
A list of keyword definitions, which are a keyword followed by a number of values (eg...
Definition: dictionary.H:129
#define FatalErrorInFunction
Report an error message using Foam::FatalError.
Definition: error.H:598
virtual bool check(const char *operation) const
Check IOstream status for given operation.
Definition: IOstream.C:45
const word & name() const noexcept
Return the object name.
Definition: IOobjectI.H:195
constexpr char nl
The newline &#39;\n&#39; character (0x0a)
Definition: Ostream.H:50
Ostream & endl(Ostream &os)
Add newline and flush stream.
Definition: Ostream.H:531
virtual bool checkParallelSync(const bool report=false) const
Check whether all procs have faces synchronised.
Definition: faceZone.C:580
virtual void clearPrimitives()
Clear primitive addressing.
Definition: zone.C:152
void resize_nocopy(const label len)
Adjust allocated size of list without necessarily.
Definition: ListI.H:175
Ostream & writeEntry(const keyType &key, const T &value)
Write a keyword/value entry.
Definition: Ostream.H:321
const labelList & frontCells() const
The front cells layer. Cells on the positive normal side of faces.
Definition: faceZone.C:413
label whichFace(const label globalCellID) const
Helper function to re-direct to zone::localID(...)
Definition: faceZone.C:397
Lookup type of boundary radiation properties.
Definition: lookup.H:57
faceZone(const faceZone &)=delete
No copy construct.
Class containing mesh-to-mesh mapping information after a change in polyMesh topology.
Definition: mapPolyMesh.H:157
Macros for easy insertion into run-time selection tables.
bool isInternalFace(const label faceIndex) const noexcept
Return true if given face label is internal to the mesh.
Pair< int > faceMap(const label facePi, const face &faceP, const label faceNi, const face &faceN)
const labelList & backCells() const
The back cells layer. Cells on the negative normal side of faces.
Definition: faceZone.C:423
#define forAll(list, i)
Loop across all elements in list.
Definition: stdFoam.H:421
void operator=(const faceZone &zn)
Assign addressing, clearing demand-driven data.
Definition: faceZone.C:702
List< face > faceList
List of faces.
Definition: faceListFwd.H:39
fileName::Type type(const fileName &name, const bool followLink=true)
Return the file type: DIRECTORY or FILE, normally following symbolic links.
Definition: POSIX.C:799
A list of faces which address into the list of points.
vectorField pointField
pointField is a vectorField.
Definition: pointFieldFwd.H:38
dynamicFvMesh & mesh
word name(const expressions::valueTypeCode typeCode)
A word representation of a valueTypeCode. Empty for expressions::valueTypeCode::INVALID.
Definition: exprTraits.C:127
const pointField & points
void operator=(const UList< label > &list)
Assignment to UList operator. Takes linear time.
Definition: List.C:360
Base class for mesh zones.
Definition: zone.H:59
const polyBoundaryMesh & boundaryMesh() const noexcept
Return boundary mesh.
Definition: polyMesh.H:608
A class for handling words, derived from Foam::string.
Definition: word.H:63
#define DebugInFunction
Report an information message using Foam::Info.
virtual void writeDict(Ostream &os) const
Write dictionary.
Definition: faceZone.C:687
virtual Ostream & endBlock()
Write end block group.
Definition: Ostream.C:108
virtual bool checkDefinition(const bool report=false) const =0
Check zone definition. Return true if in error.
virtual void resetAddressing(faceZone &&zn)
Move reset addressing and flip map from another zone.
Definition: faceZone.C:477
virtual bool write(const token &tok)=0
Write token to stream or otherwise handle it.
virtual void clearPrimitives()
Clear primitive addressing.
Definition: faceZone.C:470
const labelList & meshEdges() const
Return global edge index for local edges.
Definition: faceZone.C:433
label nInternalFaces() const noexcept
Number of internal faces.
void write(Ostream &os) const
Write (physicalType, inGroups) dictionary entries (without surrounding braces)
label whichPatch(const label meshFacei) const
Return patch index for a given mesh face index. Uses binary search.
errorManip< error > abort(error &err)
Definition: errorManip.H:139
#define DebugInfo
Report an information message using Foam::Info.
A polyBoundaryMesh is a polyPatch list with additional search methods and registered IO...
const primitiveFacePatch & patch() const
Return [demand-driven] reference to an equivalent primitive patch, with faces oriented according to f...
Definition: faceZone.C:403
virtual void write(Ostream &os) const
Write.
Definition: faceZone.C:679
An Ostream is an abstract base class for all output systems (streams, files, token lists...
Definition: Ostream.H:56
label size() const noexcept
The number of elements in the container.
Definition: UList.H:671
defineRunTimeSelectionTable(reactionRateFlameArea, dictionary)
OBJstream os(runTime.globalPath()/outputName)
#define FUNCTION_NAME
defineTypeNameAndDebug(combustionModel, 0)
labelList f(nPoints)
PrimitivePatch< List< face >, const pointField & > primitiveFacePatch
A PrimitivePatch with List storage for the faces, const reference for the point field.
virtual void clearAddressing()
Clear addressing (remove lookup maps, patch/geometric information)
Definition: faceZone.C:463
static const char *const labelsName
The name associated with the zone-labels dictionary entry ("faceLabels")
Definition: faceZone.H:144
Ostream & operator<<(Ostream &, const boundaryPatch &p)
Write boundaryPatch as dictionary entries (without surrounding braces)
Definition: boundaryPatch.C:77
#define WarningInFunction
Report a warning using Foam::Warning.
virtual void updateMesh(const mapPolyMesh &mpm)
Update for changes in topology.
Definition: faceZone.C:542
virtual bool checkDefinition(const bool report=false) const
Check zone definition. Return true if in error.
Definition: faceZone.C:574
const std::string patch
OpenFOAM patch number as a std::string.
virtual Ostream & beginBlock(const keyType &kw)
Write begin block group with the given name.
Definition: Ostream.C:90
A class representing the concept of 0 (zero) that can be used to avoid manipulating objects known to ...
Definition: zero.H:57
void writeEntry(Ostream &os) const
Write the UList with its compound type.
Definition: UListIO.C:30
Mesh consisting of general polyhedral cells.
Definition: polyMesh.H:74
A subset of mesh faces organised as a primitive patch.
Definition: faceZone.H:60
List< label > labelList
A List of labels.
Definition: List.H:62
bool coupled
label nBoundaryFaces() const noexcept
Number of boundary faces (== nFaces - nInternalFaces)
bool returnReduceOr(const bool value, const label comm=UPstream::worldComm)
Perform logical (or) MPI Allreduce on a copy. Uses UPstream::reduceOr.
Foam::faceZoneMesh.
List< bool > boolList
A List of bools.
Definition: List.H:60
prefixOSstream Pout
OSstream wrapped stdout (std::cout) with parallel prefix.
const labelList & reverseFaceMap() const
Reverse face map.
Definition: mapPolyMesh.H:617
Namespace for OpenFOAM.
static void swapBoundaryFaceList(const polyMesh &mesh, UList< T > &faceValues)
Swap coupled boundary face values. Uses eqOp.
Definition: syncTools.H:485
addToRunTimeSelectionTable(functionObject, pointHistory, dictionary)
const pointField & pts