52 const face&
f = pFaces[fI];
54 label oCI = pOwner[fI];
56 const point& oCc = pC[oCI];
62 scalar thisBaseMinTetQuality = vGreat;
64 const point& tetBasePt = pPts[f[faceBasePtI]];
66 for (
label tetPtI = 1; tetPtI < f.size() - 1; tetPtI++)
68 label facePtI = (tetPtI + faceBasePtI) % f.
size();
69 label otherFacePtI = f.fcIndex(facePtI);
73 label ptAI = f[facePtI];
74 label ptBI = f[otherFacePtI];
76 const point& pA = pPts[ptAI];
77 const point& pB = pPts[ptBI];
81 tetQualities[0] = tet.
quality();
86 label ptAI = f[otherFacePtI];
87 label ptBI = f[facePtI];
89 const point& pA = pPts[ptAI];
90 const point& pB = pPts[ptBI];
94 tetQualities[1] = tet.
quality();
97 if (
min(tetQualities) < thisBaseMinTetQuality)
99 thisBaseMinTetQuality =
min(tetQualities);
103 if (thisBaseMinTetQuality > tol)
123 return findSharedBasePoint
147 const face&
f = pFaces[fI];
149 label cI = pOwner[fI];
151 bool own = (pOwner[fI] == cI);
153 const point& cC = pC[cI];
157 scalar thisBaseMinTetQuality = vGreat;
159 const point& tetBasePt = pPts[f[faceBasePtI]];
161 for (
label tetPtI = 1; tetPtI < f.size() - 1; tetPtI++)
163 label facePtI = (tetPtI + faceBasePtI) % f.
size();
164 label otherFacePtI = f.fcIndex(facePtI);
172 ptBI = f[otherFacePtI];
176 ptAI = f[otherFacePtI];
180 const point& pA = pPts[ptAI];
181 const point& pB = pPts[ptBI];
185 scalar tetQuality = tet.
quality();
187 if (tetQuality < thisBaseMinTetQuality)
189 thisBaseMinTetQuality = tetQuality;
193 if (thisBaseMinTetQuality > tol)
222 for (
label fI = 0; fI < nInternalFaces; fI++)
224 tetBasePtIs[fI] = findSharedBasePoint(mesh, fI, tol, report);
229 for(
label facei = nInternalFaces; facei < mesh.
nFaces(); facei++)
231 neighbourCellCentres[facei - nInternalFaces] =
235 syncTools::swapBoundaryFacePositions(mesh, neighbourCellCentres);
242 mesh.
nFaces() - nInternalFaces,
248 label fI = nInternalFaces, bFI = 0;
256 if (patches[patchi].coupled())
259 refCast<const coupledPolyPatch>(patches[
patchi]);
263 boundaryFaceTetBasePtIs[bFI] = findSharedBasePoint
267 neighbourCellCentres[bFI],
276 boundaryFaceTetBasePtIs[bFI] = -2;
281 boundaryFaceTetBasePtIs[bFI] = findBasePoint
294 syncTools::syncBoundaryFaceList
297 boundaryFaceTetBasePtIs,
303 label fI = nInternalFaces, bFI = 0;
308 label& bFTetBasePtI = boundaryFaceTetBasePtIs[bFI];
310 if (bFTetBasePtI == -2)
313 <<
"Coupled face base point exchange failure for face " 318 if (bFTetBasePtI < 1)
328 if (patches[patchi].coupled())
331 refCast<const coupledPolyPatch>(patches[
patchi]);
357 bFTetBasePtI = mesh.
faces()[fI].
size() - bFTetBasePtI;
389 syncTools::swapBoundaryFacePositions(mesh, neiCc);
395 label nErrorTets = 0;
399 const face&
f = fcs[facei];
426 const face& f = fcs[facei];
450 if (findSharedBasePoint(mesh, facei, tol, report) == -1)
464 if (patches[patchi].coupled())
488 if (findBasePoint(mesh, facei, tol, report) == -1)
507 Info<<
" ***Error in face tets: " 508 << nErrorTets <<
" faces with low quality or negative volume " 509 <<
"decomposition tets." <<
endl;
535 const face&
f = pFaces[fI];
541 for (
label tetPtI = 1; tetPtI < f.
size() - 1; tetPtI ++)
543 faceTets[tetPtI - 1] =
tetIndices(cI, fI, tetPtI);
559 const cell& thisCell = pCells[cI];
565 nTets += pFaces[thisCell[cFI]].
size() - 2;
572 label fI = thisCell[cFI];
574 cellTets.
append(faceTetIndices(mesh, fI, cI));
591 const cell& thisCell = pCells[cI];
598 label fI = thisCell[cFI];
599 const face&
f = pFaces[fI];
601 for (
label tetPtI = 1; tetPtI < f.
size() - 1; tetPtI++)
609 tetContainingPt = faceTetIs;
614 if (tetContainingPt.
cell() != -1)
620 return tetContainingPt;
const polyBoundaryMesh & boundaryMesh() const
Return boundary mesh.
tetrahedron< point, const point & > tetPointRef
#define forAll(list, i)
Loop across all elements in list.
intWM_LABEL_SIZE_t label
A label is an int32_t or int64_t as specified by the pre-processor macro WM_LABEL_SIZE.
static labelList findFaceBasePts(const polyMesh &mesh, scalar tol=minTetQuality, bool report=false)
Find a suitable base point for each face for decomposition.
A face is a list of labels corresponding to mesh vertices.
#define FatalErrorInFunction
Report an error message using Foam::FatalError.
label nInternalFaces() const
virtual const labelList & faceNeighbour() const
Return face neighbour.
dimensionedSymmTensor sqr(const dimensionedVector &dv)
void size(const label)
Override size to be inconsistent with allocated storage.
Ostream & endl(Ostream &os)
Add newline and flush stream.
const labelList & patchID() const
Per boundary face label the patch index.
label nextLabel(const label i) const
Next vertex on face.
The coupledPolyPatch is an abstract base class for patches that couple regions of the computational d...
const cellList & cells() const
bool insert(const Key &key)
Insert a new entry.
tetPointRef tet(const polyMesh &mesh) const
Return the geometry corresponding to this tet.
static label findBasePoint(const polyMesh &mesh, label fI, scalar tol, bool report=false)
Find the base point to use for a minimum triangle.
static List< tetIndices > cellTetIndices(const polyMesh &mesh, label cI)
Return the tet decomposition of the given cell, see.
virtual const pointField & points() const
Return raw points.
static tetIndices findTet(const polyMesh &mesh, label cI, const point &pt)
Find the tet decomposition of the cell containing the given point.
static bool checkFaceTets(const polyMesh &mesh, scalar tol=minTetQuality, const bool report=false, labelHashSet *setPtr=nullptr)
Check face-decomposition tet volume.
A List obtained as a section of another List.
A 1D vector of objects of type <T> that resizes itself as necessary to accept the new objects...
label cell() const
Return the cell.
scalar quality() const
Return quality: Ratio of tetrahedron and circum-sphere.
static label findSharedBasePoint(const polyMesh &mesh, label fI, const point &nCc, scalar tol, bool report=false)
Find the first suitable base point to use for a minimum.
virtual bool owner() const =0
Does this side own the patch ?
virtual const labelList & faceOwner() const
Return face owner.
DynamicList< T, SizeInc, SizeMult, SizeDiv > & append(const T &)
Append an element at the end of the list.
Storage and named access for the indices of a tet which is part of the decomposition of a cell...
virtual const faceList & faces() const
Return raw faces.
bool inside(const point &pt) const
Return true if point is inside tetrahedron.
const vectorField & cellCentres() const
errorManip< error > abort(error &err)
bool isInternalFace(const label faceIndex) const
Return true if given face label is internal to the mesh.
dimensioned< Type > min(const dimensioned< Type > &, const dimensioned< Type > &)
void reduce(const List< UPstream::commsStruct > &comms, T &Value, const BinaryOp &bop, const int tag, const label comm)
const vectorField & faceCentres() const
A cell is defined as a list of faces with extra functionality.
Mesh consisting of general polyhedral cells.
Info<< "Finished reading KIVA file"<< endl;cellShapeList cellShapes(nPoints);labelList cellZoning(nPoints, -1);const cellModel &hex=*(cellModeller::lookup("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]=cellShape(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 const scalar minTetQuality
Minimum tetrahedron quality.
static List< tetIndices > faceTetIndices(const polyMesh &mesh, label fI, label cI)
Return the tet decomposition of the given face, with.