mappedPatchBaseI.H
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-2015 OpenFOAM Foundation
9  Copyright (C) 2020-2021,2024 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 
31 {
32  return mode_;
33 }
34 
35 
37 {
38  return sampleWorld_;
39 }
40 
41 
43 {
44  if (sampleRegion_.empty())
45  {
46  if (!coupleGroup_.good())
47  {
49  << "Supply either a regionName or a coupleGroup"
50  << " for patch " << patch_.name()
51  << " in region " << patch_.boundaryMesh().mesh().name()
52  << exit(FatalError);
53  }
54 
55  // Try and use patchGroup to find samplePatch and sampleRegion
56  label samplePatchID = coupleGroup_.findOtherPatchID
57  (
58  patch_,
59  sampleRegion_
60  );
61 
62  samplePatch_ = sampleMesh().boundaryMesh()[samplePatchID].name();
63  }
64  return sampleRegion_;
65 }
66 
67 
69 {
70  if (samplePatch_.empty())
71  {
72  if (!coupleGroup_.good())
73  {
75  << "Supply either a patchName or a coupleGroup"
76  << " for patch " << patch_.name()
77  << " in region " << patch_.boundaryMesh().mesh().name() << nl
78  << exit(FatalError);
79  }
80 
81  // Try and use patchGroup to find samplePatch and sampleRegion
82  label samplePatchID = coupleGroup_.findOtherPatchID
83  (
84  patch_,
85  sampleRegion_
86  );
87 
88  samplePatch_ = sampleMesh().boundaryMesh()[samplePatchID].name();
89  }
90  return samplePatch_;
91 }
92 
93 
95 {
96  return coupleGroup_.name();
97 }
98 
99 
100 inline Foam::label Foam::mappedPatchBase::sampleSize() const
101 {
102  switch (mode_)
103  {
104  case NEARESTPATCHFACEAMI:
105  {
106  return samplePolyPatch().size();
107  }
108  case NEARESTCELL:
109  {
110  return sampleMesh().nCells();
111  }
112  case NEARESTPATCHFACE:
113  {
114  return samplePolyPatch().size();
115  }
116  case NEARESTPATCHPOINT:
117  {
118  return samplePolyPatch().nPoints();
119  }
120  case NEARESTFACE:
121  {
122  const polyMesh& mesh = sampleMesh();
123  return mesh.nBoundaryFaces();
124  }
125  default:
126  {
128  << "problem." << abort(FatalError);
129  return -1;
130  }
131  }
132 }
133 
136 {
137  return offset_;
138 }
139 
142 {
143  return offsets_;
144 }
145 
146 
147 inline Foam::label Foam::mappedPatchBase::getCommunicator() const
148 {
149  // Cached communicator, or a get a new one
150  if (communicator_ == -1)
151  {
152  const_cast<label&>(communicator_) = getWorldCommunicator();
153  }
154  return communicator_;
155 }
156 
157 
158 inline Foam::label Foam::mappedPatchBase::comm() const
159 {
160  // Cached communicator, or a get a new one
161  if (communicator_ == -1)
162  {
163  const_cast<label&>(communicator_) = getWorldCommunicator();
164  }
165  return communicator_;
166 }
167 
168 
169 inline bool Foam::mappedPatchBase::sameWorld() const
170 {
171  return
172  (
173  UPstream::allWorlds().size() == 1
174  || sampleWorld_.empty()
175  || UPstream::myWorld() == sampleWorld_
176  );
177 }
178 
179 
180 inline bool Foam::mappedPatchBase::masterWorld() const
181 {
182  if (sameWorld())
183  {
184  return true;
185  }
187  // Use ordering in allWorlds
188  const label otherWorldId = UPstream::allWorlds().find(sampleWorld_);
189  return (otherWorldId < 0 || (UPstream::myWorldID() < otherWorldId));
190 }
191 
192 
194 {
195  return sameRegion_;
196 }
197 
198 
201 {
202  if (!updateSampleMeshTimePtr_)
203  {
204  // Note: explicitly register on our mesh instead of sampleMesh
205  // since otherwise the destructor might give problems since sampleMesh
206  // might have already been taken down before.
207  const auto& mesh = patch_.boundaryMesh().mesh();
208 
209  updateSampleMeshTimePtr_.reset
210  (
212  (
213  IOobject
214  (
215  "updateSampleMeshTime",
217  mesh.thisDb(),
221  )
222  )
223  );
224  }
225 
226  return updateSampleMeshTimePtr_();
227 }
228 
229 
232 {
233  if (!updateMeshTimePtr_)
234  {
235  const auto& mesh = patch_.boundaryMesh().mesh();
236 
237  updateMeshTimePtr_.reset
238  (
240  (
241  IOobject
242  (
243  "updateMeshTime",
245  mesh.thisDb(),
249  )
250  )
251  );
252  }
253 
254  return updateMeshTimePtr_();
255 }
256 
257 
259 {
260  if (!upToDate())
261  {
262  mapPtr_.reset(nullptr);
263 
264  if (AMIPtr_)
265  {
266  AMIPtr_->upToDate(false);
267  }
268  }
269 
270  if (!mapPtr_)
271  {
272  calcMapping();
273  }
274 
275  return *mapPtr_;
276 }
277 
278 
280 (
281  bool forceUpdate
282 ) const
283 {
284  if (!upToDate())
285  {
286  mapPtr_.reset(nullptr);
287  AMIPtr_->upToDate(false);
288  }
289 
290  if (forceUpdate)
291  {
292  AMIPtr_->upToDate(false);
293  }
295  calcAMI();
296 
297  return *AMIPtr_;
298 }
299 
300 
301 inline bool Foam::mappedPatchBase::owner() const
302 {
303  return (patch_.boundaryMesh().mesh().name() < sampleRegion());
304 }
305 
306 
307 // ************************************************************************* //
static const word & myWorld()
My world.
Definition: UPstream.H:1177
const vector & offset() const noexcept
Offset vector (from patch faces to destination mesh objects)
errorManipArg< error, int > exit(error &err, const int errNo=1)
Definition: errorManip.H:125
error FatalError
Error stream (stdout output on all processes), with additional &#39;FOAM FATAL ERROR&#39; header text and sta...
#define FatalErrorInFunction
Report an error message using Foam::FatalError.
Definition: error.H:608
constexpr char nl
The newline &#39;\n&#39; character (0x0a)
Definition: Ostream.H:50
bool empty() const noexcept
True if List is empty (ie, size() is zero)
Definition: UList.H:675
uniformDimensionedScalarField & updateMeshTime() const
Sample mesh upate time.
Ignore writing from objectRegistry::writeObject()
uniformDimensionedScalarField & updateSampleMeshTime() const
Local mesh update time.
const mapDistribute & map() const
Return reference to the parallel distribution map.
UniformDimensionedField< scalar > uniformDimensionedScalarField
virtual const objectRegistry & thisDb() const
Return the object registry - resolve conflict polyMesh/lduMesh.
Definition: fvMesh.H:376
bool sameWorld() const
Is sample world the local world?
const fileName & pointsInstance() const
Return the current instance directory for points.
Definition: polyMesh.C:853
dynamicFvMesh & mesh
const polyMesh & mesh() const noexcept
Return the mesh reference.
bool masterWorld() const
Is my world ordered before the sampleWorld?
const polyBoundaryMesh & boundaryMesh() const noexcept
Return boundary mesh.
Definition: polyMesh.H:609
A class for handling words, derived from Foam::string.
Definition: word.H:63
const AMIPatchToPatchInterpolation & AMI(const bool forceUpdate=false) const
Return reference to the AMI interpolator.
errorManip< error > abort(error &err)
Definition: errorManip.H:139
label find(const T &val) const
Find index of the first occurrence of the value.
Definition: UList.C:173
void reset(const label nPoints, const label nInternalFaces, const label nFaces, const label nCells)
Reset this primitiveMesh given the primitive array sizes.
const direction noexcept
Definition: Scalar.H:258
A Vector of values with scalar precision, where scalar is float/double depending on the compilation f...
label sampleSize() const
Return size of mapped mesh/patch/boundary.
label comm() const
Identical to getCommunicator()
label getCommunicator() const
Get the communicator (worldComm or world-to-world)
sampleMode mode() const noexcept
What to sample.
bool owner() const
Is it owner.
Class containing processor-to-processor mapping information.
bool sameRegion() const noexcept
Cached sampleRegion != mesh.name()
const word & coupleGroup() const
PatchGroup (only if NEARESTPATCHFACE)
sampleMode
Mesh items to sample.
Nothing to be read.
Interpolation class dealing with transfer of data between two primitive patches with an arbitrary mes...
const word & sampleWorld() const noexcept
World to sample.
const word & samplePatch() const
Patch (only if NEARESTPATCHFACE)
static const wordList & allWorlds() noexcept
All worlds.
Definition: UPstream.H:1153
const word & sampleRegion() const
Region to sample.
label nBoundaryFaces() const noexcept
Number of boundary faces (== nFaces - nInternalFaces)
Defines the attributes of an object for which implicit objectRegistry management is supported...
Definition: IOobject.H:180
Do not request registration (bool: false)
void reset(autoPtr< mapDistribute > &&srcToTgtMap, autoPtr< mapDistribute > &&tgtToSrcMap, labelListList &&srcAddress, scalarListList &&srcWeights, labelListList &&tgtAddress, scalarListList &&tgtWeights, const label singlePatchProc)
Set the maps, addresses and weights from an external source.
const vectorField & offsets() const noexcept
Offset vectors (from patch faces to destination mesh objects)
static label myWorldID()
My worldID.
Definition: UPstream.H:1169
const sampleMode mode_
What to sample.