Loading...
Searching...
No Matches
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-------------------------------------------------------------------------------
11License
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.
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
33}
34
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 );
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 );
88 samplePatch_ = sampleMesh().boundaryMesh()[samplePatchID].name();
89 }
90 return samplePatch_;
91}
92
95{
96 return coupleGroup_.name();
97}
98
99
100inline 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
147inline Foam::label Foam::mappedPatchBase::getCommunicator() const
148{
149 // Cached communicator, or a get a new one
150 if (communicator_ == -1)
152 const_cast<label&>(communicator_) = getWorldCommunicator();
153 }
154 return communicator_;
155}
156
157
158inline Foam::label Foam::mappedPatchBase::comm() const
159{
160 // Cached communicator, or a get a new one
161 if (communicator_ == -1)
163 const_cast<label&>(communicator_) = getWorldCommunicator();
164 }
165 return communicator_;
166}
167
168
169inline bool Foam::mappedPatchBase::sameWorld() const
170{
171 return
172 (
174 || sampleWorld_.empty()
176 );
177}
178
179
180inline 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 (
214 (
215 "updateSampleMeshTime",
216 mesh.pointsInstance(),
217 mesh.thisDb(),
221 )
222 )
223 );
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",
244 mesh.pointsInstance(),
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 {
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
301inline bool Foam::mappedPatchBase::owner() const
302{
303 return (patch_.boundaryMesh().mesh().name() < sampleRegion());
304}
305
306
307// ************************************************************************* //
@ NO_REGISTER
Do not request registration (bool: false).
@ NO_READ
Nothing to be read.
@ NO_WRITE
Ignore writing from objectRegistry::writeObject().
Defines the attributes of an object for which implicit objectRegistry management is supported,...
Definition IOobject.H:191
label find(const T &val) const
Find index of the first occurrence of the value.
Definition UList.C:160
static label myWorldID()
My worldID.
Definition UPstream.H:1838
static const wordList & allWorlds() noexcept
All worlds.
Definition UPstream.H:1822
static const word & myWorld()
My world.
Definition UPstream.H:1846
Class containing processor-to-processor mapping information.
label communicator_
Communicator.
label getWorldCommunicator() const
Get the communicator for the world-world connection.
const mapDistribute & map() const
Return reference to the parallel distribution map.
bool sameRegion() const noexcept
Cached sampleRegion != mesh.name().
const vector & offset() const noexcept
Offset vector (from patch faces to destination mesh objects).
uniformDimensionedScalarField & updateSampleMeshTime() const
Local mesh update time.
bool owner() const
Is it owner.
const polyPatch & patch_
Patch to sample.
vectorField offsets_
Offset vector (nonuniform).
const vectorField & offsets() const noexcept
Offset vectors (from patch faces to destination mesh objects).
uniformDimensionedScalarField & updateMeshTime() const
Sample mesh upate time.
sampleMode
Mesh items to sample.
@ NEARESTPATCHPOINT
nearest point on selected patch
@ NEARESTCELL
nearest cell containing sample
@ NEARESTPATCHFACE
nearest face on selected patch
@ NEARESTPATCHFACEAMI
nearest patch face + AMI interpolation
void calcAMI() const
Calculate AMI interpolator.
const sampleMode mode_
What to sample.
const polyMesh & sampleMesh() const
Get the region mesh.
bool sameRegion_
Same region.
word sampleRegion_
Region to sample.
label sampleSize() const
Return size of mapped mesh/patch/boundary.
label comm() const
Identical to getCommunicator().
word samplePatch_
Patch (if in sampleMode NEARESTPATCH*).
autoPtr< mapDistribute > mapPtr_
Communication schedule:
const polyPatch & samplePolyPatch() const
Get the patch on the region.
autoPtr< uniformDimensionedScalarField > updateSampleMeshTimePtr_
Sample mesh update time.
bool masterWorld() const
Is my world ordered before the sampleWorld?
label getCommunicator() const
Get the communicator (worldComm or world-to-world).
const word & sampleWorld() const noexcept
World to sample.
const AMIPatchToPatchInterpolation & AMI(const bool forceUpdate=false) const
Return reference to the AMI interpolator.
const word & samplePatch() const
Patch (only if NEARESTPATCHFACE).
void calcMapping() const
Calculate mapping.
sampleMode mode() const noexcept
What to sample.
const coupleGroupIdentifier coupleGroup_
PatchGroup (if in sampleMode NEARESTPATCH*).
const word & sampleRegion() const
Region to sample.
vector offset_
Offset vector (uniform).
autoPtr< uniformDimensionedScalarField > updateMeshTimePtr_
Local mesh update time.
bool sameWorld() const
Is sample world the local world?
autoPtr< AMIPatchToPatchInterpolation > AMIPtr_
Pointer to AMI interpolator.
const word & coupleGroup() const
PatchGroup (only if NEARESTPATCHFACE).
word sampleWorld_
World to sample.
Mesh consisting of general polyhedral cells.
Definition polyMesh.H:79
label nBoundaryFaces() const noexcept
Number of boundary faces (== nFaces - nInternalFaces).
A class for handling words, derived from Foam::string.
Definition word.H:66
dynamicFvMesh & mesh
#define FatalErrorInFunction
Report an error message using Foam::FatalError.
Definition error.H:600
UniformDimensionedField< scalar > uniformDimensionedScalarField
AMIInterpolation AMIPatchToPatchInterpolation
Patch-to-patch interpolation == Foam::AMIInterpolation.
errorManip< error > abort(error &err)
Definition errorManip.H:139
Field< vector > vectorField
Specialisation of Field<T> for vector.
const direction noexcept
Definition scalarImpl.H:265
error FatalError
Error stream (stdout output on all processes), with additional 'FOAM FATAL ERROR' header text and sta...
Vector< scalar > vector
Definition vector.H:57
errorManipArg< error, int > exit(error &err, const int errNo=1)
Definition errorManip.H:125
constexpr char nl
The newline '\n' character (0x0a).
Definition Ostream.H:50