38 void Foam::conformalVoronoiMesh::calcNeighbourCellCentres
45 const label nBoundaryFaces =
mesh.nBoundaryFaces();
47 if (neiCc.size() != nBoundaryFaces)
50 <<
"nBoundaries:" << nBoundaryFaces
51 <<
" neiCc:" << neiCc.size()
55 const polyBoundaryMesh&
patches =
mesh.boundaryMesh();
59 const polyPatch& pp =
patches[patchi];
63 label bFacei = pp.start() -
mesh.nInternalFaces();
69 neiCc[bFacei] = cellCentres[faceCells[i]];
80 void Foam::conformalVoronoiMesh::selectSeparatedCoupledFaces
90 const auto* cpp = isA<coupledPolyPatch>(pp);
92 if (cpp && (cpp->separated() || !cpp->parallel()))
94 SubList<bool>(selected, pp.size(), pp.start()) =
true;
100 void Foam::conformalVoronoiMesh::findCellZoneInsideWalk
102 const polyMesh&
mesh,
110 selectSeparatedCoupledFaces(
mesh, blockedFace);
112 forAll(faceToSurface, facei)
114 if (faceToSurface[facei] == -1)
116 blockedFace[facei] =
false;
120 blockedFace[facei] =
true;
126 regionSplit cellRegion(
mesh, blockedFace);
133 const PtrList<surfaceZonesInfo>& surfZones =
134 geometryToConformTo().surfZones();
137 forAll(locationSurfaces, i)
139 label surfI = locationSurfaces[i];
141 const Foam::point& insidePoint = surfZones[surfI].zoneInsidePoint();
143 const word& surfName = geometryToConformTo().geometry().names()[surfI];
145 Info<<
" For surface " << surfName
146 <<
" finding inside point " << insidePoint
150 label keepRegionI = -1;
156 keepRegionI = cellRegion[celli];
158 reduce(keepRegionI, maxOp<label>());
160 Info<<
" For surface " << surfName
161 <<
" found point " << insidePoint <<
" in cell " << celli
162 <<
" in global region " << keepRegionI
163 <<
" out of " << cellRegion.nRegions() <<
" regions." <<
endl;
165 if (keepRegionI == -1)
168 <<
"Point " << insidePoint
169 <<
" is not inside the mesh." <<
nl
170 <<
"Bounding box of the mesh:" <<
mesh.
bounds()
177 if (cellRegion[celli] == keepRegionI)
179 if (cellToSurface[celli] == -2)
181 cellToSurface[celli] = surfI;
183 else if (cellToSurface[celli] != surfI)
188 <<
" is inside surface " << surfName
189 <<
" but already marked as being in zone "
190 << cellToSurface[celli] <<
endl
191 <<
"This can happen if your surfaces are not"
192 <<
" (sufficiently) closed."
206 labelList cellToSurface(cellCentres.size(), label(-1));
208 const PtrList<surfaceZonesInfo>& surfZones =
209 geometryToConformTo().surfZones();
217 geometryToConformTo().geometry(),
218 geometryToConformTo().surfaces()
222 forAll(closedNamedSurfaces, i)
224 label surfI = closedNamedSurfaces[i];
226 const searchableSurface& surface =
227 allGeometry()[geometryToConformTo().surfaces()[surfI]];
230 surfZones[surfI].zoneInside();
240 <<
"Trying to use surface "
242 <<
" which has non-geometric inside selection method "
247 if (surface.hasVolumeType())
249 List<volumeType> volType;
250 surface.getVolumeType(cellCentres, volType);
252 bool selectInside =
true;
255 List<volumeType> volTypeInsidePoint;
256 surface.getVolumeType
258 pointField(1, surfZones[surfI].zoneInsidePoint()),
264 selectInside =
false;
269 selectInside =
false;
274 if (cellToSurface[pointi] == -1)
288 cellToSurface[pointi] = surfI;
295 return cellToSurface;
299 void Foam::conformalVoronoiMesh::calcFaceZones
301 const polyMesh&
mesh,
321 const polyPatch& pp =
patches[patchi];
331 neiFaceOwner[bFacei] = cellToSurface[faceCells[i]];
341 const label ownerSurfacei = cellToSurface[faceOwner[facei]];
343 if (faceToSurface[facei] >= 0)
350 const label neiSurfacei = cellToSurface[faceNeighbour[facei]];
354 (ownerSurfacei >= 0 || neiSurfacei >= 0)
355 && ownerSurfacei != neiSurfacei
360 ownerSurfacei ==
max(ownerSurfacei, neiSurfacei)
365 faceToSurface[facei] =
max(ownerSurfacei, neiSurfacei);
374 const label neiSurfacei =
379 (ownerSurfacei >= 0 || neiSurfacei >= 0)
380 && ownerSurfacei != neiSurfacei
385 ownerSurfacei ==
max(ownerSurfacei, neiSurfacei)
390 faceToSurface[facei] =
max(ownerSurfacei, neiSurfacei);
395 if (ownerSurfacei >= 0)
397 faceToSurface[facei] = ownerSurfacei;
404 const PtrList<surfaceZonesInfo>& surfZones =
405 geometryToConformTo().surfZones();
412 geometryToConformTo().geometry(),
413 geometryToConformTo().surfaces()
418 calcNeighbourCellCentres
428 if (faceToSurface[facei] >= 0)
435 const label own = faceOwner[facei];
437 List<pointIndexHit> surfHit;
442 const label nei = faceNeighbour[facei];
444 geometryToConformTo().findSurfaceAllIntersections
454 geometryToConformTo().findSurfaceAllIntersections
465 if (surfHit.size() == 1 && surfHit[0].hit())
467 if (unclosedSurfaces.found(hitSurface[0]))
470 geometryToConformTo().getNormal
473 List<pointIndexHit>(1, surfHit[0]),
479 if ((norm[0] & areaNorm) < 0)
481 flipMap[facei] =
true;
485 flipMap[facei] =
false;
488 faceToSurface[facei] = hitSurface[0];
539 void Foam::conformalVoronoiMesh::addZones
545 Info<<
" Adding zones to mesh" <<
endl;
547 const PtrList<surfaceZonesInfo>& surfZones =
548 geometryToConformTo().surfZones();
550 labelList cellToSurface(calcCellZones(cellCentres));
569 findCellZoneInsideWalk
572 insidePointNamedSurfaces,
583 label surfI = namedSurfaces[i];
584 const wordList& fzNames = surfZones[surfI].faceZoneNames();
587 << geometryToConformTo().geometry().names()[surfI] <<
nl
588 <<
indent <<
" faceZone : "
589 << (fzNames.size() ? fzNames[0] :
"") <<
nl
590 <<
indent <<
" cellZone : "
591 << surfZones[surfI].cellZoneName()
596 labelList surfaceToFaceZone(surfZones.size(), -1);
607 forAll(surfaceToFaceZones, surfi)
609 if (surfaceToFaceZones[surfi].size())
611 surfaceToFaceZone[surfi] = surfaceToFaceZones[surfi][0];
627 polyTopoChange meshMod(
mesh);
629 forAll(cellToSurface, celli)
631 label surfacei = cellToSurface[celli];
635 label zoneI = surfaceToCellZone[surfacei];
655 forAll(faceToSurface, facei)
657 label surfacei = faceToSurface[facei];
668 label own = faceOwner[facei];
669 label nei = faceNeighbour[facei];
682 surfaceToFaceZone[surfacei],
689 label own = faceOwner[facei];
702 surfaceToFaceZone[surfacei],
710 autoPtr<mapPolyMesh> map = meshMod.changeMesh(
mesh,
false,
true);