/*---------------------------------------------------------------------------*\ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2011-2017 OpenFOAM Foundation \\/ M anipulation | Copyright (C) 2015-2016 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. OpenFOAM is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. OpenFOAM is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenFOAM. If not, see . \*---------------------------------------------------------------------------*/ #include "extendedEdgeMesh.H" #include "surfaceFeatures.H" #include "triSurface.H" #include "Random.H" #include "Time.H" #include "OBJstream.H" #include "DynamicField.H" #include "edgeMeshFormatsCore.H" #include "IOmanip.H" #include "searchableSurface.H" #include "triSurfaceMesh.H" // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // namespace Foam { defineTypeNameAndDebug(extendedEdgeMesh, 0); } const Foam::Enum < Foam::extendedEdgeMesh::pointStatus > Foam::extendedEdgeMesh::pointStatusNames_ { { pointStatus::CONVEX, "convex" }, { pointStatus::CONCAVE, "concave" }, { pointStatus::MIXED, "mixed" }, { pointStatus::NONFEATURE, "nonFeature" }, }; const Foam::Enum < Foam::extendedEdgeMesh::edgeStatus > Foam::extendedEdgeMesh::edgeStatusNames_ { { edgeStatus::EXTERNAL, "external" }, { edgeStatus::INTERNAL, "internal" }, { edgeStatus::FLAT, "flat" }, { edgeStatus::OPEN, "open" }, { edgeStatus::MULTIPLE, "multiple" }, { edgeStatus::NONE, "none" }, }; const Foam::Enum < Foam::extendedEdgeMesh::sideVolumeType > Foam::extendedEdgeMesh::sideVolumeTypeNames_ { { sideVolumeType::INSIDE, "inside" }, { sideVolumeType::OUTSIDE, "outside" }, { sideVolumeType::BOTH, "both" }, { sideVolumeType::NEITHER, "neither" }, }; Foam::scalar Foam::extendedEdgeMesh::cosNormalAngleTol_ = Foam::cos(degToRad(0.1)); Foam::label Foam::extendedEdgeMesh::convexStart_ = 0; Foam::label Foam::extendedEdgeMesh::externalStart_ = 0; Foam::label Foam::extendedEdgeMesh::nPointTypes = 4; Foam::label Foam::extendedEdgeMesh::nEdgeTypes = 5; Foam::wordHashSet Foam::extendedEdgeMesh::readTypes() { return wordHashSet(*fileExtensionConstructorTablePtr_); } Foam::wordHashSet Foam::extendedEdgeMesh::writeTypes() { return wordHashSet(*writefileExtensionMemberFunctionTablePtr_); } // * * * * * * * * * * * * * Static Member Functions * * * * * * * * * * * * // bool Foam::extendedEdgeMesh::canReadType ( const word& ext, const bool verbose ) { return edgeMeshFormatsCore::checkSupport ( readTypes(), ext, verbose, "reading" ); } bool Foam::extendedEdgeMesh::canWriteType ( const word& ext, const bool verbose ) { return edgeMeshFormatsCore::checkSupport ( writeTypes(), ext, verbose, "writing" ); } bool Foam::extendedEdgeMesh::canRead ( const fileName& name, const bool verbose ) { word ext = name.ext(); if (ext == "gz") { ext = name.lessExt().ext(); } return canReadType(ext, verbose); } // * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * // Foam::extendedEdgeMesh::pointStatus Foam::extendedEdgeMesh::classifyFeaturePoint ( label ptI ) const { const labelList& ptEds(pointEdges()[ptI]); label nPtEds = ptEds.size(); label nExternal = 0; label nInternal = 0; if (nPtEds == 0) { // There are no edges attached to the point, this is a problem return NONFEATURE; } forAll(ptEds, i) { edgeStatus edStat = getEdgeStatus(ptEds[i]); if (edStat == EXTERNAL) { nExternal++; } else if (edStat == INTERNAL) { nInternal++; } } if (nExternal == nPtEds) { return CONVEX; } else if (nInternal == nPtEds) { return CONCAVE; } else { return MIXED; } } void Foam::extendedEdgeMesh::cut ( const searchableSurface& surf, labelList& pointMap, labelList& edgeMap, labelList& pointsFromEdge, labelList& oldEdge, labelList& surfTri ) { const edgeList& edges = this->edges(); const pointField& points = this->points(); List> edgeHits(edges.size()); { pointField start(edges.size()); pointField end(edges.size()); forAll(edges, edgeI) { const edge& e = edges[edgeI]; start[edgeI] = points[e[0]]; end[edgeI] = points[e[1]]; } surf.findLineAll(start, end, edgeHits); } // Count number of hits label nHits = 0; forAll(edgeHits, edgeI) { nHits += edgeHits[edgeI].size(); } DynamicField newPoints(points); DynamicList