mirror of
https://develop.openfoam.com/Development/openfoam.git
synced 2025-11-28 03:28:01 +00:00
STYLE: relocate nonCoupledBoundaryTree into meshSearcher
- use point::uniform in more places
This commit is contained in:
@ -6,6 +6,7 @@
|
|||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
Copyright (C) 2011-2015 OpenFOAM Foundation
|
Copyright (C) 2011-2015 OpenFOAM Foundation
|
||||||
|
Copyright (C) 2020 OpenCFD Ltd.
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
This file is part of OpenFOAM.
|
This file is part of OpenFOAM.
|
||||||
@ -68,8 +69,8 @@ int main(int argc, char *argv[])
|
|||||||
efem.points()
|
efem.points()
|
||||||
);
|
);
|
||||||
|
|
||||||
bb.min() -= point(ROOTVSMALL, ROOTVSMALL, ROOTVSMALL);
|
bb.min() -= point::uniform(ROOTVSMALL);
|
||||||
bb.max() += point(ROOTVSMALL, ROOTVSMALL, ROOTVSMALL);
|
bb.max() += point::uniform(ROOTVSMALL);
|
||||||
|
|
||||||
labelList allEdges(identity(efem.edges().size()));
|
labelList allEdges(identity(efem.edges().size()));
|
||||||
|
|
||||||
|
|||||||
@ -6,6 +6,7 @@
|
|||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
Copyright (C) 2012-2016 OpenFOAM Foundation
|
Copyright (C) 2012-2016 OpenFOAM Foundation
|
||||||
|
Copyright (C) 2020 OpenCFD Ltd.
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
This file is part of OpenFOAM.
|
This file is part of OpenFOAM.
|
||||||
@ -1983,8 +1984,8 @@ void Foam::conformalVoronoiMesh::buildEdgeLocationTree
|
|||||||
geometryToConformTo_.globalBounds().extend(rndGen_, 1e-4)
|
geometryToConformTo_.globalBounds().extend(rndGen_, 1e-4)
|
||||||
);
|
);
|
||||||
|
|
||||||
overallBb.min() -= Foam::point(ROOTVSMALL, ROOTVSMALL, ROOTVSMALL);
|
overallBb.min() -= Foam::point::uniform(ROOTVSMALL);
|
||||||
overallBb.max() += Foam::point(ROOTVSMALL, ROOTVSMALL, ROOTVSMALL);
|
overallBb.max() += Foam::point::uniform(ROOTVSMALL);
|
||||||
|
|
||||||
edgeLocationTreePtr_.reset
|
edgeLocationTreePtr_.reset
|
||||||
(
|
(
|
||||||
@ -2010,8 +2011,8 @@ void Foam::conformalVoronoiMesh::buildSurfacePtLocationTree
|
|||||||
geometryToConformTo_.globalBounds().extend(rndGen_, 1e-4)
|
geometryToConformTo_.globalBounds().extend(rndGen_, 1e-4)
|
||||||
);
|
);
|
||||||
|
|
||||||
overallBb.min() -= Foam::point(ROOTVSMALL, ROOTVSMALL, ROOTVSMALL);
|
overallBb.min() -= Foam::point::uniform(ROOTVSMALL);
|
||||||
overallBb.max() += Foam::point(ROOTVSMALL, ROOTVSMALL, ROOTVSMALL);
|
overallBb.max() += Foam::point::uniform(ROOTVSMALL);
|
||||||
|
|
||||||
surfacePtLocationTreePtr_.reset
|
surfacePtLocationTreePtr_.reset
|
||||||
(
|
(
|
||||||
|
|||||||
@ -6,6 +6,7 @@
|
|||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
Copyright (C) 2014-2017 OpenFOAM Foundation
|
Copyright (C) 2014-2017 OpenFOAM Foundation
|
||||||
|
Copyright (C) 2020 OpenCFD Ltd.
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
This file is part of OpenFOAM.
|
This file is part of OpenFOAM.
|
||||||
@ -180,8 +181,8 @@ void createBoundaryEdgeTrees
|
|||||||
treeBoundBox(UList<point>(surf.localPoints())).extend(rndGen, 1e-4)
|
treeBoundBox(UList<point>(surf.localPoints())).extend(rndGen, 1e-4)
|
||||||
);
|
);
|
||||||
|
|
||||||
bb.min() -= point(ROOTVSMALL, ROOTVSMALL, ROOTVSMALL);
|
bb.min() -= point::uniform(ROOTVSMALL);
|
||||||
bb.max() += point(ROOTVSMALL, ROOTVSMALL, ROOTVSMALL);
|
bb.max() += point::uniform(ROOTVSMALL);
|
||||||
|
|
||||||
bEdgeTrees.set
|
bEdgeTrees.set
|
||||||
(
|
(
|
||||||
|
|||||||
@ -6,6 +6,7 @@
|
|||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
Copyright (C) 2011-2016 OpenFOAM Foundation
|
Copyright (C) 2011-2016 OpenFOAM Foundation
|
||||||
|
Copyright (C) 2020 OpenCFD Ltd.
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
This file is part of OpenFOAM.
|
This file is part of OpenFOAM.
|
||||||
@ -48,12 +49,17 @@ bool Foam::matchPoints
|
|||||||
|
|
||||||
point compareOrigin = origin;
|
point compareOrigin = origin;
|
||||||
|
|
||||||
if (origin == point(VGREAT, VGREAT, VGREAT))
|
if (origin == point::max)
|
||||||
{
|
{
|
||||||
if (pts1.size())
|
if (pts1.size())
|
||||||
{
|
{
|
||||||
compareOrigin = sum(pts1)/pts1.size();
|
compareOrigin = sum(pts1)/pts1.size();
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Unusable, but avoid comparison with VGREAT!
|
||||||
|
compareOrigin = point::zero;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SortableList<scalar> pts0MagSqr(magSqr(pts0 - compareOrigin));
|
SortableList<scalar> pts0MagSqr(magSqr(pts0 - compareOrigin));
|
||||||
@ -160,12 +166,17 @@ bool Foam::matchPoints
|
|||||||
|
|
||||||
point compareOrigin = origin;
|
point compareOrigin = origin;
|
||||||
|
|
||||||
if (origin == point(VGREAT, VGREAT, VGREAT))
|
if (origin == point::max)
|
||||||
{
|
{
|
||||||
if (pts1.size())
|
if (pts1.size())
|
||||||
{
|
{
|
||||||
compareOrigin = sum(pts1)/pts1.size();
|
compareOrigin = sum(pts1)/pts1.size();
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Unusable, but avoid comparison with VGREAT!
|
||||||
|
compareOrigin = point::zero;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SortableList<scalar> pts0MagSqr(magSqr(pts0 - compareOrigin));
|
SortableList<scalar> pts0MagSqr(magSqr(pts0 - compareOrigin));
|
||||||
|
|||||||
@ -6,6 +6,7 @@
|
|||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
Copyright (C) 2011-2012 OpenFOAM Foundation
|
Copyright (C) 2011-2012 OpenFOAM Foundation
|
||||||
|
Copyright (C) 2020 OpenCFD Ltd.
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
This file is part of OpenFOAM.
|
This file is part of OpenFOAM.
|
||||||
@ -58,7 +59,7 @@ bool matchPoints
|
|||||||
const UList<scalar>& matchDistance,
|
const UList<scalar>& matchDistance,
|
||||||
const bool verbose,
|
const bool verbose,
|
||||||
labelList& from0To1,
|
labelList& from0To1,
|
||||||
const point& origin = point::zero
|
const point& origin = point::zero //!< point::max = use average origin
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
@ -75,7 +76,7 @@ bool matchPoints
|
|||||||
const UList<scalar>& matchDistance,
|
const UList<scalar>& matchDistance,
|
||||||
const bool verbose,
|
const bool verbose,
|
||||||
labelList& from0To1,
|
labelList& from0To1,
|
||||||
const point& origin = point::zero
|
const point& origin = point::zero //!< point::max = use average origin
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -6,7 +6,7 @@
|
|||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
Copyright (C) 2011-2017 OpenFOAM Foundation
|
Copyright (C) 2011-2017 OpenFOAM Foundation
|
||||||
Copyright (C) 2016-2019 OpenCFD Ltd.
|
Copyright (C) 2016-2020 OpenCFD Ltd.
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
This file is part of OpenFOAM.
|
This file is part of OpenFOAM.
|
||||||
@ -901,8 +901,8 @@ Foam::polyMesh::cellTree() const
|
|||||||
Random rndGen(261782);
|
Random rndGen(261782);
|
||||||
|
|
||||||
overallBb = overallBb.extend(rndGen, 1e-4);
|
overallBb = overallBb.extend(rndGen, 1e-4);
|
||||||
overallBb.min() -= point(ROOTVSMALL, ROOTVSMALL, ROOTVSMALL);
|
overallBb.min() -= point::uniform(ROOTVSMALL);
|
||||||
overallBb.max() += point(ROOTVSMALL, ROOTVSMALL, ROOTVSMALL);
|
overallBb.max() += point::uniform(ROOTVSMALL);
|
||||||
|
|
||||||
cellTreePtr_.reset
|
cellTreePtr_.reset
|
||||||
(
|
(
|
||||||
|
|||||||
@ -6,6 +6,7 @@
|
|||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
Copyright (C) 2011-2015 OpenFOAM Foundation
|
Copyright (C) 2011-2015 OpenFOAM Foundation
|
||||||
|
Copyright (C) 2020 OpenCFD Ltd.
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
This file is part of OpenFOAM.
|
This file is part of OpenFOAM.
|
||||||
@ -297,8 +298,8 @@ void Foam::refinementFeatures::buildTrees(const label featI)
|
|||||||
// Slightly extended bb. Slightly off-centred just so on symmetric
|
// Slightly extended bb. Slightly off-centred just so on symmetric
|
||||||
// geometry there are less face/edge aligned items.
|
// geometry there are less face/edge aligned items.
|
||||||
bb = bb.extend(rndGen, 1e-4);
|
bb = bb.extend(rndGen, 1e-4);
|
||||||
bb.min() -= point(ROOTVSMALL, ROOTVSMALL, ROOTVSMALL);
|
bb.min() -= point::uniform(ROOTVSMALL);
|
||||||
bb.max() += point(ROOTVSMALL, ROOTVSMALL, ROOTVSMALL);
|
bb.max() += point::uniform(ROOTVSMALL);
|
||||||
|
|
||||||
edgeTrees_.set
|
edgeTrees_.set
|
||||||
(
|
(
|
||||||
@ -438,8 +439,8 @@ Foam::refinementFeatures::regionEdgeTrees() const
|
|||||||
// Slightly extended bb. Slightly off-centred just so on symmetric
|
// Slightly extended bb. Slightly off-centred just so on symmetric
|
||||||
// geometry there are less face/edge aligned items.
|
// geometry there are less face/edge aligned items.
|
||||||
bb = bb.extend(rndGen, 1e-4);
|
bb = bb.extend(rndGen, 1e-4);
|
||||||
bb.min() -= point(ROOTVSMALL, ROOTVSMALL, ROOTVSMALL);
|
bb.min() -= point::uniform(ROOTVSMALL);
|
||||||
bb.max() += point(ROOTVSMALL, ROOTVSMALL, ROOTVSMALL);
|
bb.max() += point::uniform(ROOTVSMALL);
|
||||||
|
|
||||||
trees.set
|
trees.set
|
||||||
(
|
(
|
||||||
|
|||||||
@ -6,7 +6,7 @@
|
|||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
Copyright (C) 2011-2015 OpenFOAM Foundation
|
Copyright (C) 2011-2015 OpenFOAM Foundation
|
||||||
Copyright (C) 2015-2019 OpenCFD Ltd.
|
Copyright (C) 2015-2020 OpenCFD Ltd.
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
This file is part of OpenFOAM.
|
This file is part of OpenFOAM.
|
||||||
@ -3174,8 +3174,8 @@ void Foam::snappySnapDriver::reverseAttractMeshPoints
|
|||||||
// Slightly extended bb. Slightly off-centred just so on symmetric
|
// Slightly extended bb. Slightly off-centred just so on symmetric
|
||||||
// geometry there are less face/edge aligned items.
|
// geometry there are less face/edge aligned items.
|
||||||
bb = bb.extend(rndGen, 1e-4);
|
bb = bb.extend(rndGen, 1e-4);
|
||||||
bb.min() -= point(ROOTVSMALL, ROOTVSMALL, ROOTVSMALL);
|
bb.min() -= point::uniform(ROOTVSMALL);
|
||||||
bb.max() += point(ROOTVSMALL, ROOTVSMALL, ROOTVSMALL);
|
bb.max() += point::uniform(ROOTVSMALL);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Collect candidate points for attraction
|
// Collect candidate points for attraction
|
||||||
|
|||||||
@ -6,7 +6,7 @@
|
|||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
Copyright (C) 2011-2017 OpenFOAM Foundation
|
Copyright (C) 2011-2017 OpenFOAM Foundation
|
||||||
Copyright (C) 2015-2019 OpenCFD Ltd.
|
Copyright (C) 2015-2020 OpenCFD Ltd.
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
This file is part of OpenFOAM.
|
This file is part of OpenFOAM.
|
||||||
@ -848,8 +848,8 @@ Foam::extendedEdgeMesh::pointTree() const
|
|||||||
treeBoundBox(points()).extend(rndGen, 1e-4)
|
treeBoundBox(points()).extend(rndGen, 1e-4)
|
||||||
);
|
);
|
||||||
|
|
||||||
bb.min() -= point(ROOTVSMALL, ROOTVSMALL, ROOTVSMALL);
|
bb.min() -= point::uniform(ROOTVSMALL);
|
||||||
bb.max() += point(ROOTVSMALL, ROOTVSMALL, ROOTVSMALL);
|
bb.max() += point::uniform(ROOTVSMALL);
|
||||||
|
|
||||||
const labelList featurePointLabels = identity(nonFeatureStart_);
|
const labelList featurePointLabels = identity(nonFeatureStart_);
|
||||||
|
|
||||||
@ -888,8 +888,8 @@ Foam::extendedEdgeMesh::edgeTree() const
|
|||||||
treeBoundBox(points()).extend(rndGen, 1e-4)
|
treeBoundBox(points()).extend(rndGen, 1e-4)
|
||||||
);
|
);
|
||||||
|
|
||||||
bb.min() -= point(ROOTVSMALL, ROOTVSMALL, ROOTVSMALL);
|
bb.min() -= point::uniform(ROOTVSMALL);
|
||||||
bb.max() += point(ROOTVSMALL, ROOTVSMALL, ROOTVSMALL);
|
bb.max() += point::uniform(ROOTVSMALL);
|
||||||
|
|
||||||
labelList allEdges(identity(edges().size()));
|
labelList allEdges(identity(edges().size()));
|
||||||
|
|
||||||
@ -932,8 +932,8 @@ Foam::extendedEdgeMesh::edgeTreesByType() const
|
|||||||
treeBoundBox(points()).extend(rndGen, 1e-4)
|
treeBoundBox(points()).extend(rndGen, 1e-4)
|
||||||
);
|
);
|
||||||
|
|
||||||
bb.min() -= point(ROOTVSMALL, ROOTVSMALL, ROOTVSMALL);
|
bb.min() -= point::uniform(ROOTVSMALL);
|
||||||
bb.max() += point(ROOTVSMALL, ROOTVSMALL, ROOTVSMALL);
|
bb.max() += point::uniform(ROOTVSMALL);
|
||||||
|
|
||||||
labelListList sliceEdges(nEdgeTypes);
|
labelListList sliceEdges(nEdgeTypes);
|
||||||
|
|
||||||
|
|||||||
@ -294,8 +294,8 @@ void Foam::mappedPatchBase::findSamples
|
|||||||
1e-4
|
1e-4
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
patchBb.min() -= point(ROOTVSMALL, ROOTVSMALL, ROOTVSMALL);
|
patchBb.min() -= point::uniform(ROOTVSMALL);
|
||||||
patchBb.max() += point(ROOTVSMALL, ROOTVSMALL, ROOTVSMALL);
|
patchBb.max() += point::uniform(ROOTVSMALL);
|
||||||
|
|
||||||
indexedOctree<treeDataFace> boundaryTree
|
indexedOctree<treeDataFace> boundaryTree
|
||||||
(
|
(
|
||||||
@ -366,8 +366,8 @@ void Foam::mappedPatchBase::findSamples
|
|||||||
1e-4
|
1e-4
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
patchBb.min() -= point(ROOTVSMALL, ROOTVSMALL, ROOTVSMALL);
|
patchBb.min() -= point::uniform(ROOTVSMALL);
|
||||||
patchBb.max() += point(ROOTVSMALL, ROOTVSMALL, ROOTVSMALL);
|
patchBb.max() += point::uniform(ROOTVSMALL);
|
||||||
|
|
||||||
indexedOctree<treeDataPoint> boundaryTree
|
indexedOctree<treeDataPoint> boundaryTree
|
||||||
(
|
(
|
||||||
|
|||||||
@ -6,7 +6,7 @@
|
|||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
Copyright (C) 2011-2018 OpenFOAM Foundation
|
Copyright (C) 2011-2018 OpenFOAM Foundation
|
||||||
Copyright (C) 2015-2019 OpenCFD Ltd.
|
Copyright (C) 2015-2020 OpenCFD Ltd.
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
This file is part of OpenFOAM.
|
This file is part of OpenFOAM.
|
||||||
@ -603,30 +603,33 @@ Foam::meshSearch::~meshSearch()
|
|||||||
|
|
||||||
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
const Foam::treeBoundBox& Foam::meshSearch::dataBoundBox() const
|
||||||
|
{
|
||||||
|
if (!overallBbPtr_.valid())
|
||||||
|
{
|
||||||
|
Random rndGen(261782);
|
||||||
|
overallBbPtr_.reset
|
||||||
|
(
|
||||||
|
new treeBoundBox(mesh_.points())
|
||||||
|
);
|
||||||
|
|
||||||
|
treeBoundBox& overallBb = overallBbPtr_();
|
||||||
|
|
||||||
|
// Extend slightly and make 3D
|
||||||
|
overallBb = overallBb.extend(rndGen, 1e-4);
|
||||||
|
overallBb.min() -= point::uniform(ROOTVSMALL);
|
||||||
|
overallBb.max() += point::uniform(ROOTVSMALL);
|
||||||
|
}
|
||||||
|
|
||||||
|
return *overallBbPtr_;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
const Foam::indexedOctree<Foam::treeDataFace>&
|
const Foam::indexedOctree<Foam::treeDataFace>&
|
||||||
Foam::meshSearch::boundaryTree() const
|
Foam::meshSearch::boundaryTree() const
|
||||||
{
|
{
|
||||||
if (!boundaryTreePtr_.valid())
|
if (!boundaryTreePtr_.valid())
|
||||||
{
|
{
|
||||||
//
|
|
||||||
// Construct tree
|
|
||||||
//
|
|
||||||
|
|
||||||
if (!overallBbPtr_.valid())
|
|
||||||
{
|
|
||||||
Random rndGen(261782);
|
|
||||||
overallBbPtr_.reset
|
|
||||||
(
|
|
||||||
new treeBoundBox(mesh_.points())
|
|
||||||
);
|
|
||||||
|
|
||||||
treeBoundBox& overallBb = overallBbPtr_();
|
|
||||||
// Extend slightly and make 3D
|
|
||||||
overallBb = overallBb.extend(rndGen, 1e-4);
|
|
||||||
overallBb.min() -= point(ROOTVSMALL, ROOTVSMALL, ROOTVSMALL);
|
|
||||||
overallBb.max() += point(ROOTVSMALL, ROOTVSMALL, ROOTVSMALL);
|
|
||||||
}
|
|
||||||
|
|
||||||
// All boundary faces (not just walls)
|
// All boundary faces (not just walls)
|
||||||
labelList bndFaces
|
labelList bndFaces
|
||||||
(
|
(
|
||||||
@ -643,7 +646,7 @@ Foam::meshSearch::boundaryTree() const
|
|||||||
mesh_,
|
mesh_,
|
||||||
bndFaces // boundary faces only
|
bndFaces // boundary faces only
|
||||||
),
|
),
|
||||||
overallBbPtr_(), // overall search domain
|
dataBoundBox(), // overall search domain
|
||||||
8, // maxLevel
|
8, // maxLevel
|
||||||
10, // leafsize
|
10, // leafsize
|
||||||
3.0 // duplicity
|
3.0 // duplicity
|
||||||
@ -655,30 +658,57 @@ Foam::meshSearch::boundaryTree() const
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
const Foam::indexedOctree<Foam::treeDataFace>&
|
||||||
|
Foam::meshSearch::nonCoupledBoundaryTree() const
|
||||||
|
{
|
||||||
|
if (!nonCoupledBoundaryTreePtr_.valid())
|
||||||
|
{
|
||||||
|
// All non-coupled boundary faces (not just walls)
|
||||||
|
const polyBoundaryMesh& patches = mesh_.boundaryMesh();
|
||||||
|
|
||||||
|
labelList bndFaces(mesh_.nBoundaryFaces());
|
||||||
|
|
||||||
|
label bndi = 0;
|
||||||
|
for (const polyPatch& pp : patches)
|
||||||
|
{
|
||||||
|
if (!pp.coupled())
|
||||||
|
{
|
||||||
|
forAll(pp, i)
|
||||||
|
{
|
||||||
|
bndFaces[bndi++] = pp.start()+i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
bndFaces.setSize(bndi);
|
||||||
|
|
||||||
|
nonCoupledBoundaryTreePtr_.reset
|
||||||
|
(
|
||||||
|
new indexedOctree<treeDataFace>
|
||||||
|
(
|
||||||
|
treeDataFace // all information needed to search faces
|
||||||
|
(
|
||||||
|
false, // do not cache bb
|
||||||
|
mesh_,
|
||||||
|
bndFaces // boundary faces only
|
||||||
|
),
|
||||||
|
dataBoundBox(), // overall search domain
|
||||||
|
8, // maxLevel
|
||||||
|
10, // leafsize
|
||||||
|
3.0 // duplicity
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return *nonCoupledBoundaryTreePtr_;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
const Foam::indexedOctree<Foam::treeDataCell>&
|
const Foam::indexedOctree<Foam::treeDataCell>&
|
||||||
Foam::meshSearch::cellTree() const
|
Foam::meshSearch::cellTree() const
|
||||||
{
|
{
|
||||||
if (!cellTreePtr_.valid())
|
if (!cellTreePtr_.valid())
|
||||||
{
|
{
|
||||||
//
|
|
||||||
// Construct tree
|
|
||||||
//
|
|
||||||
|
|
||||||
if (!overallBbPtr_.valid())
|
|
||||||
{
|
|
||||||
Random rndGen(261782);
|
|
||||||
overallBbPtr_.reset
|
|
||||||
(
|
|
||||||
new treeBoundBox(mesh_.points())
|
|
||||||
);
|
|
||||||
|
|
||||||
treeBoundBox& overallBb = overallBbPtr_();
|
|
||||||
// Extend slightly and make 3D
|
|
||||||
overallBb = overallBb.extend(rndGen, 1e-4);
|
|
||||||
overallBb.min() -= point(ROOTVSMALL, ROOTVSMALL, ROOTVSMALL);
|
|
||||||
overallBb.max() += point(ROOTVSMALL, ROOTVSMALL, ROOTVSMALL);
|
|
||||||
}
|
|
||||||
|
|
||||||
cellTreePtr_.reset
|
cellTreePtr_.reset
|
||||||
(
|
(
|
||||||
new indexedOctree<treeDataCell>
|
new indexedOctree<treeDataCell>
|
||||||
@ -689,7 +719,7 @@ Foam::meshSearch::cellTree() const
|
|||||||
mesh_,
|
mesh_,
|
||||||
cellDecompMode_ // cell decomposition mode for inside tests
|
cellDecompMode_ // cell decomposition mode for inside tests
|
||||||
),
|
),
|
||||||
overallBbPtr_(),
|
dataBoundBox(), // overall search domain
|
||||||
8, // maxLevel
|
8, // maxLevel
|
||||||
10, // leafsize
|
10, // leafsize
|
||||||
6.0 // duplicity
|
6.0 // duplicity
|
||||||
|
|||||||
@ -6,7 +6,7 @@
|
|||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
Copyright (C) 2011-2018 OpenFOAM Foundation
|
Copyright (C) 2011-2018 OpenFOAM Foundation
|
||||||
Copyright (C) 2018 OpenCFD Ltd.
|
Copyright (C) 2018-2020 OpenCFD Ltd.
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
This file is part of OpenFOAM.
|
This file is part of OpenFOAM.
|
||||||
@ -48,7 +48,7 @@ SourceFiles
|
|||||||
namespace Foam
|
namespace Foam
|
||||||
{
|
{
|
||||||
|
|
||||||
// Forward declaration of classes
|
// Forward Declarations
|
||||||
class treeDataCell;
|
class treeDataCell;
|
||||||
class treeDataFace;
|
class treeDataFace;
|
||||||
template<class Type> class indexedOctree;
|
template<class Type> class indexedOctree;
|
||||||
@ -60,7 +60,7 @@ class treeBoundBox;
|
|||||||
|
|
||||||
class meshSearch
|
class meshSearch
|
||||||
{
|
{
|
||||||
// Private data
|
// Private Data
|
||||||
|
|
||||||
//- Reference to mesh
|
//- Reference to mesh
|
||||||
const polyMesh& mesh_;
|
const polyMesh& mesh_;
|
||||||
@ -73,6 +73,7 @@ class meshSearch
|
|||||||
|
|
||||||
//- Demand driven octrees
|
//- Demand driven octrees
|
||||||
mutable autoPtr<indexedOctree<treeDataFace>> boundaryTreePtr_;
|
mutable autoPtr<indexedOctree<treeDataFace>> boundaryTreePtr_;
|
||||||
|
mutable autoPtr<indexedOctree<treeDataFace>> nonCoupledBoundaryTreePtr_;
|
||||||
mutable autoPtr<indexedOctree<treeDataCell>> cellTreePtr_;
|
mutable autoPtr<indexedOctree<treeDataCell>> cellTreePtr_;
|
||||||
|
|
||||||
|
|
||||||
@ -98,6 +99,12 @@ class meshSearch
|
|||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
|
// Points
|
||||||
|
|
||||||
|
//- Demand-driven bounding box for mesh points
|
||||||
|
const treeBoundBox& dataBoundBox() const;
|
||||||
|
|
||||||
|
|
||||||
// Cells
|
// Cells
|
||||||
|
|
||||||
//- Nearest cell centre using octree
|
//- Nearest cell centre using octree
|
||||||
@ -127,7 +134,6 @@ class meshSearch
|
|||||||
label findNearestFaceWalk(const point&, const label) const;
|
label findNearestFaceWalk(const point&, const label) const;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Boundary faces
|
// Boundary faces
|
||||||
|
|
||||||
//- Walk from seed to find nearest boundary face. Gets stuck in
|
//- Walk from seed to find nearest boundary face. Gets stuck in
|
||||||
@ -148,11 +154,11 @@ class meshSearch
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
// Declare name of the class and its debug switch
|
//- Declare type-name (with debug switch)
|
||||||
ClassName("meshSearch");
|
ClassName("meshSearch");
|
||||||
|
|
||||||
|
|
||||||
// Static data members
|
// Static Data
|
||||||
|
|
||||||
//- Tolerance on linear dimensions
|
//- Tolerance on linear dimensions
|
||||||
static scalar tol_;
|
static scalar tol_;
|
||||||
@ -160,17 +166,17 @@ public:
|
|||||||
|
|
||||||
// Constructors
|
// Constructors
|
||||||
|
|
||||||
//- Construct from components. Constructs bb slightly bigger than
|
//- Construct from components.
|
||||||
// mesh points bb.
|
// Constructs bb slightly bigger than mesh points bb.
|
||||||
meshSearch
|
explicit meshSearch
|
||||||
(
|
(
|
||||||
const polyMesh& mesh,
|
const polyMesh& mesh,
|
||||||
const polyMesh::cellDecomposition = polyMesh::CELL_TETS
|
const polyMesh::cellDecomposition = polyMesh::CELL_TETS
|
||||||
);
|
);
|
||||||
|
|
||||||
//- Construct with a custom bounding box. Any mesh element outside
|
//- Construct with a custom bounding box.
|
||||||
// bb will not be found. Up to user to make sure bb
|
// Any mesh element outside bb will not be found.
|
||||||
// extends slightly beyond wanted elements.
|
// Up to user to ensure bb extends slightly beyond wanted elements.
|
||||||
meshSearch
|
meshSearch
|
||||||
(
|
(
|
||||||
const polyMesh& mesh,
|
const polyMesh& mesh,
|
||||||
@ -178,6 +184,7 @@ public:
|
|||||||
const polyMesh::cellDecomposition = polyMesh::CELL_TETS
|
const polyMesh::cellDecomposition = polyMesh::CELL_TETS
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
//- Destructor
|
//- Destructor
|
||||||
~meshSearch();
|
~meshSearch();
|
||||||
|
|
||||||
@ -196,11 +203,14 @@ public:
|
|||||||
return cellDecompMode_;
|
return cellDecompMode_;
|
||||||
}
|
}
|
||||||
|
|
||||||
//- Get (demand driven) reference to octree holding all
|
//- Demand-driven reference to octree holding all boundary faces
|
||||||
// boundary faces
|
|
||||||
const indexedOctree<treeDataFace>& boundaryTree() const;
|
const indexedOctree<treeDataFace>& boundaryTree() const;
|
||||||
|
|
||||||
//- Get (demand driven) reference to octree holding all cells
|
//- Demand-driven reference to octree holding all
|
||||||
|
//- non-coupled boundary faces
|
||||||
|
const indexedOctree<treeDataFace>& nonCoupledBoundaryTree() const;
|
||||||
|
|
||||||
|
//- Demand-driven reference to octree holding all cells
|
||||||
const indexedOctree<treeDataCell>& cellTree() const;
|
const indexedOctree<treeDataCell>& cellTree() const;
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -6,7 +6,7 @@
|
|||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
Copyright (C) 2016-2017 OpenFOAM Foundation
|
Copyright (C) 2016-2017 OpenFOAM Foundation
|
||||||
Copyright (C) 2019 OpenCFD Ltd.
|
Copyright (C) 2019-2020 OpenCFD Ltd.
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
This file is part of OpenFOAM.
|
This file is part of OpenFOAM.
|
||||||
@ -100,8 +100,8 @@ Foam::searchableExtrudedCircle::searchableExtrudedCircle
|
|||||||
|
|
||||||
// Slightly extended bb. Slightly off-centred just so on symmetric
|
// Slightly extended bb. Slightly off-centred just so on symmetric
|
||||||
// geometry there are less face/edge aligned items.
|
// geometry there are less face/edge aligned items.
|
||||||
bb.min() -= point(ROOTVSMALL, ROOTVSMALL, ROOTVSMALL);
|
bb.min() -= point::uniform(ROOTVSMALL);
|
||||||
bb.max() += point(ROOTVSMALL, ROOTVSMALL, ROOTVSMALL);
|
bb.max() += point::uniform(ROOTVSMALL);
|
||||||
|
|
||||||
edgeTree_.reset
|
edgeTree_.reset
|
||||||
(
|
(
|
||||||
|
|||||||
@ -759,8 +759,8 @@ Foam::triSurfaceMesh::edgeTree() const
|
|||||||
// geometry there are less face/edge aligned items.
|
// geometry there are less face/edge aligned items.
|
||||||
|
|
||||||
bb = bb.extend(rndGen, 1e-4);
|
bb = bb.extend(rndGen, 1e-4);
|
||||||
bb.min() -= point(ROOTVSMALL, ROOTVSMALL, ROOTVSMALL);
|
bb.min() -= point::uniform(ROOTVSMALL);
|
||||||
bb.max() += point(ROOTVSMALL, ROOTVSMALL, ROOTVSMALL);
|
bb.max() += point::uniform(ROOTVSMALL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -6,7 +6,7 @@
|
|||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
Copyright (C) 2011-2016 OpenFOAM Foundation
|
Copyright (C) 2011-2016 OpenFOAM Foundation
|
||||||
Copyright (C) 2015,2019 OpenCFD Ltd.
|
Copyright (C) 2015-2020 OpenCFD Ltd.
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
This file is part of OpenFOAM.
|
This file is part of OpenFOAM.
|
||||||
@ -157,8 +157,8 @@ Foam::triSurfaceRegionSearch::treeByRegion() const
|
|||||||
// on symmetric geometry there are fewer face/edge
|
// on symmetric geometry there are fewer face/edge
|
||||||
// aligned items.
|
// aligned items.
|
||||||
bb = bb.extend(rndGen, 1e-4);
|
bb = bb.extend(rndGen, 1e-4);
|
||||||
bb.min() -= point(ROOTVSMALL, ROOTVSMALL, ROOTVSMALL);
|
bb.min() -= point::uniform(ROOTVSMALL);
|
||||||
bb.max() += point(ROOTVSMALL, ROOTVSMALL, ROOTVSMALL);
|
bb.max() += point::uniform(ROOTVSMALL);
|
||||||
}
|
}
|
||||||
|
|
||||||
treeByRegion_.set
|
treeByRegion_.set
|
||||||
|
|||||||
@ -6,7 +6,7 @@
|
|||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
Copyright (C) 2011-2017 OpenFOAM Foundation
|
Copyright (C) 2011-2017 OpenFOAM Foundation
|
||||||
Copyright (C) 2015-2017 OpenCFD Ltd.
|
Copyright (C) 2015-2020 OpenCFD Ltd.
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
This file is part of OpenFOAM.
|
This file is part of OpenFOAM.
|
||||||
@ -231,8 +231,8 @@ Foam::triSurfaceSearch::tree() const
|
|||||||
// Slightly extended bb. Slightly off-centred just so on symmetric
|
// Slightly extended bb. Slightly off-centred just so on symmetric
|
||||||
// geometry there are less face/edge aligned items.
|
// geometry there are less face/edge aligned items.
|
||||||
bb = bb.extend(rndGen, 1e-4);
|
bb = bb.extend(rndGen, 1e-4);
|
||||||
bb.min() -= point(ROOTVSMALL, ROOTVSMALL, ROOTVSMALL);
|
bb.min() -= point::uniform(ROOTVSMALL);
|
||||||
bb.max() += point(ROOTVSMALL, ROOTVSMALL, ROOTVSMALL);
|
bb.max() += point::uniform(ROOTVSMALL);
|
||||||
}
|
}
|
||||||
|
|
||||||
const scalar oldTol = indexedOctree<treeDataTriSurface>::perturbTol();
|
const scalar oldTol = indexedOctree<treeDataTriSurface>::perturbTol();
|
||||||
|
|||||||
@ -6,7 +6,7 @@
|
|||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
Copyright (C) 2011-2016 OpenFOAM Foundation
|
Copyright (C) 2011-2016 OpenFOAM Foundation
|
||||||
Copyright (C) 2016-2018 OpenCFD Ltd.
|
Copyright (C) 2016-2020 OpenCFD Ltd.
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
This file is part of OpenFOAM.
|
This file is part of OpenFOAM.
|
||||||
@ -34,7 +34,6 @@ License
|
|||||||
#include "treeDataFace.H"
|
#include "treeDataFace.H"
|
||||||
#include "addToRunTimeSelectionTable.H"
|
#include "addToRunTimeSelectionTable.H"
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
||||||
|
|
||||||
namespace Foam
|
namespace Foam
|
||||||
@ -90,8 +89,8 @@ void Foam::patchProbes::findElements(const fvMesh& mesh)
|
|||||||
|
|
||||||
Random rndGen(123456);
|
Random rndGen(123456);
|
||||||
overallBb = overallBb.extend(rndGen, 1e-4);
|
overallBb = overallBb.extend(rndGen, 1e-4);
|
||||||
overallBb.min() -= point(ROOTVSMALL, ROOTVSMALL, ROOTVSMALL);
|
overallBb.min() -= point::uniform(ROOTVSMALL);
|
||||||
overallBb.max() += point(ROOTVSMALL, ROOTVSMALL, ROOTVSMALL);
|
overallBb.max() += point::uniform(ROOTVSMALL);
|
||||||
|
|
||||||
const indexedOctree<treeDataFace> boundaryTree
|
const indexedOctree<treeDataFace> boundaryTree
|
||||||
(
|
(
|
||||||
|
|||||||
@ -6,7 +6,7 @@
|
|||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
Copyright (C) 2012-2016 OpenFOAM Foundation
|
Copyright (C) 2012-2016 OpenFOAM Foundation
|
||||||
Copyright (C) 2018 OpenCFD Ltd.
|
Copyright (C) 2018-2020 OpenCFD Ltd.
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
This file is part of OpenFOAM.
|
This file is part of OpenFOAM.
|
||||||
@ -120,8 +120,8 @@ void Foam::patchSeedSet::calcSamples
|
|||||||
1e-4
|
1e-4
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
patchBb.min() -= point(ROOTVSMALL, ROOTVSMALL, ROOTVSMALL);
|
patchBb.min() -= point::uniform(ROOTVSMALL);
|
||||||
patchBb.max() += point(ROOTVSMALL, ROOTVSMALL, ROOTVSMALL);
|
patchBb.max() += point::uniform(ROOTVSMALL);
|
||||||
|
|
||||||
indexedOctree<treeDataFace> boundaryTree
|
indexedOctree<treeDataFace> boundaryTree
|
||||||
(
|
(
|
||||||
|
|||||||
@ -108,61 +108,6 @@ void Foam::sampledTriSurfaceMesh::setZoneMap
|
|||||||
|
|
||||||
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
|
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
|
||||||
|
|
||||||
const Foam::indexedOctree<Foam::treeDataFace>&
|
|
||||||
Foam::sampledTriSurfaceMesh::nonCoupledboundaryTree() const
|
|
||||||
{
|
|
||||||
// Variant of meshSearch::boundaryTree() that only does non-coupled
|
|
||||||
// boundary faces.
|
|
||||||
|
|
||||||
if (!boundaryTreePtr_.valid())
|
|
||||||
{
|
|
||||||
// all non-coupled boundary faces (not just walls)
|
|
||||||
const polyBoundaryMesh& patches = mesh().boundaryMesh();
|
|
||||||
|
|
||||||
labelList bndFaces(patches.nFaces());
|
|
||||||
label bndI = 0;
|
|
||||||
for (const polyPatch& pp : patches)
|
|
||||||
{
|
|
||||||
if (!pp.coupled())
|
|
||||||
{
|
|
||||||
forAll(pp, i)
|
|
||||||
{
|
|
||||||
bndFaces[bndI++] = pp.start()+i;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
bndFaces.setSize(bndI);
|
|
||||||
|
|
||||||
|
|
||||||
treeBoundBox overallBb(mesh().points());
|
|
||||||
Random rndGen(123456);
|
|
||||||
// Extend slightly and make 3D
|
|
||||||
overallBb = overallBb.extend(rndGen, 1e-4);
|
|
||||||
overallBb.min() -= point(ROOTVSMALL, ROOTVSMALL, ROOTVSMALL);
|
|
||||||
overallBb.max() += point(ROOTVSMALL, ROOTVSMALL, ROOTVSMALL);
|
|
||||||
|
|
||||||
boundaryTreePtr_.reset
|
|
||||||
(
|
|
||||||
new indexedOctree<treeDataFace>
|
|
||||||
(
|
|
||||||
treeDataFace // all information needed to search faces
|
|
||||||
(
|
|
||||||
false, // do not cache bb
|
|
||||||
mesh(),
|
|
||||||
bndFaces // boundary faces only
|
|
||||||
),
|
|
||||||
overallBb, // overall search domain
|
|
||||||
8, // maxLevel
|
|
||||||
10, // leafsize
|
|
||||||
3.0 // duplicity
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
return *boundaryTreePtr_;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool Foam::sampledTriSurfaceMesh::update(const meshSearch& meshSearcher)
|
bool Foam::sampledTriSurfaceMesh::update(const meshSearch& meshSearcher)
|
||||||
{
|
{
|
||||||
// Find the cells the triangles of the surface are in.
|
// Find the cells the triangles of the surface are in.
|
||||||
@ -224,10 +169,9 @@ bool Foam::sampledTriSurfaceMesh::update(const meshSearch& meshSearcher)
|
|||||||
{
|
{
|
||||||
// Search for nearest boundaryFace
|
// Search for nearest boundaryFace
|
||||||
|
|
||||||
////- Search on all (including coupled) boundary faces
|
|
||||||
//const indexedOctree<treeDataFace>& bTree = meshSearcher.boundaryTree()
|
|
||||||
//- Search on all non-coupled boundary faces
|
//- Search on all non-coupled boundary faces
|
||||||
const indexedOctree<treeDataFace>& bTree = nonCoupledboundaryTree();
|
const indexedOctree<treeDataFace>& bTree =
|
||||||
|
meshSearcher.nonCoupledBoundaryTree();
|
||||||
|
|
||||||
forAll(fc, triI)
|
forAll(fc, triI)
|
||||||
{
|
{
|
||||||
|
|||||||
@ -6,7 +6,7 @@
|
|||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
Copyright (C) 2011-2016 OpenFOAM Foundation
|
Copyright (C) 2011-2016 OpenFOAM Foundation
|
||||||
Copyright (C) 2016-2018 OpenCFD Ltd.
|
Copyright (C) 2016-2020 OpenCFD Ltd.
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
This file is part of OpenFOAM.
|
This file is part of OpenFOAM.
|
||||||
@ -169,9 +169,6 @@ private:
|
|||||||
|
|
||||||
// Private Member Functions
|
// Private Member Functions
|
||||||
|
|
||||||
//- Get tree of all non-coupled boundary faces
|
|
||||||
const indexedOctree<treeDataFace>& nonCoupledboundaryTree() const;
|
|
||||||
|
|
||||||
//- Sample volume field onto surface faces
|
//- Sample volume field onto surface faces
|
||||||
template<class Type>
|
template<class Type>
|
||||||
tmp<Field<Type>> sampleOnFaces
|
tmp<Field<Type>> sampleOnFaces
|
||||||
|
|||||||
Reference in New Issue
Block a user