// Locate point on patch. Returns (mesh) point label. label findPoint(const primitivePatch& pp, const point& nearPoint) { const pointField& points = pp.points(); const labelList& meshPoints = pp.meshPoints(); // Find nearest and next nearest scalar minDistSqr = GREAT; label minI = -1; scalar almostMinDistSqr = GREAT; label almostMinI = -1; forAll(meshPoints, i) { label pointI = meshPoints[i]; scalar distSqr = magSqr(nearPoint - points[pointI]); if (distSqr < minDistSqr) { almostMinDistSqr = minDistSqr; almostMinI = minI; minDistSqr = distSqr; minI = pointI; } else if (distSqr < almostMinDistSqr) { almostMinDistSqr = distSqr; almostMinI = pointI; } }
// Collect all topological information about a point on a patch. // (this information is the patch faces using the point and the relative // position of the point in the face) void Foam::globalPoints::addToSend ( const primitivePatch& pp, const label patchPointI, const procPointList& knownInfo, DynamicList<label>& patchFaces, DynamicList<label>& indexInFace, DynamicList<procPointList>& allInfo ) { label meshPointI = pp.meshPoints()[patchPointI]; // Add all faces using the point so we are sure we find it on the // other side. const labelList& pFaces = pp.pointFaces()[patchPointI]; forAll(pFaces, i) { label patchFaceI = pFaces[i]; const face& f = pp[patchFaceI]; patchFaces.append(patchFaceI); indexInFace.append(findIndex(f, meshPointI)); allInfo.append(knownInfo); }
Foam::pointField Foam::perfectInterface::calcFaceCentres ( const primitivePatch& pp ) { const pointField& points = pp.points(); pointField ctrs(pp.size()); forAll(ctrs, patchFaceI) { ctrs[patchFaceI] = pp[patchFaceI].centre(points); }
bool Foam::ggiPolyPatch::order ( const primitivePatch& pp, labelList& faceMap, labelList& rotation ) const { faceMap.setSize(pp.size(), -1); rotation.setSize(pp.size(), 0); // Nothing changes return false; }
bool Foam::regionCouplePolyPatch::order ( const primitivePatch& pp, labelList& faceMap, labelList& rotation ) const { faceMap.setSize(pp.size()); faceMap = -1; rotation.setSize(pp.size()); rotation = 0; // Nothing changes return false; }
// Get point neighbours of faceI (including faceI). Returns number of faces. // Note: does not allocate storage but does use linear search to determine // uniqueness. For polygonal faces this might be quite inefficient. Foam::label Foam::cellDistFuncs::getPointNeighbours ( const primitivePatch& patch, const label patchFaceI, labelList& neighbours ) const { label nNeighbours = 0; // Add myself neighbours[nNeighbours++] = patchFaceI; // Add all face neighbours const labelList& faceNeighbours = patch.faceFaces()[patchFaceI]; forAll(faceNeighbours, faceNeighbourI) { neighbours[nNeighbours++] = faceNeighbours[faceNeighbourI]; } // Remember part of neighbours that contains edge-connected faces. label nEdgeNbs = nNeighbours; // Add all point-only neighbours by linear searching in edge neighbours. // Assumes that point-only neighbours are not using multiple points on // face. const face& f = patch.localFaces()[patchFaceI]; forAll(f, fp) { label pointI = f[fp]; const labelList& pointNbs = patch.pointFaces()[pointI]; forAll(pointNbs, nbI) { label faceI = pointNbs[nbI]; // Check for faceI in edge-neighbours part of neighbours if (findIndex(nEdgeNbs, neighbours, faceI) == -1) { neighbours[nNeighbours++] = faceI; } }
// Dump patch + weights to vtk file void writeWeights ( const scalarField& wghtSum, const primitivePatch& patch, const fileName& directory, const fileName& prefix, const word& timeName ) { vtkSurfaceWriter writer; writer.write ( directory, prefix + "_proc" + Foam::name(Pstream::myProcNo()) + "_" + timeName, patch.localPoints(), patch.localFaces(), "weightsSum", wghtSum, false ); }