FEATURE: cfMesh library structure cleanup. Author: Dominik Christ. Merge: Dominik Christ.
This commit is contained in:
parent
a90076f1c7
commit
a9fefbe25b
9 changed files with 0 additions and 1216 deletions
|
@ -1,251 +0,0 @@
|
||||||
/*---------------------------------------------------------------------------*\
|
|
||||||
========= |
|
|
||||||
\\ / F ield | cfMesh: A library for mesh generation
|
|
||||||
\\ / O peration |
|
|
||||||
\\ / A nd | Author: Franjo Juretic (franjo.juretic@c-fields.com)
|
|
||||||
\\/ M anipulation | Copyright (C) Creative Fields, Ltd.
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
License
|
|
||||||
This file is part of cfMesh.
|
|
||||||
|
|
||||||
cfMesh 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.
|
|
||||||
|
|
||||||
cfMesh 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 cfMesh. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
Description
|
|
||||||
|
|
||||||
\*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
#include "demandDrivenData.H"
|
|
||||||
#include "symmetryPlaneOptimisation.H"
|
|
||||||
#include "polyMeshGenAddressing.H"
|
|
||||||
#include "helperFunctions.H"
|
|
||||||
#include "polyMeshGenChecks.H"
|
|
||||||
#include "meshOptimizer.H"
|
|
||||||
|
|
||||||
// #define DEBUGSearch
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
namespace Foam
|
|
||||||
{
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
void symmetryPlaneOptimisation::detectSymmetryPlanes()
|
|
||||||
{
|
|
||||||
const PtrList<boundaryPatch>& boundaries = mesh_.boundaries();
|
|
||||||
const pointFieldPMG& points = mesh_.points();
|
|
||||||
const faceListPMG& faces = mesh_.faces();
|
|
||||||
|
|
||||||
symmetryPlanes_.clear();
|
|
||||||
|
|
||||||
typedef std::map<label, std::pair<vector, label> > mapType;
|
|
||||||
mapType centreSum, normalSum;
|
|
||||||
|
|
||||||
forAll(boundaries, patchI)
|
|
||||||
{
|
|
||||||
if( boundaries[patchI].patchType() == "symmetryPlane" )
|
|
||||||
{
|
|
||||||
std::pair<vector, label>& cs = centreSum[patchI];
|
|
||||||
cs = std::pair<vector, label>(vector::zero, 0);
|
|
||||||
|
|
||||||
std::pair<vector, label>& ns = normalSum[patchI];
|
|
||||||
ns = std::pair<vector, label>(vector::zero, 0);
|
|
||||||
|
|
||||||
const label start = boundaries[patchI].patchStart();
|
|
||||||
const label end = start + boundaries[patchI].patchSize();
|
|
||||||
for(label faceI=start;faceI<end;++faceI)
|
|
||||||
{
|
|
||||||
cs.first += faces[faceI].centre(points);
|
|
||||||
ns.first += faces[faceI].normal(points);
|
|
||||||
}
|
|
||||||
|
|
||||||
cs.second = ns.second = boundaries[patchI].patchSize();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if( Pstream::parRun() )
|
|
||||||
{
|
|
||||||
//- sum up all normals and centres of all processors
|
|
||||||
//- every symmetry plane patch must be present on all processors
|
|
||||||
forAllIter(mapType, centreSum, pIter)
|
|
||||||
{
|
|
||||||
std::pair<vector, label>& cs = pIter->second;
|
|
||||||
reduce(cs.second, sumOp<label>());
|
|
||||||
reduce(cs.first, sumOp<vector>());
|
|
||||||
|
|
||||||
std::pair<vector, label>& ns = normalSum[pIter->first];
|
|
||||||
reduce(ns.first, sumOp<vector>());
|
|
||||||
ns.second = cs.second;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//- create planes corresponding to each symmetry plane
|
|
||||||
forAllConstIter(mapType, centreSum, it)
|
|
||||||
{
|
|
||||||
const point c = it->second.first / it->second.second;
|
|
||||||
|
|
||||||
const std::pair<vector, label>& ns = normalSum[it->first];
|
|
||||||
const point n = ns.first / ns.second;
|
|
||||||
|
|
||||||
symmetryPlanes_.insert(std::make_pair(it->first, plane(c, n)));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void symmetryPlaneOptimisation::pointInPlanes(VRWGraph& pointInPlanes) const
|
|
||||||
{
|
|
||||||
const PtrList<boundaryPatch>& boundaries = mesh_.boundaries();
|
|
||||||
const pointFieldPMG& points = mesh_.points();
|
|
||||||
const faceListPMG& faces = mesh_.faces();
|
|
||||||
|
|
||||||
pointInPlanes.clear();
|
|
||||||
pointInPlanes.setSize(points.size());
|
|
||||||
|
|
||||||
forAll(boundaries, patchI)
|
|
||||||
{
|
|
||||||
if( boundaries[patchI].patchType() == "symmetryPlane" )
|
|
||||||
{
|
|
||||||
const label start = boundaries[patchI].patchStart();
|
|
||||||
const label end = start + boundaries[patchI].patchSize();
|
|
||||||
for(label faceI=start;faceI<end;++faceI)
|
|
||||||
{
|
|
||||||
const face& f = faces[faceI];
|
|
||||||
|
|
||||||
forAll(f, pI)
|
|
||||||
pointInPlanes.appendIfNotIn(f[pI], patchI);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if( Pstream::parRun() )
|
|
||||||
{
|
|
||||||
const Map<label>& globalToLocal =
|
|
||||||
mesh_.addressingData().globalToLocalPointAddressing();
|
|
||||||
const VRWGraph& pointAtProcs = mesh_.addressingData().pointAtProcs();
|
|
||||||
const DynList<label>& neiProcs =
|
|
||||||
mesh_.addressingData().pointNeiProcs();
|
|
||||||
|
|
||||||
std::map<label, labelLongList> exchangeData;
|
|
||||||
forAll(neiProcs, i)
|
|
||||||
exchangeData[neiProcs[i]].clear();
|
|
||||||
|
|
||||||
forAllConstIter(Map<label>, globalToLocal, it)
|
|
||||||
{
|
|
||||||
const label pointI = it();
|
|
||||||
|
|
||||||
if( pointInPlanes.sizeOfRow(pointI) == 0 )
|
|
||||||
continue;
|
|
||||||
|
|
||||||
forAllRow(pointAtProcs, pointI, i)
|
|
||||||
{
|
|
||||||
const label neiProc = pointAtProcs(pointI, i);
|
|
||||||
|
|
||||||
if( neiProc == Pstream::myProcNo() )
|
|
||||||
continue;
|
|
||||||
|
|
||||||
labelLongList& dataToSend = exchangeData[neiProc];
|
|
||||||
|
|
||||||
dataToSend.append(it.key());
|
|
||||||
dataToSend.append(pointInPlanes.sizeOfRow(pointI));
|
|
||||||
forAllRow(pointInPlanes, pointI, pipI)
|
|
||||||
dataToSend.append(pointInPlanes(pointI, pipI));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
labelLongList receivedData;
|
|
||||||
help::exchangeMap(exchangeData, receivedData);
|
|
||||||
|
|
||||||
for(label counter=0;counter<receivedData.size();)
|
|
||||||
{
|
|
||||||
const label pointI = globalToLocal[receivedData[counter++]];
|
|
||||||
|
|
||||||
const label size = receivedData[counter++];
|
|
||||||
for(label i=0;i<size;++i)
|
|
||||||
pointInPlanes.appendIfNotIn(pointI, receivedData[counter++]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
// Construct from mesh
|
|
||||||
symmetryPlaneOptimisation::symmetryPlaneOptimisation(polyMeshGen& mesh)
|
|
||||||
:
|
|
||||||
mesh_(mesh)
|
|
||||||
{
|
|
||||||
detectSymmetryPlanes();
|
|
||||||
}
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
symmetryPlaneOptimisation::~symmetryPlaneOptimisation()
|
|
||||||
{}
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
void symmetryPlaneOptimisation::optimizeSymmetryPlanes()
|
|
||||||
{
|
|
||||||
pointFieldPMG& points = mesh_.points();
|
|
||||||
|
|
||||||
VRWGraph pointInPlane;
|
|
||||||
pointInPlanes(pointInPlane);
|
|
||||||
|
|
||||||
forAll(pointInPlane, pointI)
|
|
||||||
{
|
|
||||||
const label nPlanes = pointInPlane.sizeOfRow(pointI);
|
|
||||||
|
|
||||||
if( nPlanes > 3 )
|
|
||||||
{
|
|
||||||
WarningIn
|
|
||||||
(
|
|
||||||
"void symmetryPlaneOptimisation::optimizeSymmetryPlanes()"
|
|
||||||
) << "Point " << pointI << " is in more than three symmetry"
|
|
||||||
<< " planes. Cannot move it" << endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
point& p = points[pointI];
|
|
||||||
vector disp(vector::zero);
|
|
||||||
for(label plI=0;plI<nPlanes;++plI)
|
|
||||||
{
|
|
||||||
//- point is in a plane
|
|
||||||
std::map<label, plane>::const_iterator it =
|
|
||||||
symmetryPlanes_.find(pointInPlane(pointI, 0));
|
|
||||||
|
|
||||||
const point newP = it->second.nearestPoint(points[pointI]);
|
|
||||||
disp += newP - p;
|
|
||||||
}
|
|
||||||
|
|
||||||
p += disp;
|
|
||||||
}
|
|
||||||
|
|
||||||
labelHashSet badFaces;
|
|
||||||
polyMeshGenChecks::checkFacePyramids(mesh_, false, VSMALL, &badFaces);
|
|
||||||
|
|
||||||
if( badFaces.size() )
|
|
||||||
{
|
|
||||||
WarningIn
|
|
||||||
(
|
|
||||||
"void symmetryPlaneOptimisation::optimizeSymmetryPlanes()"
|
|
||||||
) << "Bad quality or inverted faces found in the mesh" << endl;
|
|
||||||
|
|
||||||
const label badFacesId = mesh_.addFaceSubset("invalidFaces");
|
|
||||||
forAllConstIter(labelHashSet, badFaces, it)
|
|
||||||
mesh_.addFaceToSubset(badFacesId, it.key());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
} // End namespace Foam
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
|
|
@ -1,99 +0,0 @@
|
||||||
/*---------------------------------------------------------------------------*\
|
|
||||||
========= |
|
|
||||||
\\ / F ield | cfMesh: A library for mesh generation
|
|
||||||
\\ / O peration |
|
|
||||||
\\ / A nd | Author: Franjo Juretic (franjo.juretic@c-fields.com)
|
|
||||||
\\/ M anipulation | Copyright (C) Creative Fields, Ltd.
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
License
|
|
||||||
This file is part of cfMesh.
|
|
||||||
|
|
||||||
cfMesh 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.
|
|
||||||
|
|
||||||
cfMesh 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 cfMesh. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
Class
|
|
||||||
symmetryPlaneOptimisation
|
|
||||||
|
|
||||||
Description
|
|
||||||
Smoothing of symmetry planes in the mesh such that all points
|
|
||||||
are in the plane.
|
|
||||||
|
|
||||||
SourceFiles
|
|
||||||
symmetryPlaneOptimisation.C
|
|
||||||
|
|
||||||
\*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
#ifndef symmetryPlaneOptimisation_H
|
|
||||||
#define symmetryPlaneOptimisation_H
|
|
||||||
|
|
||||||
#include "DynList.H"
|
|
||||||
#include "polyMeshGenModifier.H"
|
|
||||||
#include "boundBox.H"
|
|
||||||
#include "labelLongList.H"
|
|
||||||
#include "boolList.H"
|
|
||||||
#include "plane.H"
|
|
||||||
|
|
||||||
#include <map>
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
namespace Foam
|
|
||||||
{
|
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*\
|
|
||||||
Class symmetryPlaneOptimisation Declaration
|
|
||||||
\*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
class symmetryPlaneOptimisation
|
|
||||||
{
|
|
||||||
// Private data
|
|
||||||
//- reference to the mesh
|
|
||||||
polyMeshGen& mesh_;
|
|
||||||
|
|
||||||
//- symmetry planes in the mesh
|
|
||||||
std::map<label, plane> symmetryPlanes_;
|
|
||||||
|
|
||||||
// Private member functions
|
|
||||||
//- detect symmetry planes
|
|
||||||
void detectSymmetryPlanes();
|
|
||||||
|
|
||||||
//- point-planes addressing
|
|
||||||
void pointInPlanes(VRWGraph&) const;
|
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
// Constructors
|
|
||||||
|
|
||||||
//- Construct from mesh
|
|
||||||
symmetryPlaneOptimisation(polyMeshGen& mesh);
|
|
||||||
|
|
||||||
|
|
||||||
// Destructor
|
|
||||||
|
|
||||||
~symmetryPlaneOptimisation();
|
|
||||||
|
|
||||||
// Member Functions
|
|
||||||
//- move vertices to the symmetry planes
|
|
||||||
void optimizeSymmetryPlanes();
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
} // End namespace Foam
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
|
|
@ -1,171 +0,0 @@
|
||||||
/*---------------------------------------------------------------------------*\
|
|
||||||
========= |
|
|
||||||
\\ / F ield | cfMesh: A library for mesh generation
|
|
||||||
\\ / O peration |
|
|
||||||
\\ / A nd | Author: Franjo Juretic (franjo.juretic@c-fields.com)
|
|
||||||
\\/ M anipulation | Copyright (C) Creative Fields, Ltd.
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
License
|
|
||||||
This file is part of cfMesh.
|
|
||||||
|
|
||||||
cfMesh 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.
|
|
||||||
|
|
||||||
cfMesh 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 cfMesh. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
Description
|
|
||||||
|
|
||||||
\*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
#include "triSurface2DCheck.H"
|
|
||||||
#include "triSurfModifier.H"
|
|
||||||
#include "boundBox.H"
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
namespace Foam
|
|
||||||
{
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
void triSurface2DCheck::createCovarianceMatrix()
|
|
||||||
{
|
|
||||||
const vectorField& fNormals = surf_.facetNormals();
|
|
||||||
|
|
||||||
//- find the normal vector of the best-fitting plane
|
|
||||||
covarianceMatrix_ = symmTensor::zero;
|
|
||||||
|
|
||||||
forAll(fNormals, tI)
|
|
||||||
{
|
|
||||||
vector fn = fNormals[tI];
|
|
||||||
fn /= (mag(fn) + VSMALL);
|
|
||||||
|
|
||||||
covarianceMatrix_ += symm(fn * fn);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
triSurface2DCheck::triSurface2DCheck(const triSurf& surface)
|
|
||||||
:
|
|
||||||
surf_(surface),
|
|
||||||
covarianceMatrix_(symmTensor::zero)
|
|
||||||
{
|
|
||||||
createCovarianceMatrix();
|
|
||||||
}
|
|
||||||
|
|
||||||
triSurface2DCheck::~triSurface2DCheck()
|
|
||||||
{}
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
bool triSurface2DCheck::is2DSurface() const
|
|
||||||
{
|
|
||||||
const pointField& points = surf_.points();
|
|
||||||
|
|
||||||
const vector eigenVal = eigenValues(covarianceMatrix_);
|
|
||||||
|
|
||||||
//- the smallest eigenvalue must be zero in case all face normals
|
|
||||||
//- lie in a plane
|
|
||||||
if( mag(eigenVal[0]) > SMALL )
|
|
||||||
{
|
|
||||||
WarningIn("bool triSurface2DCheck::is2DSurface() const")
|
|
||||||
<< "Surface mesh is in 3D space!"
|
|
||||||
<< " This may result in an invalid mesh!" << endl;
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
//- calculate the plane normal as a cross prduct of the two
|
|
||||||
//- eigenVectors spanning the plane
|
|
||||||
const vector n
|
|
||||||
(
|
|
||||||
eigenVector(covarianceMatrix_, eigenVal[1]) ^
|
|
||||||
eigenVector(covarianceMatrix_, eigenVal[2])
|
|
||||||
);
|
|
||||||
|
|
||||||
//- check if the plane is in the x-y plane of the coordinate system
|
|
||||||
if( mag(n.x()) > SMALL || mag(n.y()) > SMALL )
|
|
||||||
{
|
|
||||||
//- this could be a 2D surface, but it is not in the x-y plane
|
|
||||||
WarningIn("bool triSurface2DCheck::is2DSurface() const")
|
|
||||||
<< "The surface mesh IS NOT IN THE X-Y PLANE!!!!"
|
|
||||||
<< " This will result in a mesh without any cells" << endl;
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
//- check if the points in the 2D surface have uniform z coordinates
|
|
||||||
boundBox bb(points);
|
|
||||||
forAll(points, pI)
|
|
||||||
{
|
|
||||||
const point& p = points[pI];
|
|
||||||
|
|
||||||
if
|
|
||||||
(
|
|
||||||
mag(p.z() - bb.max().z()) > SMALL &&
|
|
||||||
mag(p.z() - bb.min().z()) > SMALL
|
|
||||||
)
|
|
||||||
{
|
|
||||||
WarningIn("bool triSurface2DCheck::is2DSurface() const")
|
|
||||||
<< "z coordinates of the 2D surface are not uniform" << endl;
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Info << "Detected a 2D surface in the x-y plane" << endl;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void triSurface2DCheck::createSubsets()
|
|
||||||
{
|
|
||||||
const pointField& points = surf_.points();
|
|
||||||
const vectorField& fNormals = surf_.facetNormals();
|
|
||||||
|
|
||||||
//- create a subset containing faces having non-zero z coordinate
|
|
||||||
//- of the normals
|
|
||||||
triSurf& surf = const_cast<triSurf&>(surf_);
|
|
||||||
const label badFacetsId = surf.addFacetSubset("badFacets");
|
|
||||||
forAll(fNormals, triI)
|
|
||||||
{
|
|
||||||
vector fn = fNormals[triI];
|
|
||||||
fn /= (mag(fn) + VSMALL);
|
|
||||||
|
|
||||||
if( mag(fn.z()) > SMALL )
|
|
||||||
surf.addFacetToSubset(badFacetsId, triI);
|
|
||||||
}
|
|
||||||
|
|
||||||
//- create a subset containing points which are not
|
|
||||||
//- in z-min and z-max planes
|
|
||||||
const label badPointsId = surf.addPointSubset("badPointsId");
|
|
||||||
boundBox bb(points);
|
|
||||||
forAll(points, pI)
|
|
||||||
{
|
|
||||||
const point& p = points[pI];
|
|
||||||
|
|
||||||
if
|
|
||||||
(
|
|
||||||
mag(p.z() - bb.max().z()) > SMALL &&
|
|
||||||
mag(p.z() - bb.min().z()) > SMALL
|
|
||||||
)
|
|
||||||
{
|
|
||||||
surf.addPointToSubset(badPointsId, pI);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
} // End namespace Foam
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
|
|
@ -1,98 +0,0 @@
|
||||||
/*---------------------------------------------------------------------------*\
|
|
||||||
========= |
|
|
||||||
\\ / F ield | cfMesh: A library for mesh generation
|
|
||||||
\\ / O peration |
|
|
||||||
\\ / A nd | Author: Franjo Juretic (franjo.juretic@c-fields.com)
|
|
||||||
\\/ M anipulation | Copyright (C) Creative Fields, Ltd.
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
License
|
|
||||||
This file is part of cfMesh.
|
|
||||||
|
|
||||||
cfMesh 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.
|
|
||||||
|
|
||||||
cfMesh 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 cfMesh. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
Class
|
|
||||||
triSurface2DCheck
|
|
||||||
|
|
||||||
Description
|
|
||||||
|
|
||||||
|
|
||||||
SourceFiles
|
|
||||||
triSurface2DCheck.C
|
|
||||||
|
|
||||||
\*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
#ifndef triSurface2DCheck_H
|
|
||||||
#define triSurface2DCheck_H
|
|
||||||
|
|
||||||
#include "triSurf.H"
|
|
||||||
#include "symmTensor.H"
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
namespace Foam
|
|
||||||
{
|
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*\
|
|
||||||
Class triSurface2DCheck Declaration
|
|
||||||
\*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
class triSurface2DCheck
|
|
||||||
{
|
|
||||||
// Private data
|
|
||||||
//- reference to triSurf
|
|
||||||
const triSurf& surf_;
|
|
||||||
|
|
||||||
//- covariance matrix
|
|
||||||
symmTensor covarianceMatrix_;
|
|
||||||
|
|
||||||
// Private member functions
|
|
||||||
//- create covariance matrix
|
|
||||||
void createCovarianceMatrix();
|
|
||||||
|
|
||||||
//- Disallow default bitwise copy construct
|
|
||||||
triSurface2DCheck(const triSurface2DCheck&);
|
|
||||||
|
|
||||||
//- Disallow default bitwise assignment
|
|
||||||
void operator=(const triSurface2DCheck&);
|
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
// Constructors
|
|
||||||
|
|
||||||
//- Construct from octree
|
|
||||||
triSurface2DCheck(const triSurf& surface);
|
|
||||||
|
|
||||||
// Destructor
|
|
||||||
|
|
||||||
~triSurface2DCheck();
|
|
||||||
|
|
||||||
|
|
||||||
// Member Functions
|
|
||||||
|
|
||||||
//- checks if the surface is a 2D triangulation
|
|
||||||
bool is2DSurface() const;
|
|
||||||
|
|
||||||
//- create subset containing invalid facets
|
|
||||||
void createSubsets();
|
|
||||||
};
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
} // End namespace Foam
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
|
|
@ -1,56 +0,0 @@
|
||||||
/*---------------------------------------------------------------------------*\
|
|
||||||
========= |
|
|
||||||
\\ / F ield | cfMesh: A library for mesh generation
|
|
||||||
\\ / O peration |
|
|
||||||
\\ / A nd | Author: Franjo Juretic (franjo.juretic@c-fields.com)
|
|
||||||
\\/ M anipulation | Copyright (C) Creative Fields, Ltd.
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
License
|
|
||||||
This file is part of cfMesh.
|
|
||||||
|
|
||||||
cfMesh 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.
|
|
||||||
|
|
||||||
cfMesh 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 cfMesh. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
Description
|
|
||||||
|
|
||||||
\*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
#include "triSurfaceCleanupDuplicateTriangles.H"
|
|
||||||
#include "triSurf.H"
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
namespace Foam
|
|
||||||
{
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
triSurfaceCleanupDuplicateTriangles::triSurfaceCleanupDuplicateTriangles
|
|
||||||
(
|
|
||||||
triSurf& surf
|
|
||||||
)
|
|
||||||
:
|
|
||||||
surf_(surf),
|
|
||||||
newTriangleLabel_()
|
|
||||||
{
|
|
||||||
checkDuplicateTriangles();
|
|
||||||
}
|
|
||||||
|
|
||||||
triSurfaceCleanupDuplicateTriangles::~triSurfaceCleanupDuplicateTriangles()
|
|
||||||
{}
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
} // End namespace Foam
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
|
|
@ -1,98 +0,0 @@
|
||||||
/*---------------------------------------------------------------------------*\
|
|
||||||
========= |
|
|
||||||
\\ / F ield | cfMesh: A library for mesh generation
|
|
||||||
\\ / O peration |
|
|
||||||
\\ / A nd | Author: Franjo Juretic (franjo.juretic@c-fields.com)
|
|
||||||
\\/ M anipulation | Copyright (C) Creative Fields, Ltd.
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
License
|
|
||||||
This file is part of cfMesh.
|
|
||||||
|
|
||||||
cfMesh 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.
|
|
||||||
|
|
||||||
cfMesh 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 cfMesh. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
Class
|
|
||||||
triSurfaceCleanupDuplicates
|
|
||||||
|
|
||||||
Description
|
|
||||||
Removes duplicate triangles from the surface.
|
|
||||||
|
|
||||||
SourceFiles
|
|
||||||
triSurfaceCleanupDuplicateTriangles.C
|
|
||||||
triSurfaceCleanupDuplicateTrianglesFunctions.C
|
|
||||||
|
|
||||||
\*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
#ifndef triSurfaceCleanupDuplicateTriangles_H
|
|
||||||
#define triSurfaceCleanupDuplicateTriangles_H
|
|
||||||
|
|
||||||
#include "VRWGraph.H"
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
namespace Foam
|
|
||||||
{
|
|
||||||
|
|
||||||
// Forward declarations
|
|
||||||
class triSurf;
|
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*\
|
|
||||||
Class triSurfaceCleanupDuplicateTriangles Declaration
|
|
||||||
\*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
class triSurfaceCleanupDuplicateTriangles
|
|
||||||
{
|
|
||||||
// Private data
|
|
||||||
//- reference to triSurf
|
|
||||||
triSurf& surf_;
|
|
||||||
|
|
||||||
//- new triangle labels in case some of them is removed
|
|
||||||
labelLongList newTriangleLabel_;
|
|
||||||
|
|
||||||
// Private member functions
|
|
||||||
//- Check duplicate triangles
|
|
||||||
void checkDuplicateTriangles();
|
|
||||||
|
|
||||||
//- Disallow default bitwise copy construct
|
|
||||||
triSurfaceCleanupDuplicateTriangles
|
|
||||||
(
|
|
||||||
const triSurfaceCleanupDuplicateTriangles&
|
|
||||||
);
|
|
||||||
|
|
||||||
//- Disallow default bitwise assignment
|
|
||||||
void operator=(const triSurfaceCleanupDuplicateTriangles&);
|
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
// Constructors
|
|
||||||
|
|
||||||
//- Construct from triSurf
|
|
||||||
triSurfaceCleanupDuplicateTriangles(triSurf&);
|
|
||||||
|
|
||||||
// Destructor
|
|
||||||
|
|
||||||
~triSurfaceCleanupDuplicateTriangles();
|
|
||||||
|
|
||||||
|
|
||||||
// Member Functions
|
|
||||||
};
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
} // End namespace Foam
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
|
|
@ -1,100 +0,0 @@
|
||||||
/*---------------------------------------------------------------------------*\
|
|
||||||
========= |
|
|
||||||
\\ / F ield | cfMesh: A library for mesh generation
|
|
||||||
\\ / O peration |
|
|
||||||
\\ / A nd | Author: Franjo Juretic (franjo.juretic@c-fields.com)
|
|
||||||
\\/ M anipulation | Copyright (C) Creative Fields, Ltd.
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
License
|
|
||||||
This file is part of cfMesh.
|
|
||||||
|
|
||||||
cfMesh 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.
|
|
||||||
|
|
||||||
cfMesh 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 cfMesh. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
Description
|
|
||||||
|
|
||||||
\*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
#include "triSurfaceCleanupDuplicateTriangles.H"
|
|
||||||
#include "triSurfModifier.H"
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
namespace Foam
|
|
||||||
{
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
void triSurfaceCleanupDuplicateTriangles::checkDuplicateTriangles()
|
|
||||||
{
|
|
||||||
labelLongList newTriangleLabel(surf_.size(), -1);
|
|
||||||
|
|
||||||
const VRWGraph& pointTriangles = surf_.pointFacets();
|
|
||||||
|
|
||||||
//- check if there exist duplicate triangles
|
|
||||||
label counter(0);
|
|
||||||
|
|
||||||
forAll(surf_, triI)
|
|
||||||
{
|
|
||||||
if( newTriangleLabel[triI] != -1 )
|
|
||||||
continue;
|
|
||||||
|
|
||||||
newTriangleLabel[triI] = counter;
|
|
||||||
++counter;
|
|
||||||
|
|
||||||
const labelledTri& tri = surf_[triI];
|
|
||||||
|
|
||||||
forAll(pointTriangles[tri[0]], ptI)
|
|
||||||
{
|
|
||||||
const label triJ = pointTriangles(tri[0], ptI);
|
|
||||||
|
|
||||||
if( triJ <= triI )
|
|
||||||
continue;
|
|
||||||
|
|
||||||
const labelledTri& otherTri = surf_[triJ];
|
|
||||||
|
|
||||||
if( tri == otherTri )
|
|
||||||
newTriangleLabel[triJ] = newTriangleLabel[triI];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Info << "Found " << (newTriangleLabel.size()-counter)
|
|
||||||
<< " duplicate triangles" << endl;
|
|
||||||
|
|
||||||
//- return if there exist no duplicate triangles
|
|
||||||
if( counter == newTriangleLabel.size() )
|
|
||||||
return;
|
|
||||||
|
|
||||||
Info << "Current number of triangles" << surf_.size() << endl;
|
|
||||||
Info << "New number of triangles " << counter << endl;
|
|
||||||
|
|
||||||
//- create new list of triangles and store it in the surface mesh
|
|
||||||
LongList<labelledTri> newTriangles(counter);
|
|
||||||
|
|
||||||
forAll(newTriangleLabel, triI)
|
|
||||||
{
|
|
||||||
newTriangles[newTriangleLabel[triI]] = surf_[triI];
|
|
||||||
}
|
|
||||||
|
|
||||||
triSurfModifier(surf_).facetsAccess().transfer(newTriangles);
|
|
||||||
surf_.updateFacetsSubsets(newTriangleLabel);
|
|
||||||
|
|
||||||
surf_.clearAddressing();
|
|
||||||
surf_.clearGeometry();
|
|
||||||
}
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
} // End namespace Foam
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
|
|
@ -1,240 +0,0 @@
|
||||||
/*---------------------------------------------------------------------------*\
|
|
||||||
========= |
|
|
||||||
\\ / F ield | cfMesh: A library for mesh generation
|
|
||||||
\\ / O peration |
|
|
||||||
\\ / A nd | Author: Franjo Juretic (franjo.juretic@c-fields.com)
|
|
||||||
\\/ M anipulation | Copyright (C) Creative Fields, Ltd.
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
License
|
|
||||||
This file is part of cfMesh.
|
|
||||||
|
|
||||||
cfMesh 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.
|
|
||||||
|
|
||||||
cfMesh 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 cfMesh. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
Description
|
|
||||||
|
|
||||||
\*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
#include "triSurfaceImportSurfaceAsSubset.H"
|
|
||||||
#include "meshOctree.H"
|
|
||||||
#include "meshOctreeCreator.H"
|
|
||||||
#include "helperFunctions.H"
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
namespace Foam
|
|
||||||
{
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
void triSurfaceImportSurfaceAsSubset::createOctree
|
|
||||||
(
|
|
||||||
const triSurf& surf,
|
|
||||||
meshOctree& octree
|
|
||||||
)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
triSurfaceImportSurfaceAsSubset::triSurfaceImportSurfaceAsSubset(triSurf& surface)
|
|
||||||
:
|
|
||||||
surf_(surface),
|
|
||||||
octreePtr_(NULL)
|
|
||||||
{}
|
|
||||||
|
|
||||||
triSurfaceImportSurfaceAsSubset::~triSurfaceImportSurfaceAsSubset()
|
|
||||||
{
|
|
||||||
deleteDemandDrivenData(octreePtr_);
|
|
||||||
}
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
void triSurfaceImportSurfaceAsSubset::addSurfaceAsSubset
|
|
||||||
(
|
|
||||||
const triSurf& importSurf,
|
|
||||||
const word& subsetName,
|
|
||||||
const scalar angleTol
|
|
||||||
)
|
|
||||||
{
|
|
||||||
if( !octreePtr_ )
|
|
||||||
{
|
|
||||||
octreePtr_ = new meshOctree(surf_);
|
|
||||||
meshOctreeCreator(*octreePtr_).createOctreeWithRefinedBoundary
|
|
||||||
(
|
|
||||||
direction(20),
|
|
||||||
15
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
const pointField& points = surf_.points();
|
|
||||||
const vectorField& fNornals = surf_.facetNormals();
|
|
||||||
const vectorField& fCentres = surf_.facetCentres();
|
|
||||||
|
|
||||||
labelList nearestTriangle(importSurf.size(), -1);
|
|
||||||
|
|
||||||
//- check which triangles in the surface fit best to the centres of the
|
|
||||||
//- triangles in the import surface
|
|
||||||
const pointField& importSurfPoints = importSurf.points();
|
|
||||||
const vectorField& importFaceCentres = importSurf.facetCentres();
|
|
||||||
const vectorField& importFaceNormals = importSurf.facetNormals();
|
|
||||||
# ifdef USE_OMP
|
|
||||||
# pragma omp parallel for schedule(dynamic, 40)
|
|
||||||
# endif
|
|
||||||
forAll(nearestTriangle, triI)
|
|
||||||
{
|
|
||||||
point np;
|
|
||||||
scalar dSq;
|
|
||||||
label nt, patch;
|
|
||||||
|
|
||||||
octreePtr_->findNearestSurfacePoint
|
|
||||||
(
|
|
||||||
np,
|
|
||||||
dSq,
|
|
||||||
nt,
|
|
||||||
patch,
|
|
||||||
importFaceCentres[triI]
|
|
||||||
);
|
|
||||||
|
|
||||||
//- find the longest edge distance
|
|
||||||
scalar maxEdgeDSq(0.);
|
|
||||||
const labelledTri& tri = importSurf[triI];
|
|
||||||
forAll(tri, pI)
|
|
||||||
{
|
|
||||||
const point& s = importSurfPoints[tri[pI]];
|
|
||||||
const point& e = importSurfPoints[tri[(pI+1)%3]];
|
|
||||||
|
|
||||||
maxEdgeDSq = max(maxEdgeDSq, magSqr(e - s));
|
|
||||||
}
|
|
||||||
|
|
||||||
//- check if the triangle has been found
|
|
||||||
if( (nt < 0) || (dSq > 0.09 * maxEdgeDSq) )
|
|
||||||
{
|
|
||||||
Warning << "Could not find a matching triangle " << endl;
|
|
||||||
Warning << "It seems that your surface meshes do not overlap" << endl;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
vector nTri = importFaceNormals[triI];
|
|
||||||
const scalar magSqrTri = magSqr(nTri);
|
|
||||||
|
|
||||||
//- skip sliver triangles
|
|
||||||
if( magSqrTri < VSMALL )
|
|
||||||
continue;
|
|
||||||
|
|
||||||
vector normal = fNornals[nt];
|
|
||||||
const scalar dSqNormal = magSqr(normal);
|
|
||||||
|
|
||||||
//- skip sliver triangles
|
|
||||||
if( dSqNormal < VSMALL )
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if( ((nTri & normal) / (magSqrTri * dSqNormal)) > angleTol )
|
|
||||||
nearestTriangle[triI] = nt;
|
|
||||||
}
|
|
||||||
|
|
||||||
meshOctree otherSurfOctree(importSurf);
|
|
||||||
meshOctreeCreator(otherSurfOctree).createOctreeWithRefinedBoundary(20, 15);
|
|
||||||
|
|
||||||
//- search for nearest facets in the import surface
|
|
||||||
DynList<label> containedTriangles;
|
|
||||||
# ifdef USE_OMP
|
|
||||||
# pragma omp parallel for schedule(dynamic, 40) private(containedTriangles)
|
|
||||||
# endif
|
|
||||||
forAll(surf_, triI)
|
|
||||||
{
|
|
||||||
//- find the bounding box and the ize of the triangle
|
|
||||||
boundBox bb(fCentres[triI], fCentres[triI]);
|
|
||||||
|
|
||||||
scalar maxEdgeDSq(0.);
|
|
||||||
const labelledTri& tri = surf_[triI];
|
|
||||||
forAll(tri, pI)
|
|
||||||
{
|
|
||||||
//- bounding box of the surface triangle
|
|
||||||
bb.min() = min(bb.min(), points[tri[pI]]);
|
|
||||||
bb.max() = max(bb.max(), points[tri[pI]]);
|
|
||||||
|
|
||||||
const point& s = points[tri[pI]];
|
|
||||||
const point& e = points[tri[(pI+1)%3]];
|
|
||||||
|
|
||||||
maxEdgeDSq = max(maxEdgeDSq, magSqr(e - s));
|
|
||||||
}
|
|
||||||
|
|
||||||
//- find the nearest triangle in the surface which shall be imported
|
|
||||||
otherSurfOctree.findTrianglesInBox(bb, containedTriangles);
|
|
||||||
|
|
||||||
label nt(-1);
|
|
||||||
scalar dSq(VGREAT);
|
|
||||||
forAll(containedTriangles, ctI)
|
|
||||||
{
|
|
||||||
const point p =
|
|
||||||
help::nearestPointOnTheTriangle
|
|
||||||
(
|
|
||||||
containedTriangles[ctI],
|
|
||||||
importSurf,
|
|
||||||
fCentres[triI]
|
|
||||||
);
|
|
||||||
|
|
||||||
const scalar distSq = magSqr(p - fCentres[triI]);
|
|
||||||
|
|
||||||
if( distSq < dSq )
|
|
||||||
{
|
|
||||||
nt = containedTriangles[ctI];
|
|
||||||
dSq = distSq;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//- check if the triangle has been found
|
|
||||||
if( (nt < 0) || (dSq > 0.09 * maxEdgeDSq) )
|
|
||||||
continue;
|
|
||||||
|
|
||||||
//- skip firther checkes f it has found the same triangle
|
|
||||||
if( nearestTriangle[nt] == triI )
|
|
||||||
continue;
|
|
||||||
|
|
||||||
vector nTri = fNornals[triI];
|
|
||||||
const scalar magSqrTri = magSqr(nTri);
|
|
||||||
|
|
||||||
//- skip sliver triangles
|
|
||||||
if( magSqrTri < VSMALL )
|
|
||||||
continue;
|
|
||||||
|
|
||||||
vector normal = importFaceNormals[nt];
|
|
||||||
const scalar dSqNormal = magSqr(normal);
|
|
||||||
|
|
||||||
//- skip sliver triangles
|
|
||||||
if( dSqNormal < VSMALL )
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if( ((nTri & normal) / (magSqrTri * dSqNormal)) > angleTol )
|
|
||||||
nearestTriangle[nt] = triI;
|
|
||||||
}
|
|
||||||
|
|
||||||
//- create a facet subset in the surface mesh and add the facets into it
|
|
||||||
const label subsetId = surf_.addFacetSubset(subsetName);
|
|
||||||
|
|
||||||
forAll(nearestTriangle, triI)
|
|
||||||
{
|
|
||||||
if( nearestTriangle[triI] < 0 )
|
|
||||||
continue;
|
|
||||||
|
|
||||||
surf_.addFacetToSubset(subsetId, nearestTriangle[triI]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
} // End namespace Foam
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
|
|
@ -1,103 +0,0 @@
|
||||||
/*---------------------------------------------------------------------------*\
|
|
||||||
========= |
|
|
||||||
\\ / F ield | cfMesh: A library for mesh generation
|
|
||||||
\\ / O peration |
|
|
||||||
\\ / A nd | Author: Franjo Juretic (franjo.juretic@c-fields.com)
|
|
||||||
\\/ M anipulation | Copyright (C) Creative Fields, Ltd.
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
License
|
|
||||||
This file is part of cfMesh.
|
|
||||||
|
|
||||||
cfMesh 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.
|
|
||||||
|
|
||||||
cfMesh 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 cfMesh. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
Class
|
|
||||||
triSurfaceImportSurfaceAsSubset
|
|
||||||
|
|
||||||
Description
|
|
||||||
Creates a subset in the master surface consisting of facets which are
|
|
||||||
near the other surface
|
|
||||||
|
|
||||||
SourceFiles
|
|
||||||
triSurfaceImportSurfaceAsSubset.C
|
|
||||||
|
|
||||||
\*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
#ifndef triSurfaceImportSurfaceAsSubset_H
|
|
||||||
#define triSurfaceImportSurfaceAsSubset_H
|
|
||||||
|
|
||||||
#include "triSurf.H"
|
|
||||||
#include "boolList.H"
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
namespace Foam
|
|
||||||
{
|
|
||||||
|
|
||||||
class meshOctree;
|
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*\
|
|
||||||
Class triSurfaceImportSurfaceAsSubset Declaration
|
|
||||||
\*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
class triSurfaceImportSurfaceAsSubset
|
|
||||||
{
|
|
||||||
// Private data
|
|
||||||
//- reference to triSurf
|
|
||||||
triSurf& surf_;
|
|
||||||
|
|
||||||
//- pointer to meshOctree, needed for searching on the master surface
|
|
||||||
meshOctree* octreePtr_;
|
|
||||||
|
|
||||||
// Private member functions
|
|
||||||
void createOctree(const triSurf&, meshOctree&);
|
|
||||||
|
|
||||||
//- Disallow default bitwise copy construct
|
|
||||||
triSurfaceImportSurfaceAsSubset(const triSurfaceImportSurfaceAsSubset&);
|
|
||||||
|
|
||||||
//- Disallow default bitwise assignment
|
|
||||||
void operator=(const triSurfaceImportSurfaceAsSubset&);
|
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
// Constructors
|
|
||||||
|
|
||||||
//- Construct from triSurf
|
|
||||||
triSurfaceImportSurfaceAsSubset(triSurf& surface);
|
|
||||||
|
|
||||||
// Destructor
|
|
||||||
|
|
||||||
~triSurfaceImportSurfaceAsSubset();
|
|
||||||
|
|
||||||
|
|
||||||
// Member Functions
|
|
||||||
|
|
||||||
//- finds the nearest faces in the surface to the import surf
|
|
||||||
//- and creates a subset
|
|
||||||
void addSurfaceAsSubset
|
|
||||||
(
|
|
||||||
const triSurf& importSurf,
|
|
||||||
const word& subsetName,
|
|
||||||
const scalar angleTol = 5.*M_PI/180.
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
} // End namespace Foam
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
|
Reference in a new issue