cyclicACMIPolyPatch.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) 2013-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 \*---------------------------------------------------------------------------*/
25 
26 #include "cyclicACMIPolyPatch.H"
27 #include "SubField.H"
28 #include "Time.H"
30 
31 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
32 
33 namespace Foam
34 {
35  defineTypeNameAndDebug(cyclicACMIPolyPatch, 0);
36 
37  addToRunTimeSelectionTable(polyPatch, cyclicACMIPolyPatch, word);
38  addToRunTimeSelectionTable(polyPatch, cyclicACMIPolyPatch, dictionary);
39 }
40 
41 const Foam::scalar Foam::cyclicACMIPolyPatch::tolerance_ = 1e-6;
42 
43 // * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * //
44 
46 {
47  if
48  (
49  !empty()
50  && (faceAreas0_.empty() || boundaryMesh().mesh().moving())
51  )
52  {
54  }
55 
56  const cyclicACMIPolyPatch& nbrACMI =
57  refCast<const cyclicACMIPolyPatch>(this->neighbPatch());
58 
59  if
60  (
61  !nbrACMI.empty()
62  && (nbrACMI.faceAreas0().empty() || boundaryMesh().mesh().moving())
63  )
64  {
65  nbrACMI.faceAreas0_ = nbrACMI.faceAreas();
66  }
67 }
68 
69 
71 (
73 ) const
74 {
75  if (owner())
76  {
77  const polyPatch& nonOverlapPatch = this->nonOverlapPatch();
78 
79  initPatchFaceAreas();
80 
81  // Reset patch face areas based on original patch for AMI calculation
82  vectorField::subField Sf = faceAreas();
83  vectorField::subField noSf = nonOverlapPatch.faceAreas();
84 
85  forAll(Sf, faceI)
86  {
87  Sf[faceI] = faceAreas0_[faceI];
88  noSf[faceI] = faceAreas0_[faceI];
89  }
90 
91  // Calculate the AMI using partial face-area-weighted
93  (
95  );
96 
97  srcMask_ =
98  min(scalar(1) - tolerance_, max(tolerance_, AMI().srcWeightsSum()));
99 
100  tgtMask_ =
101  min(scalar(1) - tolerance_, max(tolerance_, AMI().tgtWeightsSum()));
102 
103  forAll(Sf, faceI)
104  {
105  Sf[faceI] *= srcMask_[faceI];
106  noSf[faceI] *= 1.0 - srcMask_[faceI];
107  }
108 
109  setNeighbourFaceAreas();
110 
111  // Set the updated flag
112  updated_ = true;
113  }
114 }
115 
116 
118 {
119  const cyclicACMIPolyPatch& cp =
120  refCast<const cyclicACMIPolyPatch>(this->neighbPatch());
121  const polyPatch& pp = cp.nonOverlapPatch();
122 
123  const vectorField& faceAreas0 = cp.faceAreas0();
124 
125  if (tgtMask_.size() == cp.size())
126  {
127  vectorField::subField Sf = cp.faceAreas();
128  vectorField::subField noSf = pp.faceAreas();
129 
130  forAll(Sf, faceI)
131  {
132  Sf[faceI] = tgtMask_[faceI]*faceAreas0[faceI];
133  noSf[faceI] = (1.0 - tgtMask_[faceI])*faceAreas0[faceI];
134  }
135  }
136  else
137  {
139  << "Target mask size differs to that of the neighbour patch\n"
140  << " May occur when decomposing." << endl;
141  }
142 }
143 
144 
146 {
147  // Note: cyclicAMIPolyPatch clears AMI so do first
149 
150  // Initialise the AMI so that base geometry (e.g. cell volumes) are
151  // correctly evaluated before e.g. any of the processor patches gets
152  // hit (since uses cell volumes in its initGeometry)
153  resetAMI();
154 }
155 
156 
158 {
160 }
161 
162 
164 (
165  PstreamBuffers& pBufs,
166  const pointField& p
167 )
168 {
169  // Note: cyclicAMIPolyPatch clears AMI so do first
171 
172  // Initialise the AMI so that base geometry (e.g. cell volumes) are
173  // correctly evaluated before e.g. any of the processor patches gets
174  // hit (since uses cell volumes in its initGeometry)
175  resetAMI();
176 }
177 
178 
180 (
181  PstreamBuffers& pBufs,
182  const pointField& p
183 )
184 {
186 }
187 
188 
190 {
192 }
193 
194 
196 {
198 }
199 
200 
202 {
204 }
205 
206 
208 {
209  return srcMask_;
210 }
211 
212 
214 {
215  return tgtMask_;
216 }
217 
218 
219 // * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * * * //
220 
222 (
223  const word& name,
224  const label size,
225  const label start,
226  const label index,
227  const polyBoundaryMesh& bm,
228  const word& patchType,
230 )
231 :
232  cyclicAMIPolyPatch(name, size, start, index, bm, patchType, transform),
233  faceAreas0_(),
234  nonOverlapPatchName_(word::null),
235  nonOverlapPatchID_(-1),
236  srcMask_(),
237  tgtMask_(),
238  updated_(false)
239 {
240  AMIRequireMatch_ = false;
241 
242  // Non-overlapping patch might not be valid yet so cannot determine
243  // associated patchID
244 }
245 
246 
248 (
249  const word& name,
250  const dictionary& dict,
251  const label index,
252  const polyBoundaryMesh& bm,
253  const word& patchType
254 )
255 :
256  cyclicAMIPolyPatch(name, dict, index, bm, patchType),
257  faceAreas0_(),
258  nonOverlapPatchName_(dict.lookup("nonOverlapPatch")),
259  nonOverlapPatchID_(-1),
260  srcMask_(),
261  tgtMask_(),
262  updated_(false)
263 {
264  AMIRequireMatch_ = false;
265 
266  if (nonOverlapPatchName_ == name)
267  {
269  (
270  dict
271  ) << "Non-overlapping patch name " << nonOverlapPatchName_
272  << " cannot be the same as this patch " << name
273  << exit(FatalIOError);
274  }
275 
276  // Non-overlapping patch might not be valid yet so cannot determine
277  // associated patchID
278 }
279 
280 
282 (
283  const cyclicACMIPolyPatch& pp,
284  const polyBoundaryMesh& bm
285 )
286 :
287  cyclicAMIPolyPatch(pp, bm),
288  faceAreas0_(),
289  nonOverlapPatchName_(pp.nonOverlapPatchName_),
290  nonOverlapPatchID_(-1),
291  srcMask_(),
292  tgtMask_(),
293  updated_(false)
294 {
295  AMIRequireMatch_ = false;
296 
297  // Non-overlapping patch might not be valid yet so cannot determine
298  // associated patchID
299 }
300 
301 
303 (
304  const cyclicACMIPolyPatch& pp,
305  const polyBoundaryMesh& bm,
306  const label index,
307  const label newSize,
308  const label newStart,
309  const word& nbrPatchName,
310  const word& nonOverlapPatchName
311 )
312 :
313  cyclicAMIPolyPatch(pp, bm, index, newSize, newStart, nbrPatchName),
314  faceAreas0_(),
315  nonOverlapPatchName_(nonOverlapPatchName),
316  nonOverlapPatchID_(-1),
317  srcMask_(),
318  tgtMask_(),
319  updated_(false)
320 {
321  AMIRequireMatch_ = false;
322 
323  if (nonOverlapPatchName_ == name())
324  {
326  << "Non-overlapping patch name " << nonOverlapPatchName_
327  << " cannot be the same as this patch " << name()
328  << exit(FatalError);
329  }
330 
331  // Non-overlapping patch might not be valid yet so cannot determine
332  // associated patchID
333 }
334 
335 
337 (
338  const cyclicACMIPolyPatch& pp,
339  const polyBoundaryMesh& bm,
340  const label index,
341  const labelUList& mapAddressing,
342  const label newStart
343 )
344 :
345  cyclicAMIPolyPatch(pp, bm, index, mapAddressing, newStart),
346  faceAreas0_(),
347  nonOverlapPatchName_(pp.nonOverlapPatchName_),
348  nonOverlapPatchID_(-1),
349  srcMask_(),
350  tgtMask_(),
351  updated_(false)
352 {
353  AMIRequireMatch_ = false;
354 }
355 
356 
357 // * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
358 
360 {}
361 
362 
363 // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
364 
366 {
367  const polyPatch& pp = this->boundaryMesh()[neighbPatchID()];
368  return refCast<const cyclicACMIPolyPatch>(pp);
369 }
370 
371 
373 {
374  if (nonOverlapPatchID_ == -1)
375  {
376  nonOverlapPatchID_ =
377  this->boundaryMesh().findPatchID(nonOverlapPatchName_);
378 
379  if (nonOverlapPatchID_ == -1)
380  {
382  << "Illegal non-overlapping patch name " << nonOverlapPatchName_
383  << nl << "Valid patch names are "
384  << this->boundaryMesh().names()
385  << exit(FatalError);
386  }
387 
388  if (nonOverlapPatchID_ < index())
389  {
391  << "Boundary ordering error: " << type()
392  << " patch must be defined prior to its non-overlapping patch"
393  << nl
394  << type() << " patch: " << name() << ", ID:" << index() << nl
395  << "Non-overlap patch: " << nonOverlapPatchName_
396  << ", ID:" << nonOverlapPatchID_ << nl
397  << exit(FatalError);
398  }
399 
400  const polyPatch& noPp = this->boundaryMesh()[nonOverlapPatchID_];
401 
402  bool ok = true;
403 
404  if (size() == noPp.size())
405  {
406  const scalarField magSf(mag(faceAreas()));
407  const scalarField noMagSf(mag(noPp.faceAreas()));
408 
409  forAll(magSf, faceI)
410  {
411  scalar ratio = mag(magSf[faceI]/(noMagSf[faceI] + ROOTVSMALL));
412 
413  if (ratio - 1 > tolerance_)
414  {
415  ok = false;
416  break;
417  }
418  }
419  }
420  else
421  {
422  ok = false;
423  }
424 
425  if (!ok)
426  {
428  << "Inconsistent ACMI patches " << name() << " and "
429  << noPp.name() << ". Patches should have identical topology"
430  << exit(FatalError);
431  }
432  }
433 
434  return nonOverlapPatchID_;
435 }
436 
437 
439 (
440  const primitivePatch& referPatch,
441  const pointField& thisCtrs,
442  const vectorField& thisAreas,
443  const pointField& thisCc,
444  const pointField& nbrCtrs,
445  const vectorField& nbrAreas,
446  const pointField& nbrCc
447 )
448 {
450  (
451  referPatch,
452  thisCtrs,
453  thisAreas,
454  thisCc,
455  nbrCtrs,
456  nbrAreas,
457  nbrCc
458  );
459 }
460 
461 
463 (
464  PstreamBuffers& pBufs,
465  const primitivePatch& pp
466 ) const
467 {
469 }
470 
471 
473 (
474  PstreamBuffers& pBufs,
475  const primitivePatch& pp,
477  labelList& rotation
478 ) const
479 {
480  return cyclicAMIPolyPatch::order(pBufs, pp, faceMap, rotation);
481 }
482 
483 
485 {
487 
488  os.writeKeyword("nonOverlapPatch") << nonOverlapPatchName_
489  << token::END_STATEMENT << nl;
490 }
491 
492 
493 // ************************************************************************* //
Foam::AMIInterpolation::interpolationMethod
interpolationMethod
Enumeration specifying interpolation method.
Definition: AMIInterpolation.H:86
Foam::cyclicAMIPolyPatch::order
virtual bool order(PstreamBuffers &, const primitivePatch &, labelList &faceMap, labelList &rotation) const
Return new ordering for primitivePatch.
Definition: cyclicAMIPolyPatch.C:976
Foam::cyclicACMIPolyPatch::~cyclicACMIPolyPatch
virtual ~cyclicACMIPolyPatch()
Destructor.
Definition: cyclicACMIPolyPatch.C:359
Foam::token::END_STATEMENT
@ END_STATEMENT
Definition: token.H:99
Foam::cyclicACMIPolyPatch::faceAreas0_
vectorField faceAreas0_
Copy of the original patch face areas.
Definition: cyclicACMIPolyPatch.H:60
Foam::cyclicACMIPolyPatch::calcGeometry
virtual void calcGeometry(PstreamBuffers &)
Calculate the patch geometry.
Definition: cyclicACMIPolyPatch.C:157
Foam::cyclicACMIPolyPatch::movePoints
virtual void movePoints(PstreamBuffers &pBufs, const pointField &)
Correct patches after moving points.
Definition: cyclicACMIPolyPatch.C:180
Foam::faceMap
Pair< int > faceMap(const label facePi, const face &faceP, const label faceNi, const face &faceN)
Definition: blockMeshMergeFast.C:90
cyclicACMIPolyPatch.H
p
p
Definition: pEqn.H:62
Foam::word
A class for handling words, derived from string.
Definition: word.H:59
SubField.H
Foam::polyBoundaryMesh
Foam::polyBoundaryMesh.
Definition: polyBoundaryMesh.H:60
forAll
#define forAll(list, i)
Loop across all elements in list.
Definition: UList.H:406
Foam::cyclicAMIPolyPatch::initOrder
virtual void initOrder(PstreamBuffers &, const primitivePatch &) const
Initialize ordering for primitivePatch. Does not.
Definition: cyclicAMIPolyPatch.C:968
Foam::addToRunTimeSelectionTable
addToRunTimeSelectionTable(ensightPart, ensightPartCells, istream)
Foam::cyclicAMIPolyPatch::initGeometry
virtual void initGeometry(PstreamBuffers &)
Initialise the calculation of the patch geometry.
Definition: cyclicAMIPolyPatch.C:402
Foam::PstreamBuffers
Buffers for inter-processor communications streams (UOPstream, UIPstream).
Definition: PstreamBuffers.H:85
Foam::cyclicACMIPolyPatch::faceAreas0
const vectorField & faceAreas0() const
Return access to the original patch face areas.
Definition: cyclicACMIPolyPatchI.H:40
Foam::dictionary::lookup
ITstream & lookup(const word &, bool recursive=false, bool patternMatch=true) const
Find and return an entry data stream.
Definition: dictionary.C:449
Foam::cyclicACMIPolyPatch::nonOverlapPatchName_
const word nonOverlapPatchName_
Name of non-overlapping patch.
Definition: cyclicACMIPolyPatch.H:63
Foam::FatalIOError
IOerror FatalIOError
Foam::endl
Ostream & endl(Ostream &os)
Add newline and flush stream.
Definition: Ostream.H:251
Foam::mag
dimensioned< scalar > mag(const dimensioned< Type > &)
Foam::cp
bool cp(const fileName &src, const fileName &dst)
Copy, recursively if necessary, the source to the destination.
Definition: POSIX.C:755
Foam::cyclicACMIPolyPatch::cyclicACMIPolyPatch
cyclicACMIPolyPatch(const word &name, const label size, const label start, const label index, const polyBoundaryMesh &bm, const word &patchType, const transformType transform=UNKNOWN)
Construct from (base couped patch) components.
Definition: cyclicACMIPolyPatch.C:222
Foam::transform
dimensionSet transform(const dimensionSet &)
Definition: dimensionSet.C:465
Foam::cyclicAMIPolyPatch::initMovePoints
virtual void initMovePoints(PstreamBuffers &pBufs, const pointField &)
Initialise the patches for moving points.
Definition: cyclicAMIPolyPatch.C:427
Foam::cyclicAMIPolyPatch::updateMesh
virtual void updateMesh(PstreamBuffers &)
Update of the patch topology.
Definition: cyclicAMIPolyPatch.C:463
Foam::SubField
Pre-declare related SubField type.
Definition: Field.H:61
Foam::cyclicACMIPolyPatch::updateMesh
virtual void updateMesh(PstreamBuffers &)
Update of the patch topology.
Definition: cyclicACMIPolyPatch.C:195
Foam::cyclicACMIPolyPatch::write
virtual void write(Ostream &) const
Write the polyPatch data as a dictionary.
Definition: cyclicACMIPolyPatch.C:484
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::cyclicAMIPolyPatch::calcGeometry
virtual void calcGeometry(PstreamBuffers &)
Calculate the patch geometry.
Definition: cyclicAMIPolyPatch.C:411
Foam::cyclicACMIPolyPatch::tolerance_
static const scalar tolerance_
Definition: cyclicACMIPolyPatch.H:80
Foam::Field
Pre-declare SubField and related Field type.
Definition: Field.H:57
Foam::cyclicACMIPolyPatch::resetAMI
virtual void resetAMI(const AMIPatchToPatchInterpolation::interpolationMethod &AMIMethod=AMIPatchToPatchInterpolation::imFaceAreaWeight) const
Reset the AMI interpolator.
Definition: cyclicACMIPolyPatch.C:71
Foam::cyclicAMIPolyPatch::write
virtual void write(Ostream &) const
Write the polyPatch data as a dictionary.
Definition: cyclicAMIPolyPatch.C:1040
Foam::nl
static const char nl
Definition: Ostream.H:260
Foam::polyPatch
A patch is a list of labels that address the faces in the global face list.
Definition: polyPatch.H:66
Foam::cyclicACMIPolyPatch::srcMask
virtual const scalarField & srcMask() const
Return the mask/weighting for the source patch.
Definition: cyclicACMIPolyPatch.C:207
Foam::cyclicAMIPolyPatch::movePoints
virtual void movePoints(PstreamBuffers &pBufs, const pointField &)
Correct patches after moving points.
Definition: cyclicAMIPolyPatch.C:443
Foam::cyclicACMIPolyPatch::clearGeom
virtual void clearGeom()
Clear geometry.
Definition: cyclicACMIPolyPatch.C:201
Foam::cyclicACMIPolyPatch::order
virtual bool order(PstreamBuffers &, const primitivePatch &, labelList &faceMap, labelList &rotation) const
Return new ordering for primitivePatch.
Definition: cyclicACMIPolyPatch.C:473
Foam::cyclicACMIPolyPatch::initOrder
virtual void initOrder(PstreamBuffers &, const primitivePatch &) const
Initialize ordering for primitivePatch. Does not.
Definition: cyclicACMIPolyPatch.C:463
dict
dictionary dict
Definition: searchingEngine.H:14
Foam::cyclicACMIPolyPatch::nonOverlapPatchID
virtual label nonOverlapPatchID() const
Non-overlapping patch ID.
Definition: cyclicACMIPolyPatch.C:372
Foam::FatalError
error FatalError
Foam::dictionary
A list of keyword definitions, which are a keyword followed by any number of values (e....
Definition: dictionary.H:137
mesh
dynamicFvMesh & mesh
Definition: createDynamicFvMesh.H:18
addToRunTimeSelectionTable.H
Macros for easy insertion into run-time selection tables.
Foam
Namespace for OpenFOAM.
Definition: combustionModel.C:30
Foam::cyclicACMIPolyPatch::setNeighbourFaceAreas
virtual void setNeighbourFaceAreas() const
Set neighbour ACMI patch areas.
Definition: cyclicACMIPolyPatch.C:117
Foam::exit
errorManipArg< error, int > exit(error &err, const int errNo=1)
Definition: errorManip.H:124
Foam::cyclicACMIPolyPatch::initMovePoints
virtual void initMovePoints(PstreamBuffers &pBufs, const pointField &)
Initialise the patches for moving points.
Definition: cyclicACMIPolyPatch.C:164
Foam::max
dimensioned< Type > max(const dimensioned< Type > &, const dimensioned< Type > &)
Foam::cyclicAMIPolyPatch::resetAMI
virtual void resetAMI(const AMIPatchToPatchInterpolation::interpolationMethod &AMIMethod=AMIPatchToPatchInterpolation::imFaceAreaWeight) const
Reset the AMI interpolator.
Definition: cyclicAMIPolyPatch.C:329
FatalErrorInFunction
#define FatalErrorInFunction
Report an error message using Foam::FatalError.
Definition: error.H:318
Foam::cyclicACMIPolyPatch::neighbPatch
virtual const cyclicACMIPolyPatch & neighbPatch() const
Return a reference to the neighbour patch.
Definition: cyclicACMIPolyPatch.C:365
Foam::cyclicAMIPolyPatch::initUpdateMesh
virtual void initUpdateMesh(PstreamBuffers &)
Initialise the update of the patch topology.
Definition: cyclicAMIPolyPatch.C:454
Foam::cyclicAMIPolyPatch::clearGeom
virtual void clearGeom()
Clear geometry.
Definition: cyclicAMIPolyPatch.C:469
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::polyPatch::faceAreas
const vectorField::subField faceAreas() const
Return face normals.
Definition: polyPatch.C:314
Foam::Ostream::writeKeyword
Ostream & writeKeyword(const keyType &)
Write the keyword followed by an appropriate indentation.
Definition: Ostream.C:59
Foam::UList
A 1D vector of objects of type <T>, where the size of the vector is known and can be used for subscri...
Definition: HashTable.H:60
Foam::constant::electromagnetic::e
const dimensionedScalar e
Elementary charge.
Definition: doubleFloat.H:94
Foam::cyclicACMIPolyPatch::initPatchFaceAreas
virtual void initPatchFaceAreas() const
Initialise patch face areas.
Definition: cyclicACMIPolyPatch.C:45
Foam::word::null
static const word null
An empty word.
Definition: word.H:77
Foam::AMIInterpolation::imPartialFaceAreaWeight
@ imPartialFaceAreaWeight
Definition: AMIInterpolation.H:91
Foam::boundaryMesh
Addressing for all faces on surface of mesh. Can either be read from polyMesh or from triSurface....
Definition: boundaryMesh.H:59
FatalIOErrorInFunction
#define FatalIOErrorInFunction(ios)
Report an error message using Foam::FatalIOError.
Definition: error.H:330
Foam::boundaryMesh::findPatchID
label findPatchID(const polyPatchList &, const word &) const
Get index of polypatch by name.
Definition: boundaryMesh.C:254
Foam::cyclicACMIPolyPatch::tgtMask
virtual const scalarField & tgtMask() const
Return the mask/weighting for the target patch.
Definition: cyclicACMIPolyPatch.C:213
Foam::Ostream
An Ostream is an abstract base class for all output systems (streams, files, token lists,...
Definition: Ostream.H:53
Foam::cyclicACMIPolyPatch
Cyclic patch for Arbitrarily Coupled Mesh Interface (ACMI)
Definition: cyclicACMIPolyPatch.H:50
Foam::coupledPolyPatch::transformType
transformType
Definition: coupledPolyPatch.H:57
Foam::type
fileName::Type type(const fileName &)
Return the file type: DIRECTORY or FILE.
Definition: POSIX.C:588
Foam::defineTypeNameAndDebug
defineTypeNameAndDebug(combustionModel, 0)
Foam::min
dimensioned< Type > min(const dimensioned< Type > &, const dimensioned< Type > &)
Foam::patchIdentifier::name
const word & name() const
Return name.
Definition: patchIdentifier.H:109
WarningInFunction
#define WarningInFunction
Report a warning using Foam::Warning.
Definition: messageStream.H:259
Foam::name
word name(const complex &)
Return a string representation of a complex.
Definition: complex.C:47
Foam::PrimitivePatch
A list of faces which address into the list of points.
Definition: PrimitivePatchTemplate.H:88
Foam::cyclicACMIPolyPatch::initGeometry
virtual void initGeometry(PstreamBuffers &)
Initialise the calculation of the patch geometry.
Definition: cyclicACMIPolyPatch.C:145
Foam::cyclicACMIPolyPatch::initUpdateMesh
virtual void initUpdateMesh(PstreamBuffers &)
Initialise the update of the patch topology.
Definition: cyclicACMIPolyPatch.C:189
Foam::cyclicAMIPolyPatch
Cyclic patch for Arbitrary Mesh Interface (AMI)
Definition: cyclicAMIPolyPatch.H:51