54#ifndef Foam_PrimitivePatch_H
55#define Foam_PrimitivePatch_H
73template<
class T>
class Map;
79template<
class FaceList,
class Po
intField>
91 std::remove_reference<FaceList>::type::value_type
face_type;
95 std::remove_reference<PointField>::type::value_type
point_type;
131 mutable std::unique_ptr<edgeList> edgesPtr_;
134 mutable label nInternalEdges_;
137 mutable std::unique_ptr<labelList> boundaryPointsPtr_;
140 mutable std::unique_ptr<labelListList> faceFacesPtr_;
143 mutable std::unique_ptr<labelListList> edgeFacesPtr_;
146 mutable std::unique_ptr<labelListList> faceEdgesPtr_;
149 mutable std::unique_ptr<labelListList> pointEdgesPtr_;
152 mutable std::unique_ptr<labelListList> pointFacesPtr_;
155 mutable std::unique_ptr<List<face_type>> localFacesPtr_;
158 mutable std::unique_ptr<labelList> meshPointsPtr_;
162 mutable std::unique_ptr<Map<label>> meshPointMapPtr_;
165 mutable std::unique_ptr<labelListList> edgeLoopsPtr_;
168 mutable std::unique_ptr<Field<point_type>> localPointsPtr_;
171 mutable std::unique_ptr<labelList> localPointOrderPtr_;
174 mutable std::unique_ptr<Field<point_type>> faceCentresPtr_;
177 mutable std::unique_ptr<Field<point_type>> faceAreasPtr_;
180 mutable std::unique_ptr<Field<scalar>> magFaceAreasPtr_;
183 mutable std::unique_ptr<Field<point_type>> faceNormalsPtr_;
186 mutable std::unique_ptr<Field<point_type>> pointNormalsPtr_;
192 void calcInternPoints()
const;
195 void calcBdryPoints()
const;
198 void calcAddressing()
const;
201 void calcPointEdges()
const;
204 void calcPointFaces()
const;
207 void calcMeshData()
const;
210 void calcMeshPointMap()
const;
213 void calcEdgeLoops()
const;
216 void calcLocalPoints()
const;
219 void calcLocalPointOrder()
const;
222 void calcFaceCentres()
const;
225 void calcFaceAreas()
const;
228 void calcMagFaceAreas()
const;
231 void calcFaceNormals()
const;
234 void calcPointNormals()
const;
239 void visitPointRegion
243 const label startFacei,
244 const label startEdgeI,
256 const FaceList& faces,
308 return FaceList::size();
491 template<
class ToPatch>
494 const ToPatch& targetPatch,
501 template<
class ToPatch>
504 const ToPatch& targetPatch,
530 const bool report =
false,
542 const bool report =
false,
Generic templated field type.
A HashTable to objects of type <T> with a label key.
Non-templated base elements for PrimitivePatch.
A list of faces which address into the list of points.
label nEdges() const
Number of edges in patch.
bool hasPointFaces() const
label nPoints() const
Number of points supporting patch faces.
label nFaces() const noexcept
Number of faces in the patch.
label nBoundaryEdges() const
Number of boundary edges == (nEdges() - nInternalEdges())
FaceList FaceListType
The face list type.
const labelListList & pointEdges() const
Return point-edge addressing.
const edgeList & edges() const
Return list of edges, address into LOCAL point list.
label nInternalEdges() const
Number of internal edges.
bool hasBoundaryPoints() const
face_type FaceType
Deprecated(2020-03) prefer face_type typedef.
labelList meshEdges(const edgeList &allEdges, const labelListList &cellEdges, const labelList &faceCells) const
bool hasFaceNormals() const
const Map< label > & meshPointMap() const
Mesh point map.
const edgeList::subList internalEdges() const
Return sub-list of internal edges, address into LOCAL point list.
List< objectHit > projectFaceCentres(const ToPatch &targetPatch, const Field< point_type > &projectionDirection, const intersection::algorithm=intersection::FULL_RAY, const intersection::direction=intersection::VECTOR) const
Project vertices of patch onto another patch.
const labelList & meshPoints() const
Return labelList of mesh points in patch.
bool hasFaceAreas() const
edge meshEdge(const label edgei) const
From patch edge to global edge using meshPoints.
void operator=(const PrimitivePatch< FaceList, PointField > &rhs)
Copy assign faces. Leave points alone (could be a reference).
bool checkPointManifold(const bool report=false, labelHashSet *setPtr=nullptr) const
Checks primitivePatch for faces sharing point but not edge.
surfaceTopo surfaceType() const
Calculate surface type formed by patch.
bool hasFaceCentres() const
const Field< point_type > & localPoints() const
Return pointField of points in patch.
const Field< point_type > & faceNormals() const
Return face unit normals for patch.
const labelList & localPointOrder() const
Return orders the local points for most efficient search.
virtual ~PrimitivePatch()
Destructor.
const Field< point_type > & pointNormals() const
Return point normals for patch.
const edgeList::subList boundaryEdges() const
Return sub-list of boundary edges, address into LOCAL point list.
std::remove_reference< PointField >::type::value_type point_type
The point type.
bool hasMeshPointMap() const
labelList boundaryFaces() const
const Field< point_type > & points() const noexcept
Return reference to global points.
const Field< point_type > & faceAreas() const
Return face area vectors for patch.
PointField PointFieldType
The point field type.
label whichPoint(const label gp) const
Given a global point index, return the local point index.
const labelListList & edgeLoops() const
Return list of closed loops of boundary vertices.
virtual void movePoints(const Field< point_type > &)
Correct patch after moving points.
bool isInternalEdge(const label edgei) const
Is internal edge?
const labelList & boundaryPoints() const
Return list of boundary points, address into LOCAL point list.
const Field< point_type > & faceCentres() const
Return face centres for patch.
const labelListList & faceFaces() const
Return face-face addressing.
bool hasPointNormals() const
void swap(PrimitivePatch &)=delete
Suppress direct swapping, since storage containers may be const.
const labelListList & pointFaces() const
Return point-face addressing.
std::remove_reference< FaceList >::type::value_type face_type
The face type.
bool hasFaceEdges() const
const labelListList & edgeFaces() const
Return edge-face addressing.
bool checkTopology(const bool report=false, labelHashSet *setPtr=nullptr) const
Check surface formed by patch for manifoldness (see above).
const labelListList & faceEdges() const
Return face-edge addressing.
void clearPatchMeshAddr()
const Field< scalar > & magFaceAreas() const
Return face area magnitudes for patch.
List< objectHit > projectPoints(const ToPatch &targetPatch, const Field< point_type > &projectionDirection, const intersection::algorithm=intersection::FULL_RAY, const intersection::direction=intersection::VECTOR) const
Project vertices of patch onto another patch.
label whichEdge(const edge &e) const
Identical to findEdge.
bool hasEdgeFaces() const
label findEdge(const edge &e) const
const List< face_type > & localFaces() const
Return patch faces addressing into local point list.
bool hasPointEdges() const
surfaceTopo
Enumeration defining the surface type. Used in check routines.
bool hasFaceFaces() const
labelList uniqBoundaryFaces() const
A List obtained as a section of another List.
void size(const label n)
Older name for setAddressableSize.
An edge is a list of two point labels. The functionality it provides supports the discretisation on a...
Smooth ATC in cells next to a set of patches supplied by type.
Info<< "Finished reading KIVA file"<< endl;cellShapeList cellShapes(nPoints);labelList cellZoning(nPoints, -1);const cellModel &hex=cellModel::ref(cellModel::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].reset(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]