45 Foam::label Foam::globalPoints::countPatchPoints
56 nTotPoints +=
pp.nPoints();
63 Foam::label Foam::globalPoints::findSamePoint
69 const label proci = globalTransforms_.processor(info);
70 const label index = globalTransforms_.index(info);
76 globalTransforms_.processor(allInfo[i]) == proci
77 && globalTransforms_.index(allInfo[i]) == index
93 scalar tol = refCast<const coupledPolyPatch>
95 mesh_.boundaryMesh()[patchi]
111 sendInfo[i] = globalTransforms_.encode
113 globalTransforms_.processor(info[i]),
114 globalTransforms_.index(info[i]),
115 globalTransforms_.addToTransformIndex
117 globalTransforms_.transformIndex(info[i]),
128 void Foam::globalPoints::addToSend
131 const label patchPointi,
134 DynamicList<label>& patchFaces,
135 DynamicList<label>& indexInFace,
136 DynamicList<labelPairList>& allInfo
149 for (
const label patchFacei :
pFaces)
151 const face&
f =
pp[patchFacei];
153 patchFaces.append(patchFacei);
154 indexInFace.append(
f.
find(meshPointi));
157 allInfo.append(addSendTransform(
pp.index(), knownInfo));
162 bool Foam::globalPoints::mergeInfo
165 const label localPointi,
172 bool anyChanged =
false;
176 label newI = newInfo.size();
177 newInfo.setSize(newI + nbrInfo.size());
187 label index = findSamePoint(myInfo, nbrInfo[i]);
192 newInfo[newI++] = nbrInfo[i];
201 if (myInfo[index] == nbrInfo[i])
207 label myTransform = globalTransforms_.transformIndex
211 label nbrTransform = globalTransforms_.transformIndex
217 label minTransform = globalTransforms_.minimumTransformIndex
223 if (minTransform != myTransform)
226 newInfo[index] = nbrInfo[i];
233 newInfo.setSize(newI);
234 myInfo.transfer(newInfo);
240 Foam::label Foam::globalPoints::meshToLocalPoint
242 const Map<label>& meshToPatchPoint,
243 const label meshPointi
248 meshToPatchPoint.size() == 0
250 : meshToPatchPoint[meshPointi]
255 Foam::label Foam::globalPoints::localToMeshPoint
258 const label localPointi
263 patchToMeshPoint.size() == 0
265 : patchToMeshPoint[localPointi]
270 bool Foam::globalPoints::mergeInfo
273 const label localPointi
279 bool infoChanged =
false;
282 const auto iter = meshToProcPoint_.cfind(localPointi);
286 if (mergeInfo(nbrInfo, localPointi, procPoints_[iter.val()]))
297 globalTransforms_.encode
301 globalTransforms_.nullTransformIndex()
305 if (mergeInfo(nbrInfo, localPointi, knownInfo))
308 meshToProcPoint_.insert(localPointi, procPoints_.size());
310 procPoints_.append(knownInfo);
319 bool Foam::globalPoints::storeInitialInfo
322 const label localPointi
328 bool infoChanged =
false;
331 const auto iter = meshToProcPoint_.find(localPointi);
335 if (mergeInfo(nbrInfo, localPointi, procPoints_[iter.val()]))
343 meshToProcPoint_.insert(localPointi, procPoints_.size());
345 procPoints_.append(nbrInfo);
353 void Foam::globalPoints::printProcPoint
359 label proci = globalTransforms_.processor(pointInfo);
360 label index = globalTransforms_.index(pointInfo);
361 label trafoI = globalTransforms_.transformIndex(pointInfo);
363 Pout<<
" proc:" << proci;
364 Pout<<
" localpoint:";
366 Pout<<
" through transform:" 367 << trafoI <<
" bits:" 368 << globalTransforms_.decodeTransformIndex(trafoI);
372 label meshPointi = localToMeshPoint(patchToMeshPoint, index);
373 Pout<<
" at:" << mesh_.points()[meshPointi];
378 void Foam::globalPoints::printProcPoints
386 printProcPoint(patchToMeshPoint, pointInfo[i]);
392 void Foam::globalPoints::initOwnPoints
394 const Map<label>& meshToPatchPoint,
399 const polyBoundaryMesh&
patches = mesh_.boundaryMesh();
412 forAll(meshPoints, patchPointi)
414 label meshPointi = meshPoints[patchPointi];
415 label localPointi = meshToLocalPoint
424 globalTransforms_.encode
428 globalTransforms_.nullTransformIndex()
437 if (storeInitialInfo(knownInfo, localPointi))
439 changedPoints.insert(localPointi);
450 label meshPointi = meshPoints[boundaryPoints[i]];
451 label localPointi = meshToLocalPoint
460 globalTransforms_.encode
464 globalTransforms_.nullTransformIndex()
468 if (storeInitialInfo(knownInfo, localPointi))
470 changedPoints.insert(localPointi);
479 void Foam::globalPoints::sendPatchPoints
481 const bool mergeSeparated,
482 const Map<label>& meshToPatchPoint,
483 PstreamBuffers& pBufs,
487 const polyBoundaryMesh&
patches = mesh_.boundaryMesh();
488 const labelPairList& patchInfo = globalTransforms_.patchTransformSign();
496 DynamicList<label> patchFaces;
499 DynamicList<label> indexInFace;
502 DynamicList<labelPairList> allInfo;
511 Map<int> isActiveSend(0);
528 && (mergeSeparated || patchInfo[patchi].first() == -1)
531 const auto& procPatch = refCast<const processorPolyPatch>(
pp);
532 const label nbrProci = procPatch.neighbProcNo();
549 forAll(meshPoints, patchPointi)
551 label meshPointi = meshPoints[patchPointi];
552 label localPointi = meshToLocalPoint
558 if (changedPoints.found(localPointi))
560 label index = meshToProcPoint_[localPointi];
582 UOPstream toNbr(nbrProci, pBufs);
583 toNbr << patchFaces << indexInFace << allInfo;
586 isActiveSend(nbrProci) |= int(!patchFaces.empty());
590 Pout<<
"Sending from " <<
pp.name() <<
" to proc:" 591 << nbrProci <<
" point information:" 592 << patchFaces.size() <<
endl;
603 pBufs.clearSend(iter.key());
609 void Foam::globalPoints::receivePatchPoints
611 const bool mergeSeparated,
612 const Map<label>& meshToPatchPoint,
614 PstreamBuffers& pBufs,
624 const polyBoundaryMesh&
patches = mesh_.boundaryMesh();
625 const labelPairList& patchInfo = globalTransforms_.patchTransformSign();
628 changedPoints.clear();
637 && (mergeSeparated || patchInfo[patchi].first() == -1)
640 const auto& procPatch = refCast<const processorPolyPatch>(
pp);
641 const label nbrProci = procPatch.neighbProcNo();
643 if (!pBufs.recvDataCount(nbrProci))
651 List<labelPairList> nbrInfo;
654 UIPstream fromNbr(nbrProci, pBufs);
655 fromNbr >> patchFaces >> indexInFace >> nbrInfo;
660 Pout<<
" On " <<
pp.name()
662 << nbrProci <<
" point information:" 663 << patchFaces.size() <<
endl;
668 const face&
f =
pp[patchFaces[i]];
671 label index = (
f.
size() - indexInFace[i]) %
f.
size();
674 label meshPointi =
f[index];
676 label localPointi = meshToLocalPoint
682 if (mergeInfo(nbrInfo[i], localPointi))
684 changedPoints.insert(localPointi);
691 isA<cyclicPolyPatch>(
pp)
692 && refCast<const cyclicPolyPatch>(
pp).owner()
694 && (mergeSeparated || patchInfo[patchi].first() == -1)
700 const cyclicPolyPatch& cycPatch =
701 refCast<const cyclicPolyPatch>(
pp);
706 const labelList coupledMeshPoints(reverseMeshPoints(cycPatch));
710 label meshPointA = meshPoints[i];
711 label meshPointB = coupledMeshPoints[i];
713 if (meshPointA != meshPointB)
720 label localA = meshToLocalPoint
725 label localB = meshToLocalPoint
733 const auto procPointA = meshToProcPoint_.cfind(localA);
735 if (procPointA.good())
740 procPoints_[procPointA()]
743 if (mergeInfo(infoA, localB))
745 changedPoints.insert(localB);
750 const auto procPointB = meshToProcPoint_.cfind(localB);
752 if (procPointB.good())
756 cycPatch.neighbPatchID(),
757 procPoints_[procPointB()]
760 if (mergeInfo(infoB, localA))
762 changedPoints.insert(localA);
772 void Foam::globalPoints::remove
775 const Map<label>& directNeighbours
782 Map<label> oldMeshToProcPoint(std::move(meshToProcPoint_));
783 meshToProcPoint_.resize(oldMeshToProcPoint.size());
784 DynamicList<labelPairList> oldProcPoints(std::move(procPoints_));
785 procPoints_.setCapacity(oldProcPoints.size());
790 const label localPointi = iter.key();
793 if (pointInfo.size() == 2)
800 label proc0 = globalTransforms_.processor(pointInfo[0]);
801 label proc1 = globalTransforms_.processor(pointInfo[1]);
807 && directNeighbours.found
809 globalTransforms_.index(pointInfo[0])
814 && directNeighbours.found
816 globalTransforms_.index(pointInfo[1])
851 meshToProcPoint_.insert(localPointi, procPoints_.size());
852 procPoints_.append(pointInfo);
855 else if (pointInfo.size() == 1)
862 globalTransforms_.processor(pointInfo[0])
864 || !directNeighbours.found
866 globalTransforms_.index(pointInfo[0])
870 meshToProcPoint_.insert(localPointi, procPoints_.size());
871 procPoints_.append(pointInfo);
876 meshToProcPoint_.insert(localPointi, procPoints_.size());
877 procPoints_.append(pointInfo);
881 procPoints_.shrink();
882 meshToProcPoint_.resize(2*procPoints_.size());
888 const cyclicPolyPatch&
pp 891 const cyclicPolyPatch& nbrPatch =
pp.neighbPatch();
893 faceList masterFaces(nbrPatch.size());
897 masterFaces[facei] = nbrPatch[facei].reverseFace();
908 void Foam::globalPoints::calculateSharedPoints
910 const Map<label>& meshToPatchPoint,
912 const bool keepAllPoints,
913 const bool mergeSeparated
918 Pout<<
"globalPoints::calculateSharedPoints(..) : " 919 <<
"doing processor to processor communication to get sharedPoints" 921 <<
" keepAllPoints :" << keepAllPoints <<
endl 922 <<
" mergeSeparated:" << mergeSeparated <<
endl 941 initOwnPoints(meshToPatchPoint,
true, changedPoints);
956 pBufs.allowClearRecv(
false);
968 pBufs.finishedSends();
981 Map<label> neighbourList;
984 neighbourList = meshToProcPoint_;
999 pBufs.finishedSends();
1030 remove(patchToMeshPoint, neighbourList);
1049 pointPoints_.setSize(globalIndices_.localSize());
1050 List<labelPairList> transformedPoints(globalIndices_.localSize());
1056 if (pointInfo.size() >= 2)
1059 const labelPair& masterInfo = pointInfo[0];
1064 globalTransforms_.processor(masterInfo)
1067 && (globalTransforms_.index(masterInfo) == iter.key())
1070 labelList& pPoints = pointPoints_[iter.key()];
1071 pPoints.
setSize(pointInfo.size()-1);
1073 labelPairList& trafoPPoints = transformedPoints[iter.key()];
1074 trafoPPoints.setSize(pointInfo.size()-1);
1076 label nonTransformI = 0;
1077 label transformI = 0;
1079 for (label i = 1; i < pointInfo.size(); i++)
1082 label proci = globalTransforms_.processor(info);
1083 label index = globalTransforms_.index(info);
1084 label
transform = globalTransforms_.transformIndex
1089 if (
transform == globalTransforms_.nullTransformIndex())
1091 pPoints[nonTransformI++] = globalIndices_.toGlobal
1099 trafoPPoints[transformI++] = info;
1103 pPoints.setSize(nonTransformI);
1104 trafoPPoints.setSize(transformI);
1110 List<Map<label>> compactMap;
1120 transformedPointPoints_,
1128 Pout<<
"globalPoints::calculateSharedPoints(..) : " 1129 <<
"Finished global points" <<
endl;
1136 Foam::globalPoints::globalPoints
1138 const polyMesh&
mesh,
1139 const bool keepAllPoints,
1140 const bool mergeSeparated
1144 globalIndices_(mesh_.
nPoints()),
1145 globalTransforms_(
mesh),
1146 nPatchPoints_(countPatchPoints(
mesh.boundaryMesh())),
1147 procPoints_(nPatchPoints_),
1148 meshToProcPoint_(nPatchPoints_)
1151 Map<label> meshToPatchPoint(0);
1154 calculateSharedPoints
1164 Foam::globalPoints::globalPoints
1168 const bool keepAllPoints,
1169 const bool mergeSeparated
1173 globalIndices_(coupledPatch.
nPoints()),
1174 globalTransforms_(
mesh),
1175 nPatchPoints_(coupledPatch.
nPoints()),
1176 procPoints_(nPatchPoints_),
1177 meshToProcPoint_(nPatchPoints_)
1179 calculateSharedPoints
label nPoints() const
Number of points supporting patch faces.
void size(const label n)
Older name for setAddressableSize.
label find(const T &val, label pos=0) const
Find index of the first occurrence of the value.
A 1D array of objects of type <T>, where the size of the vector is known and used for subscript bound...
const labelList & boundaryPoints() const
Return list of boundary points, address into LOCAL point list.
Ostream & endl(Ostream &os)
Add newline and flush stream.
static bool & parRun() noexcept
Test if this a parallel run.
List< labelPair > labelPairList
List of labelPair.
static int myProcNo(const label communicator=worldComm)
Rank of this process in the communicator (starting from masterNo()). Can be negative if the process i...
static bool less(const vector &x, const vector &y)
To compare normals.
const labelList & meshPoints() const
Return labelList of mesh points in patch.
#define forAll(list, i)
Loop across all elements in list.
HashSet< label, Hash< label > > labelHashSet
A HashSet of labels, uses label hasher.
List< face > faceList
List of faces.
A list of faces which address into the list of points.
const Map< label > & meshPointMap() const
Mesh point map.
void setSize(const label n)
Alias for resize()
"scheduled" : (MPI_Send, MPI_Recv)
void sort(UList< T > &list)
Sort the list.
label size() const noexcept
The number of entries in the list.
label min(const labelHashSet &set, label minValue=labelMax)
Find the min value in labelHashSet, optionally limited by second argument.
void reset(const dimensionSet &ds)
Copy assign the exponents from the dimensionSet.
const labelListList & pointFaces() const
Return point-face addressing.
void clear()
Clear the patch list and all demand-driven data.
int debug
Static debugging option.
Pair< label > labelPair
A pair of labels.
defineTypeNameAndDebug(combustionModel, 0)
PrimitivePatch< List< face >, const pointField & > primitiveFacePatch
A PrimitivePatch with List storage for the faces, const reference for the point field.
Info<< "Finished reading KIVA file"<< endl;cellShapeList cellShapes(nPoints);labelList cellZoning(nPoints, -1);const cellModel &hex=cellModel::ref(cellModel::HEX);labelList hexLabels(8);label activeCells=0;labelList pointMap(nPoints);forAll(pointMap, i){ pointMap[i]=i;}for(label i=0;i< nPoints;i++){ if(f[i] > 0.0) { hexLabels[0]=i;hexLabels[1]=i1tab[i];hexLabels[2]=i3tab[i1tab[i]];hexLabels[3]=i3tab[i];hexLabels[4]=i8tab[i];hexLabels[5]=i1tab[i8tab[i]];hexLabels[6]=i3tab[i1tab[i8tab[i]]];hexLabels[7]=i3tab[i8tab[i]];cellShapes[activeCells].reset(hex, hexLabels);edgeList edges=cellShapes[activeCells].edges();forAll(edges, ei) { if(edges[ei].mag(points)< SMALL) { label start=pointMap[edges[ei].start()];while(start !=pointMap[start]) { start=pointMap[start];} label end=pointMap[edges[ei].end()];while(end !=pointMap[end]) { end=pointMap[end];} label minLabel=min(start, end);pointMap[start]=pointMap[end]=minLabel;} } cellZoning[activeCells]=idreg[i];activeCells++;}}cellShapes.setSize(activeCells);cellZoning.setSize(activeCells);forAll(cellShapes, celli){ cellShape &cs=cellShapes[celli];forAll(cs, i) { cs[i]=pointMap[cs[i]];} cs.collapse();}label bcIDs[11]={-1, 0, 2, 4, -1, 5, -1, 6, 7, 8, 9};const label nBCs=12;const word *kivaPatchTypes[nBCs]={ &wallPolyPatch::typeName, &wallPolyPatch::typeName, &wallPolyPatch::typeName, &wallPolyPatch::typeName, &symmetryPolyPatch::typeName, &wedgePolyPatch::typeName, &polyPatch::typeName, &polyPatch::typeName, &polyPatch::typeName, &polyPatch::typeName, &symmetryPolyPatch::typeName, &oldCyclicPolyPatch::typeName};enum patchTypeNames{ PISTON, VALVE, LINER, CYLINDERHEAD, AXIS, WEDGE, INFLOW, OUTFLOW, PRESIN, PRESOUT, SYMMETRYPLANE, CYCLIC};const char *kivaPatchNames[nBCs]={ "piston", "valve", "liner", "cylinderHead", "axis", "wedge", "inflow", "outflow", "presin", "presout", "symmetryPlane", "cyclic"};List< SLList< face > > pFaces[nBCs]
static commsTypes defaultCommsType
Default commsType.
const polyBoundaryMesh & patches
"nonBlocking" : (MPI_Isend, MPI_Irecv)
Mesh consisting of general polyhedral cells.
List< label > labelList
A List of labels.
dimensionSet transform(const dimensionSet &ds)
Return the argument; transformations do not change the dimensions.
bool returnReduceOr(const bool value, const label comm=UPstream::worldComm)
Perform logical (or) MPI Allreduce on a copy. Uses UPstream::reduceOr.
prefixOSstream Pout
OSstream wrapped stdout (std::cout) with parallel prefix.
uindirectPrimitivePatch pp(UIndirectList< face >(mesh.faces(), faceLabels), mesh.points())
forAllConstIters(mixture.phases(), phase)