/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | www.openfoam.com
\\/ M anipulation |
-------------------------------------------------------------------------------
Copyright (C) 2011-2015 OpenFOAM Foundation
Copyright (C) 2020 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 .
Description
Contains fix for PrimitivePatch addressing (which doesn't work if surface
is non-manifold). Should be moved into PrimitivePatch.
\*---------------------------------------------------------------------------*/
#include "triSurface.H"
#include "PatchTools.H"
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
void Foam::triSurface::calcSortedEdgeFaces() const
{
if (sortedEdgeFacesPtr_)
{
FatalErrorInFunction
<< "sortedEdgeFacesPtr_ already set"
<< abort(FatalError);
}
const labelListList& eFaces = edgeFaces();
sortedEdgeFacesPtr_.reset(new labelListList(eFaces.size()));
auto& sortedEdgeFaces = *sortedEdgeFacesPtr_;
sortedEdgeFaces = PatchTools::sortedEdgeFaces(*this);
}
void Foam::triSurface::calcEdgeOwner() const
{
if (edgeOwnerPtr_)
{
FatalErrorInFunction
<< "edgeOwnerPtr_ already set"
<< abort(FatalError);
}
edgeOwnerPtr_.reset(new labelList(nEdges()));
auto& edgeOwner = *edgeOwnerPtr_;
forAll(edges(), edgeI)
{
const edge& e = edges()[edgeI];
const labelList& myFaces = edgeFaces()[edgeI];
if (myFaces.size() == 1)
{
edgeOwner[edgeI] = myFaces[0];
}
else
{
// Find the first face whose vertices are aligned with the edge.
// (in case of multiply connected edge the best we can do)
edgeOwner[edgeI] = -1;
forAll(myFaces, i)
{
const labelledTri& f = localFaces()[myFaces[i]];
if
(
((f[0] == e.start()) && (f[1] == e.end()))
|| ((f[1] == e.start()) && (f[2] == e.end()))
|| ((f[2] == e.start()) && (f[0] == e.end()))
)
{
edgeOwner[edgeI] = myFaces[i];
break;
}
}
if (edgeOwner[edgeI] == -1)
{
FatalErrorInFunction
<< "Edge " << edgeI << " vertices:" << e
<< " is used by faces " << myFaces
<< " vertices:"
<< UIndirectList(localFaces(), myFaces)
<< " none of which use the edge vertices in the same order"
<< nl << "I give up" << abort(FatalError);
}
}
}
}
// ************************************************************************* //