175 isOutsideFace.
setSize(mesh_.nFaces());
176 isOutsideFace =
Zero;
178 forAll(mesh_.faceNeighbour(), facei)
180 label own = mesh_.faceOwner()[facei];
181 label nei = mesh_.faceNeighbour()[facei];
184 (cellLevel[own] == cellLevel[nei])
191 isOutsideFace.
set(facei);
196 const label nBnd = mesh_.nFaces()-mesh_.nInternalFaces();
199 syncTools::swapBoundaryCellList(mesh_,
refineCell, neiRefineCell);
200 for (label bFacei = 0; bFacei < nBnd; ++bFacei)
202 label facei = mesh_.nInternalFaces()+bFacei;
203 label own = mesh_.faceOwner()[facei];
207 (cellLevel[own] == neiLevel[bFacei])
210 != (neiRefineCell[bFacei] != -1)
214 isOutsideFace.
set(facei);
223 const bitSet& isOutsideFace,
227 const cell& cFaces = mesh_.cells()[celli];
234 const label facei = cFaces[cFacei];
236 if (isOutsideFace[facei])
238 const vector&
n = faceAreas[facei];
241 if (magSqrN > ROOTVSMALL)
246 dir < pTraits<vector>::nComponents;
252 haveDirs[dir] =
true;
275 const bitSet& isOutsideFace,
286 if (countFaceDirs(isOutsideFace, celli) == 3)
297 void Foam::meshRefinement::markMultiRegionCell
306 if (!isMultiRegion[celli])
311 cellToRegions.insert(celli, surface);
313 else if (fnd() != surface)
316 isMultiRegion.
set(celli);
322 void Foam::meshRefinement::detectMultiRegionCells
328 const List<pointIndexHit>& hit1,
332 const List<pointIndexHit>& hit2,
335 bitSet& isMultiRegion
338 isMultiRegion.clear();
339 isMultiRegion.setSize(mesh_.nCells());
341 Map<FixedList<label, 3>> cellToRegions(testFaces.size());
348 const label facei = testFaces[i];
349 const labelList& fz1 = faceZones[surface1[i]];
350 const FixedList<label, 3> surfaceInfo1
354 (fz1.size() ? fz1[info1.index()] : region1[i])
359 mesh_.faceOwner()[facei],
364 if (mesh_.isInternalFace(facei))
368 mesh_.faceNeighbour()[facei],
377 if (info2.hit() && info1 != info2)
379 const labelList& fz2 = faceZones[surface2[i]];
380 const FixedList<label, 3> surfaceInfo2
384 (fz2.size() ? fz2[info2.index()] : region2[i])
389 mesh_.faceOwner()[facei],
394 if (mesh_.isInternalFace(facei))
398 mesh_.faceNeighbour()[facei],
416 mesh_.time().timeName(),
426 dimensionSet(0, 1, 0, 0, 0),
430 forAll(isMultiRegion, celli)
432 if (isMultiRegion[celli])
434 multiCell[celli] = 1.0;
438 Info<<
"Writing all multi cells to " << multiCell.name() <<
endl;
444 Foam::label Foam::meshRefinement::markProximityRefinementWave
446 const scalar planarCos,
448 const label nAllowRefine,
459 for (
const label surfi : blockedSurfaces)
461 const label geomi = surfaces_.surfaces()[surfi];
462 const searchableSurface&
s = surfaces_.geometry()[geomi];
463 if (isA<triSurfaceMesh>(
s) && !isA<distributedTriSurfaceMesh>(
s))
465 const triSurfaceMesh& surf = refCast<const triSurfaceMesh>(
s);
467 boolList isOpenEdge(edFaces.size(),
false);
470 if (edFaces[i].size() == 1)
472 isOpenEdge[i] =
true;
477 const label
nZones = surf.markZones(isOpenEdge, faceZone);
480 faceZones[surfi].transfer(faceZone);
489 scalarField regionToBlockSize(surfaces_.blockLevel().size(), 0);
492 for (
const label surfi : blockedSurfaces)
494 const label geomi = surfaces_.surfaces()[surfi];
495 const searchableSurface&
s = surfaces_.geometry()[geomi];
496 const label nRegions =
s.regions().size();
497 for (label regioni = 0; regioni < nRegions; regioni++)
499 const label globalRegioni = surfaces_.globalRegion(surfi, regioni);
500 const label bLevel = surfaces_.blockLevel()[globalRegioni];
501 regionToBlockSize[globalRegioni] =
502 meshCutter_.level0EdgeLength()/
pow(2.0, bLevel);
519 const label nIters = mesh_.globalData().nTotalCells();
524 const labelList testFaces(getRefineCandidateFaces(refineCell));
552 List<pointIndexHit> hit1;
557 List<pointIndexHit> hit2;
561 surfaces_.findNearestIntersection
580 bitSet isMultiRegion;
581 detectMultiRegionCells
607 List<wallPoints> faceDist(
n);
611 DynamicList<point> originLocation(2);
612 DynamicList<scalar> originDistSqr(2);
613 DynamicList<FixedList<label, 3>> originSurface(2);
620 const label facei = testFaces[i];
621 const point& fc = mesh_.faceCentres()[facei];
622 const labelList& fz1 = faceZones[surface1[i]];
624 originLocation.
clear();
625 originDistSqr.clear();
627 originSurface.clear();
629 originLocation.append(hit1[i].hitPoint());
630 originDistSqr.append(
magSqr(fc-hit1[i].hitPoint()));
638 (fz1.size() ? fz1[hit1[i].index()] : region1[i])
642 if (hit2[i].hit() && hit1[i] != hit2[i])
644 const labelList& fz2 = faceZones[surface2[i]];
645 originLocation.
append(hit2[i].hitPoint());
646 originDistSqr.append(
magSqr(fc-hit2[i].hitPoint()));
654 (fz2.size() ? fz2[hit2[i].index()] : region2[i])
659 faceDist[
n] = wallPoints
666 changedFaces[
n] = facei;
683 List<wallPoints> allFaceInfo(mesh_.nFaces());
684 List<wallPoints> allCellInfo(mesh_.nCells());
686 FaceCellWave<wallPoints> wallDistCalc
695 wallDistCalc.iterate(nIters);
706 mesh_.time().timeName(),
721 forAll(allCellInfo, celli)
723 if (allCellInfo[celli].valid(wallDistCalc.data()))
725 const point& cc = mesh_.C()[celli];
727 const List<point>& origin = allCellInfo[celli].origin();
730 for (label i = 0; i < origin.size(); i++)
732 for (label j = i + 1; j < origin.size(); j++)
734 if (((cc-origin[i]) & (cc-origin[j])) < 0)
736 const scalar d(
mag(origin[i]-origin[j]));
750 distance.correctBoundaryConditions();
752 Info<<
"Writing measured gap distance to "
772 forAll(allCellInfo, celli)
774 if (allCellInfo[celli].valid(wallDistCalc.data()))
776 const point& cc = mesh_.C()[celli];
778 const List<point>& origin = allCellInfo[celli].origin();
779 const List<FixedList<label, 3>>& surface =
780 allCellInfo[celli].surface();
783 for (label i = 0; i < origin.size(); i++)
785 for (label j = i + 1; j < origin.size(); j++)
812 if (((cc-origin[i]) & (cc-origin[j])) < 0)
814 const label globalRegioni = surfaces_.globalRegion
819 const label globalRegionj = surfaces_.globalRegion
825 const scalar maxSize =
max
827 regionToBlockSize[globalRegioni],
828 regionToBlockSize[globalRegionj]
833 magSqr(origin[i]-origin[j])
837 smallGapDistance[celli] =
838 max(smallGapDistance[celli], maxDist);
850 Info<<
"Marked for blocking due to intersecting multiple surfaces : "
852 Info<<
"Marked for blocking due to close opposite surfaces : "
863 mesh_.time().timeName(),
873 dimensionSet(0, 1, 0, 0, 0),
877 distance.field() = smallGapDistance;
878 distance.correctBoundaryConditions();
880 Info<<
"Writing all small-gap cells to "
887 const label oldNRefine = nRefine;
888 forAll(smallGapDistance, celli)
890 if (smallGapDistance[celli] > SMALL)
905 Pout<<
"Stopped refining since reaching my cell"
906 <<
" limit of " << mesh_.nCells()+7*nRefine
920 Info<<
"Reached refinement limit." <<
endl;
923 return returnReduce(nRefine-oldNRefine, sumOp<label>());
929 const scalar planarAngle,
936 labelList neiLevel(mesh_.nFaces()-mesh_.nInternalFaces());
937 pointField neiCc(mesh_.nFaces()-mesh_.nInternalFaces());
938 calcNeighbourData(neiLevel, neiCc);
961 forAll(surfaces_.surfaces(), surfi)
963 const label geomi = surfaces_.surfaces()[surfi];
965 const label nRegions =
s.regions().size();
968 for (label regioni = 0; regioni < nRegions; regioni++)
970 const label globalRegioni = surfaces_.globalRegion(surfi, regioni);
974 surfaces_.blockLevel()[globalRegioni]
980 surfToBlockLevel.insert(surfi, minBlockLevel);
985 markProximityRefinementWave
988 surfToBlockLevel.sortedToc(),
1013 Info<<
"Marked for blocking due to close opposite surfaces : "
1023 for (label iter = 0; iter < growIter; iter++)
1028 meshCutter_.cellLevel(),
1034 growSet(neiLevel, isOutsideFace,
refineCell, nRefine);
1039 for (label iter = 0; iter < growIter; iter++)
1051 for (label celli = 0; celli < mesh_.nCells(); celli++)
1053 if (
refineCell[celli] != -1 && oldRefineCell[celli] == -1)
1055 if (countFaceDirs(isOutsideFace, celli) >= 3)
1064 Info<<
"Marked for blocking after filtering : "
1072 const label defaultRegion(surfaces_.globalRegion(unnamedSurfaces[0], 0));
1091 cellsToRemove[nRefine++] = cellI;
1099 labelList exposedPatches(exposedFaces.size());
1102 label facei = exposedFaces[i];
1103 exposedPatches[i] = globalToMasterPatch[nearestRegion[facei]];
1106 return doRemoveCells