regionSplit2D.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) 2015-2022 OpenCFD Ltd.
9 -------------------------------------------------------------------------------
10 License
11  This file is part of OpenFOAM.
12 
13  OpenFOAM is free software: you can redistribute it and/or modify it
14  under the terms of the GNU General Public License as published by
15  the Free Software Foundation, either version 3 of the License, or
16  (at your option) any later version.
17 
18  OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
19  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
20  FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
21  for more details.
22 
23  You should have received a copy of the GNU General Public License
24  along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
25 
26 \*---------------------------------------------------------------------------*/
27 
28 #include "regionSplit2D.H"
29 #include "polyMesh.H"
31 #include "edgeTopoDistanceData.H"
32 
33 
34 // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
35 
36 static constexpr Foam::label UNASSIGNED = -1;
37 static constexpr Foam::label BLOCKED = -2;
38 
39 
40 // * * * * * * * * * * * * * * * * Constructor * * * * * * * * * * * * * * * //
41 
42 Foam::regionSplit2D::regionSplit2D
43 (
44  const polyMesh& mesh,
46  const boolList& blockedFaces,
47  const label offset
48 )
49 :
50  labelList(patch.size(), UNASSIGNED),
51  nRegions_(0)
52 {
53  globalIndex globalFaces(blockedFaces.size());
54  label regionI = globalFaces.toGlobal(0);
55  List<edgeTopoDistanceData<label>> allEdgeInfo(patch.nEdges());
56  List<edgeTopoDistanceData<label>> allFaceInfo(patch.size());
57  DynamicList<label> changedEdges;
59 
60  label nBlockedFaces = 0;
61  forAll(blockedFaces, facei)
62  {
63  if (blockedFaces.test(facei))
64  {
65  for (const label edgei : patch.faceEdges()[facei])
66  {
67  changedEdges.append(edgei);
68 
69  // Append globally unique value
70  changedRegions.append
71  (
73  (
74  0, // distance
75  regionI // passive data
76  )
77  );
78  }
79  nBlockedFaces++;
80  regionI++;
81  }
82  else
83  {
84  // Block all non-seeded faces from the walk
85  allFaceInfo[facei] = edgeTopoDistanceData<label>
86  (
87  0, // distance
88  BLOCKED // passive data
89  );
90  }
91  }
92 
93  // Early exit if there are no blocked faces
94  if (!returnReduceOr(nBlockedFaces))
95  {
96  return;
97  }
98 
100  <
103  >
104  (
105  mesh,
106  patch,
107  changedEdges,
108  changedRegions,
109  allEdgeInfo,
110  allFaceInfo,
111  returnReduce(patch.nEdges(), sumOp<label>())
112  );
113 
114 
115  // Map from regions to local compact indexing
116  // - only for regions that originate from this processor
117  Map<label> regionToCompactAddr(changedRegions.size());
118  label compactRegionI = 0;
119  forAll(allFaceInfo, faceI)
120  {
121  label regionI = allFaceInfo[faceI].data();
122  if
123  (
124  globalFaces.isLocal(regionI)
125  && regionToCompactAddr.insert(regionI, compactRegionI)
126  )
127  {
128  compactRegionI++;
129  }
130  }
131 
132  // In-place renumber the local regionI to global (compact) regionI
133  globalIndex giCompact(compactRegionI);
134  forAllIters(regionToCompactAddr, iter)
135  {
136  *iter = giCompact.toGlobal(*iter);
137  }
138 
139  // Ensure regionToCompactAddr consistent across all processors
140  // - not concerned about the op (keys are unique)
141  // - map size will be the number of regions in the set of faces
142  Pstream::mapCombineReduce(regionToCompactAddr, minEqOp<label>());
143 
144  nRegions_ = regionToCompactAddr.size();
145 
146  // Set the region index per face
147  forAll(allFaceInfo, faceI)
148  {
149  label regionI = allFaceInfo[faceI].data();
150  if (regionI >= 0)
151  {
152  this->operator[](faceI) = regionToCompactAddr[regionI] + offset;
153  }
154  }
155 }
156 
157 
158 // ************************************************************************* //
void size(const label n)
Older name for setAddressableSize.
Definition: UList.H:116
static constexpr Foam::label BLOCKED
Definition: regionSplit2D.C:30
void append(const T &val)
Append an element at the end of the list.
Definition: List.H:517
Wave propagation of information along patch. Every iteration information goes through one layer of fa...
PrimitivePatch< IndirectList< face >, const pointField & > indirectPrimitivePatch
A PrimitivePatch with an IndirectList for the faces, const reference for the point field...
T returnReduce(const T &value, const BinaryOp &bop, const int tag=UPstream::msgType(), const label comm=UPstream::worldComm)
Perform reduction on a copy, using specified binary operation.
#define forAll(list, i)
Loop across all elements in list.
Definition: stdFoam.H:421
label & operator[](const label i)
Return element of UList.
Definition: UListI.H:361
A list of faces which address into the list of points.
Calculates a unique integer (label so might not have enough room - 2G max) for processor + local inde...
Definition: globalIndex.H:61
dynamicFvMesh & mesh
#define forAllIters(container, iter)
Iterate across all elements in the container object.
Definition: stdFoam.H:336
void append(const T &val)
Copy append an element to the end of this list.
Definition: DynamicList.H:584
For use with PatchEdgeFaceWave. Determines topological distance to starting edges. Templated on passive transported data.
static constexpr Foam::label UNASSIGNED
Definition: regionSplit2D.C:29
std::enable_if< std::is_same< bool, TypeT >::value, bool >::type test(const label i) const
Test bool value at specified position, always false for out-of-range access.
Definition: UList.H:769
label toGlobal(const label proci, const label i) const
From local to global on proci.
Definition: globalIndexI.H:308
const std::string patch
OpenFOAM patch number as a std::string.
Mesh consisting of general polyhedral cells.
Definition: polyMesh.H:74
static void mapCombineReduce(Container &values, const CombineOp &cop, const int tag=UPstream::msgType(), const label comm=UPstream::worldComm)
Reduce inplace (cf. MPI Allreduce) applying cop to inplace combine map values from different processo...
bool returnReduceOr(const bool value, const label comm=UPstream::worldComm)
Perform logical (or) MPI Allreduce on a copy. Uses UPstream::reduceOr.