52 const unsigned int val
72 if (protectedCell_.empty())
74 unrefineableCell.
clear();
78 const labelList& cellLevel = meshCutter_.cellLevel();
80 unrefineableCell = protectedCell_;
83 labelList neiLevel(nFaces()-nInternalFaces());
85 for (label faceI = nInternalFaces(); faceI < nFaces(); faceI++)
87 neiLevel[faceI-nInternalFaces()] = cellLevel[faceOwner()[faceI]];
97 forAll(faceNeighbour(), faceI)
99 label own = faceOwner()[faceI];
100 bool ownProtected = (unrefineableCell.
get(own) == 1);
101 label nei = faceNeighbour()[faceI];
102 bool neiProtected = (unrefineableCell.
get(nei) == 1);
104 if (ownProtected && (cellLevel[nei] > cellLevel[own]))
106 seedFace[faceI] =
true;
108 else if (neiProtected && (cellLevel[own] > cellLevel[nei]))
110 seedFace[faceI] =
true;
113 for (label faceI = nInternalFaces(); faceI < nFaces(); faceI++)
115 label own = faceOwner()[faceI];
116 bool ownProtected = (unrefineableCell.
get(own) == 1);
120 && (neiLevel[faceI-nInternalFaces()] > cellLevel[own])
123 seedFace[faceI] =
true;
131 bool hasExtended =
false;
133 for (label faceI = 0; faceI < nInternalFaces(); faceI++)
137 label own = faceOwner()[faceI];
138 if (unrefineableCell.
get(own) == 0)
140 unrefineableCell.
set(own, 1);
144 label nei = faceNeighbour()[faceI];
145 if (unrefineableCell.
get(nei) == 0)
147 unrefineableCell.
set(nei, 1);
152 for (label faceI = nInternalFaces(); faceI < nFaces(); faceI++)
156 label own = faceOwner()[faceI];
157 if (unrefineableCell.
get(own) == 0)
159 unrefineableCell.
set(own, 1);
207 meshCutter_.setRefinement(cellsToRefine, meshMod);
213 Info<<
"Refined from "
215 <<
" to " << globalData().nTotalCells() <<
" cells." <<
endl;
220 for (label faceI = 0; faceI < nInternalFaces(); faceI++)
222 label oldFaceI = map().faceMap()[faceI];
224 if (oldFaceI >= nInternalFaces())
226 FatalErrorIn(
"dynamicRefineFvMesh::refine(const labelList&)")
227 <<
"New internal face:" << faceI
228 <<
" fc:" << faceCentres()[faceI]
229 <<
" originates from boundary oldFace:" << oldFaceI
256 const labelList& faceMap = map().faceMap();
257 const labelList& reverseFaceMap = map().reverseFaceMap();
266 label oldFaceI = faceMap[faceI];
270 label masterFaceI = reverseFaceMap[oldFaceI];
276 "dynamicRefineFvMesh::refine(const labelList&)"
277 ) <<
"Problem: should not have removed faces"
281 else if (masterFaceI != faceI)
283 masterFaces.insert(masterFaceI);
290 <<
" split faces " <<
endl;
297 Info<<
"Mapping flux " << correctFluxes_[i][0]
298 <<
" using interpolated flux " << correctFluxes_[i][1]
303 lookupObject<surfaceScalarField>(correctFluxes_[i][0])
308 lookupObject<volVectorField>(correctFluxes_[i][1])
313 for (label faceI = 0; faceI < nInternalFaces(); faceI++)
315 label oldFaceI = faceMap[faceI];
320 phi[faceI] = phiU[faceI];
322 else if (reverseFaceMap[oldFaceI] != faceI)
325 phi[faceI] = phiU[faceI];
340 label oldFaceI = faceMap[faceI];
345 patchPhi[i] = patchPhiU[i];
347 else if (reverseFaceMap[oldFaceI] != faceI)
350 patchPhi[i] = patchPhiU[i];
360 label faceI = iter.key();
362 if (isInternalFace(faceI))
364 phi[faceI] = phiU[faceI];
377 patchPhi[i] = patchPhiU[i];
386 meshCutter_.updateMesh(map);
389 if (protectedCell_.size())
393 forAll(newProtectedCell, cellI)
395 label oldCellI = map().cellMap()[cellI];
396 newProtectedCell.
set(cellI, protectedCell_.get(oldCellI));
398 protectedCell_.transfer(newProtectedCell);
402 meshCutter_.checkRefinementLevels(-1,
labelList(0));
418 meshCutter_.setUnrefinement(splitPoints, meshMod);
432 label pointI = splitPoints[i];
434 const labelList& pEdges = pointEdges()[pointI];
438 label otherPointI = edges()[pEdges[j]].otherVertex(pointI);
444 faceToSplitPoint.insert(pFaces[pFaceI], otherPointI);
455 Info<<
"Unrefined from "
457 <<
" to " << globalData().nTotalCells() <<
" cells."
480 const labelList& reversePointMap = map().reversePointMap();
481 const labelList& reverseFaceMap = map().reverseFaceMap();
487 Info<<
"Mapping flux " << correctFluxes_[i][0]
488 <<
" using interpolated flux " << correctFluxes_[i][1]
493 lookupObject<surfaceScalarField>(correctFluxes_[i][0])
498 lookupObject<volVectorField>(correctFluxes_[i][1])
504 label oldFaceI = iter.key();
505 label oldPointI = iter();
507 if (reversePointMap[oldPointI] < 0)
510 label faceI = reverseFaceMap[oldFaceI];
514 if (isInternalFace(faceI))
516 phi[faceI] = phiU[faceI];
529 patchPhi[i] = patchPhiU[i];
539 meshCutter_.updateMesh(map);
542 if (protectedCell_.size())
546 forAll(newProtectedCell, cellI)
548 label oldCellI = map().cellMap()[cellI];
551 newProtectedCell.
set(cellI, protectedCell_.get(oldCellI));
554 protectedCell_.transfer(newProtectedCell);
558 meshCutter_.checkRefinementLevels(-1,
labelList(0));
575 vFld[pCells[i]] =
max(vFld[pCells[i]], pFld[pointI]);
593 pFld[pointI] =
min(pFld[pointI], vFld[pCells[i]]);
612 sum += vFld[pCells[i]];
614 pFld[pointI] = sum/pCells.
size();
624 const scalar minLevel,
625 const scalar maxLevel
632 scalar err =
min(fld[i]-minLevel, maxLevel-fld[i]);
645 const scalar lowerRefineLevel,
646 const scalar upperRefineLevel,
669 if (cellError[cellI] > 0)
671 candidateCell.
set(cellI, 1);
679 const label maxCells,
680 const label maxRefinement,
685 label nTotToRefine = (maxCells - globalData().nTotalCells()) / 7;
687 const labelList& cellLevel = meshCutter_.cellLevel();
692 calculateProtectedCells(unrefineableCell);
700 if (nCandidates < nTotToRefine)
702 forAll(candidateCell, cellI)
706 cellLevel[cellI] < maxRefinement
707 && candidateCell.
get(cellI) == 1
709 unrefineableCell.
empty()
710 || unrefineableCell.
get(cellI) == 0
721 for (label level = 0; level < maxRefinement; level++)
723 forAll(candidateCell, cellI)
727 cellLevel[cellI] == level
728 && candidateCell.
get(cellI) == 1
730 unrefineableCell.
empty()
731 || unrefineableCell.
get(cellI) == 0
749 meshCutter_.consistentRefinement
757 <<
" cells for refinement out of " << globalData().nTotalCells()
760 return consistentSet;
766 const scalar unrefineLevel,
772 const labelList splitPoints(meshCutter_.getSplitPoints());
778 label pointI = splitPoints[i];
780 if (pFld[pointI] < unrefineLevel)
783 const labelList& pCells = pointCells()[pointI];
785 bool hasMarked =
false;
789 if (markedCell.
get(pCells[pCellI]) == 1)
798 newSplitPoints.append(pointI);
804 newSplitPoints.shrink();
809 meshCutter_.consistentUnrefinement
816 <<
" split points out of a possible "
820 return consistentSet;
831 if (markedCell.
get(cellI) == 1)
837 markedFace[cFaces[i]] =
true;
847 if (markedFace[faceI])
855 if (markedFace[faceI])
865 dynamicRefineFvMesh::dynamicRefineFvMesh(
const IOobject& io)
870 nRefinementIterations_(0),
871 protectedCell_(nCells(), 0)
888 label nProtected = 0;
897 label pointI = cPoints[cPointI];
898 if (pointLevel[pointI] <= cellLevel[cellI])
925 neiLevel[faceI] = cellLevel[
faceOwner()[faceI]];
934 label faceLevel =
max
946 if (pointLevel[f[fp]] <= faceLevel)
954 protectedFace[faceI] =
true;
968 if (protectedFace[faceI])
982 if (protectedFace[faceI])
1000 if (nProtected == 0)
1033 ).
subDict(typeName +
"Coeffs")
1036 label refineInterval = readLabel(refineDict.
lookup(
"refineInterval"));
1038 bool hasChanged =
false;
1040 if (refineInterval == 0)
1046 else if (refineInterval < 0)
1049 <<
"Illegal refineInterval " << refineInterval <<
nl
1050 <<
"The refineInterval setting in the dynamicMeshDict should"
1051 <<
" be >= 1." <<
nl
1063 label maxCells = readLabel(refineDict.
lookup(
"maxCells"));
1068 <<
"Illegal maximum number of cells " << maxCells <<
nl
1069 <<
"The maxCells setting in the dynamicMeshDict should"
1074 label maxRefinement = readLabel(refineDict.
lookup(
"maxRefinement"));
1076 if (maxRefinement <= 0)
1079 <<
"Illegal maximum refinement level " << maxRefinement <<
nl
1080 <<
"The maxCells setting in the dynamicMeshDict should"
1087 const volScalarField& vFld = lookupObject<volScalarField>(field);
1089 const scalar lowerRefineLevel =
1091 const scalar upperRefineLevel =
1093 const scalar unrefineLevel =
1095 const label nBufferLayers =
1096 readLabel(refineDict.
lookup(
"nBufferLayers"));
1129 if (nCellsToRefine > 0)
1137 const labelList& cellMap = map().cellMap();
1138 const labelList& reverseCellMap = map().reverseCellMap();
1144 label oldCellI = cellMap[cellI];
1148 newRefineCell.set(cellI, 1);
1150 else if (reverseCellMap[oldCellI] != cellI)
1152 newRefineCell.set(cellI, 1);
1156 newRefineCell.set(cellI, refineCell.get(oldCellI));
1159 refineCell.
transfer(newRefineCell);
1164 for (label i = 0; i < nBufferLayers; i++)
1188 pointsToUnrefine.
size(),
1192 if (nSplitPoints > 0)
1225 const_cast<hexRef8&
>(meshCutter_).setInstance(time().timeName());
1229 && meshCutter_.write();
1248 const labelList& cellLevel = meshCutter_.cellLevel();
1252 scalarCellLevel[cellI] = cellLevel[cellI];
1255 writeOk = writeOk && scalarCellLevel.
write();