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 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"
30 #include "PatchEdgeFaceWave.H"
31 #include "Time.H"
32 
33 // * * * * * * * * * * * * * * * * Constructor * * * * * * * * * * * * * * * //
34 
35 Foam::regionSplit2D::regionSplit2D
36 (
37  const polyMesh& mesh,
39  const boolList& blockedFaces,
40  const label offset
41 )
42 :
43  labelList(patch.size(), -1),
44  nRegions_(0)
45 {
46  globalIndex globalFaces(blockedFaces.size());
47  label regionI = globalFaces.toGlobal(0);
48  List<patchEdgeFaceRegion> allEdgeInfo(patch.nEdges());
49  List<patchEdgeFaceRegion> allFaceInfo(patch.size());
50  DynamicList<label> changedEdges;
51  DynamicList<patchEdgeFaceRegion> changedRegions;
52  label nBlockedFaces = 0;
53  forAll(blockedFaces, faceI)
54  {
55  if (blockedFaces[faceI])
56  {
57  const labelList& fEdges = patch.faceEdges()[faceI];
58  forAll(fEdges, feI)
59  {
60  changedEdges.append(fEdges[feI]);
61 
62  // Append globally unique value
63  changedRegions.append(regionI);
64  }
65  nBlockedFaces++;
66  regionI++;
67  }
68  else
69  {
70  // Block all non-seeded faces from the walk
71  allFaceInfo[faceI] = -2;
72  }
73  }
74 
75  // Early exit if there are no blocked faces
76  if (returnReduce(nBlockedFaces, sumOp<label>()) == 0)
77  {
78  return;
79  }
80 
82  <
85  >
86  (
87  mesh,
88  patch,
89  changedEdges,
90  changedRegions,
91  allEdgeInfo,
92  allFaceInfo,
93  returnReduce(patch.nEdges(), sumOp<label>())
94  );
95 
96 
97  // Map from regions to local compact indexing
98  // - only for regions that originate from this processor
99  Map<label> regionToCompactAddr(changedRegions.size());
100  label compactRegionI = 0;
101  forAll(allFaceInfo, faceI)
102  {
103  label regionI = allFaceInfo[faceI].region();
104  if
105  (
106  globalFaces.isLocal(regionI)
107  && regionToCompactAddr.insert(regionI, compactRegionI)
108  )
109  {
110  compactRegionI++;
111  }
112  }
113 
114  // In-place renumber the local regionI to global (compact) regionI
115  globalIndex giCompact(compactRegionI);
116  forAllIters(regionToCompactAddr, iter)
117  {
118  *iter = giCompact.toGlobal(*iter);
119  }
120 
121  // Ensure regionToCompactAddr consistent across all processors
122  // - not concerned about the op (keys are unique)
123  // - map size will be the number of regions in the set of faces
124  Pstream::mapCombineGather(regionToCompactAddr, minEqOp<label>());
125  Pstream::mapCombineScatter(regionToCompactAddr);
126 
127  nRegions_ = regionToCompactAddr.size();
128 
129  // Set the region index per face
130  forAll(allFaceInfo, faceI)
131  {
132  label regionI = allFaceInfo[faceI].region();
133  if (regionI >= 0)
134  {
135  this->operator[](faceI) = regionToCompactAddr[regionI] + offset;
136  }
137  }
138 }
139 
140 
141 // * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
142 
144 {}
145 
146 
147 // ************************************************************************* //
Foam::labelList
List< label > labelList
A List of labels.
Definition: List.H:74
Foam::returnReduce
T returnReduce(const T &Value, const BinaryOp &bop, const int tag=Pstream::msgType(), const label comm=UPstream::worldComm)
Definition: PstreamReduceOps.H:94
Foam::regionSplit2D::~regionSplit2D
~regionSplit2D()
Destructor.
Definition: regionSplit2D.C:143
Foam::DynamicList< label >
Foam::PatchEdgeFaceWave
Wave propagation of information along patch. Every iteration information goes through one layer of fa...
Definition: PatchEdgeFaceWave.H:71
Foam::Map< label >
Foam::List::append
void append(const T &val)
Append an element at the end of the list.
Definition: ListI.H:182
polyMesh.H
Foam::polyMesh
Mesh consisting of general polyhedral cells.
Definition: polyMesh.H:77
Foam::sumOp
Definition: ops.H:213
forAll
#define forAll(list, i)
Loop across all elements in list.
Definition: stdFoam.H:290
Foam::minEqOp
Definition: ops.H:81
PatchEdgeFaceWave.H
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:62
Foam::DynamicList::append
DynamicList< T, SizeMin > & append(const T &val)
Append an element to the end of this list.
Definition: DynamicListI.H:472
forAllIters
#define forAllIters(container, iter)
Iterate across all elements in the container object.
Definition: stdFoam.H:217
mesh
dynamicFvMesh & mesh
Definition: createDynamicFvMesh.H:6
Foam::globalIndex
Calculates a unique integer (label so might not have enough room - 2G max) for processor + local inde...
Definition: globalIndex.H:68
Foam::indirectPrimitivePatch
PrimitivePatch< face, IndirectList, const pointField & > indirectPrimitivePatch
A PrimitivePatch using an IndirectList for the faces.
Definition: indirectPrimitivePatch.H:47
Time.H
Foam::foamVersion::patch
const std::string patch
OpenFOAM patch number as a std::string.
Foam::List< bool >
Foam::patchEdgeFaceRegion
Transport of region for use in PatchEdgeFaceWave.
Definition: patchEdgeFaceRegion.H:67
regionSplit2D.H
Foam::globalIndex::toGlobal
label toGlobal(const label i) const
From local to global index.
Definition: globalIndexI.H:164
Foam::PrimitivePatch
A list of faces which address into the list of points.
Definition: PrimitivePatch.H:90