33 void Foam::extendedUpwindCellToFaceStencil::selectOppositeFaces
36 const scalar minOpposedness,
39 DynamicList<label>& oppositeFaces
46 SortableList<scalar> opposedness(cFaces.size(), -GREAT);
51 label otherFaceI = cFaces[i];
53 if (otherFaceI != faceI && nonEmptyFace[otherFaceI])
55 if ((own[otherFaceI] == cellI) == (own[faceI] == cellI))
57 opposedness[i] = -(areas[otherFaceI] & areas[faceI]);
61 opposedness[i] = (areas[otherFaceI] & areas[faceI]);
66 label sz = opposedness.size();
68 oppositeFaces.clear();
70 scalar myAreaSqr =
magSqr(areas[faceI]);
72 if (myAreaSqr > VSMALL)
76 opposedness[i] /= myAreaSqr;
82 oppositeFaces.append(cFaces[opposedness.indices()[sz-1]]);
84 for (label i = sz-2; i >= 0; --i)
86 if (opposedness[i] < minOpposedness)
90 oppositeFaces.append(cFaces[opposedness.indices()[i]]);
100 oppositeFaces.append(cFaces[opposedness.indices()[sz-1]]);
105 void Foam::extendedUpwindCellToFaceStencil::transportStencil
109 const scalar minOpposedness,
112 const bool stencilHasNeighbour,
114 DynamicList<label>& oppositeFaces,
119 label globalOwn = faceStencil[faceI][0];
120 label globalNei = -1;
121 if (stencilHasNeighbour && faceStencil[faceI].size() >= 2)
123 globalNei = faceStencil[faceI][1];
137 faceStencilSet.clear();
140 const labelList& fStencil = faceStencil[oppositeFaces[i]];
144 label globalI = fStencil[j];
146 if (globalI != globalOwn && globalI != globalNei)
148 faceStencilSet.insert(globalI);
154 if (stencilHasNeighbour)
156 transportedStencil.setSize(faceStencilSet.size()+2);
158 transportedStencil[n++] = globalOwn;
159 transportedStencil[n++] = globalNei;
163 if (iter.key() != globalOwn && iter.key() != globalNei)
165 transportedStencil[n++] = iter.key();
168 if (n != transportedStencil.size())
172 "extendedUpwindCellToFaceStencil::transportStencil(..)"
173 ) <<
"problem:" << faceStencilSet
179 transportedStencil.setSize(faceStencilSet.size()+1);
181 transportedStencil[n++] = globalOwn;
185 if (iter.key() != globalOwn)
187 transportedStencil[n++] = iter.key();
190 if (n != transportedStencil.size())
194 "extendedUpwindCellToFaceStencil::transportStencil(..)"
195 ) <<
"problem:" << faceStencilSet
202 void Foam::extendedUpwindCellToFaceStencil::transportStencils
205 const scalar minOpposedness,
210 const polyBoundaryMesh&
patches = mesh_.boundaryMesh();
211 const label nBnd = mesh_.nFaces()-mesh_.nInternalFaces();
212 const labelList& own = mesh_.faceOwner();
213 const labelList& nei = mesh_.faceNeighbour();
216 DynamicList<label> oppositeFaces;
221 boolList nonEmptyFace(mesh_.nFaces(),
true);
224 const polyPatch& pp = patches[patchI];
226 if (isA<emptyPolyPatch>(pp))
228 label faceI = pp.start();
231 nonEmptyFace[faceI++] =
false;
241 ownStencil.setSize(mesh_.nFaces());
244 for (label faceI = 0; faceI < mesh_.nInternalFaces(); faceI++)
263 const polyPatch& pp = patches[patchI];
264 label faceI = pp.start();
286 else if (!isA<emptyPolyPatch>(pp))
314 for (label faceI = mesh_.nInternalFaces(); faceI < mesh_.nFaces(); faceI++)
316 neiBndStencil[faceI-mesh_.nInternalFaces()] = ownStencil[faceI];
327 neiStencil.setSize(mesh_.nFaces());
330 for (label faceI = 0; faceI < mesh_.nInternalFaces(); faceI++)
350 const polyPatch& pp = patches[patchI];
351 label faceI = pp.start();
357 neiStencil[faceI].transfer
359 neiBndStencil[faceI-mesh_.nInternalFaces()]
374 Foam::extendedUpwindCellToFaceStencil::extendedUpwindCellToFaceStencil
377 const bool pureUpwind,
378 const scalar minOpposedness
382 pureUpwind_(pureUpwind)
421 ownMapPtr_ = calcDistributeMap
428 neiMapPtr_ = calcDistributeMap
445 collectData(ownMapPtr_(), ownStencil_, mesh.
C(), stencilPoints);
448 forAll(stencilPoints, faceI)
454 const labelList& stencil = ownStencil_[faceI];
459 if (((points[i]-fc) & fArea) < 0)
461 newStencil.append(stencil[i]);
464 if (newStencil.size() != stencil.
size())
466 ownStencil_[faceI].transfer(newStencil);
474 collectData(neiMapPtr_(), neiStencil_, mesh.
C(), stencilPoints);
477 forAll(stencilPoints, faceI)
483 const labelList& stencil = neiStencil_[faceI];
488 if (((points[i]-fc) & fArea) > 0)
490 newStencil.append(stencil[i]);
493 if (newStencil.size() != stencil.
size())
495 neiStencil_[faceI].transfer(newStencil);
505 Foam::extendedUpwindCellToFaceStencil::extendedUpwindCellToFaceStencil
515 ownStencil_ = stencil;
517 ownMapPtr_ = calcDistributeMap
527 collectData(ownMapPtr_(), ownStencil_, mesh.C(), stencilPoints);
530 neiStencil_.
setSize(ownStencil_.size());
532 forAll(stencilPoints, faceI)
534 const point& fc = mesh.faceCentres()[faceI];
535 const vector& fArea = mesh.faceAreas()[faceI];
538 const labelList& stencil = ownStencil_[faceI];
544 if (((points[i]-fc) & fArea) > 0)
546 newNeiStencil.append(stencil[i]);
550 newOwnStencil.append(stencil[i]);
553 if (newNeiStencil.size() > 0)
555 ownStencil_[faceI].transfer(newOwnStencil);
556 neiStencil_[faceI].transfer(newNeiStencil);