diff --git a/src/sampling/Make/files b/src/sampling/Make/files index ecb8c167419eec3e0d99b9d9bc26121f72217fc3..b36eca5a4fdca566a9f6eaf784c924da0ccd93f5 100644 --- a/src/sampling/Make/files +++ b/src/sampling/Make/files @@ -11,6 +11,7 @@ sampledSet/face/faceOnlySet.C sampledSet/midPoint/midPointSet.C sampledSet/midPointAndFace/midPointAndFaceSet.C sampledSet/patchSeed/patchSeedSet.C +sampledSet/patchEdge/patchEdgeSet.C sampledSet/sampledSet/sampledSet.C sampledSet/sampledSets/sampledSets.C sampledSet/sampledSets/sampledSetsGrouping.C diff --git a/src/sampling/sampledSet/patchEdge/patchEdgeSet.C b/src/sampling/sampledSet/patchEdge/patchEdgeSet.C new file mode 100644 index 0000000000000000000000000000000000000000..df3e3fc8b32a1d01e414d2b6542f41557d4224db --- /dev/null +++ b/src/sampling/sampledSet/patchEdge/patchEdgeSet.C @@ -0,0 +1,185 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2019 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +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 <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "patchEdgeSet.H" +#include "polyMesh.H" +#include "addToRunTimeSelectionTable.H" +#include "searchableSurface.H" +#include "Time.H" + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +namespace Foam +{ + defineTypeNameAndDebug(patchEdgeSet, 0); + addToRunTimeSelectionTable(sampledSet, patchEdgeSet, word); +} + +// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // + +void Foam::patchEdgeSet::genSamples() +{ + // Storage for sample points + DynamicList<point> samplingPts; + DynamicList<label> samplingCells; + DynamicList<label> samplingFaces; + DynamicList<label> samplingSegments; + DynamicList<scalar> samplingCurveDist; + + const labelList patchIDs(patchSet_.sortedToc()); + + for (const label patchi : patchIDs) + { + const polyPatch& pp = mesh().boundaryMesh()[patchi]; + const edgeList& edges = pp.edges(); + const labelList& mp = pp.meshPoints(); + const pointField& pts = pp.points(); + + pointField start(edges.size()); + pointField end(edges.size()); + forAll(edges, edgei) + { + const edge& e = edges[edgei]; + start[edgei] = pts[mp[e[0]]]; + end[edgei] = pts[mp[e[1]]]; + } + + + List<List<pointIndexHit>> hits; + surfPtr_->findLineAll(start, end, hits); + + forAll(hits, edgei) + { + const List<pointIndexHit>& eHits = hits[edgei]; + + if (eHits.size()) + { + const label meshFacei = pp.start()+pp.edgeFaces()[edgei][0]; + const label celli = mesh().faceOwner()[meshFacei]; + for (const auto& hit : eHits) + { + const point& pt = hit.hitPoint(); + samplingPts.append(pt); + samplingCells.append(celli); + samplingFaces.append(meshFacei); + samplingSegments.append(0); + samplingCurveDist.append(mag(pt-origin_)); + } + } + } + + ////- Alternative hardcoded to use plane + //forAll(edges, edgei) + //{ + // const edge& e = edges[edgei]; + // const point& p0 = pts[mp[e[0]]]; + // const point& p1 = pts[mp[e[1]]]; + // const vector dir(p1-p0); + // const scalar s = pl_.normalIntersect(p0, dir); + // + // if (s >= 0.0 && s < 1.0) + // { + // const point pt(p0+s*dir); + // + // // Calculate distance on curve + // //const scalar dist = (pt-start_)&curve; + // //if (dist >= 0 && dist < magCurve) + // const scalar dist = mag(pt-pl_.origin()); + // + // // Take any face using this edge + // const label meshFacei = pp.start()+pp.edgeFaces()[edgei][0]; + // + // samplingPts.append(pt); + // samplingCells.append(mesh().faceOwner()[meshFacei]); + // samplingFaces.append(meshFacei); + // samplingSegments.append(0); + // samplingCurveDist.append(dist); + // } + //} + } + + samplingPts.shrink(); + samplingCells.shrink(); + samplingFaces.shrink(); + samplingSegments.shrink(); + samplingCurveDist.shrink(); + + setSamples + ( + samplingPts, + samplingCells, + samplingFaces, + samplingSegments, + samplingCurveDist + ); + + if (debug) + { + write(Info); + } +} + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::patchEdgeSet::patchEdgeSet +( + const word& name, + const polyMesh& mesh, + const meshSearch& searchEngine, + const dictionary& dict +) +: + sampledSet(name, mesh, searchEngine, dict), + surfPtr_ + ( + searchableSurface::New + ( + dict.get<word>("surfaceType"), + IOobject + ( + dict.lookupOrDefault("surfaceName", name), + mesh.time().constant(), // directory + "triSurface", // instance + mesh.time(), // registry + IOobject::MUST_READ, + IOobject::NO_WRITE + ), + dict + ) + ), + origin_(dict.get<point>("origin")), + //end_(dict.get<point>("end")), + //pl_(dict), + patchSet_ + ( + mesh.boundaryMesh().patchSet(dict.get<wordRes>("patches")) + ) +{ + genSamples(); +} + + +// ************************************************************************* // diff --git a/src/sampling/sampledSet/patchEdge/patchEdgeSet.H b/src/sampling/sampledSet/patchEdge/patchEdgeSet.H new file mode 100644 index 0000000000000000000000000000000000000000..91947cd70aac4ffad94a7925b4de590549fcb617 --- /dev/null +++ b/src/sampling/sampledSet/patchEdge/patchEdgeSet.H @@ -0,0 +1,185 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2019 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +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 <http://www.gnu.org/licenses/>. + +Class + Foam::patchEdgeSet + +Description + Like Foam::uniformSet but samples patch edges + +Usage + Example of function object specification: + \verbatim + sets + { + type sets; + libs ("libsampling.so"); + writeControl timeStep; + writeInterval 1; + + fields (p U); + interpolationScheme cellPoint; + setFormat vtk; + + sets + ( + // Intersections of patches with plane + patchEdge + { + type patchEdge; + axis x; + + patches (movingWall); + + // Surface type + surfaceType searchablePlane; + // Additional info for surface + planeType pointAndNormal; + pointAndNormalDict + { + point (1.5 1.5 1.5); + normal (0.1 0 1); + } + + // Sort point according to distance to origin + origin (0 1 0); + } + + // Intersections of patches with stl + sphere.stl + { + type patchEdge; + axis x; + + patches (movingWall); + + surfaceType triSurfaceMesh; + // Sort point according to distance to origin + origin (0 1 0); + } + ); + } + \endverbatim + + Where the entries comprise: + \table + Property | Description | Required | Default + type | patchEdge | yes | + axis | x, y, z, xyz, distance | yes | + patches | List of patch names or regexs | yes | + surfaceType | Definition of the surface | yes | + origin | reference location | yes | + \endtable + +Note + The ordering of the points is according to the distance to the specified + origin. + +SourceFiles + patchEdgeSet.C + +\*---------------------------------------------------------------------------*/ + +#ifndef patchEdgeSet_H +#define patchEdgeSet_H + +#include "sampledSet.H" +#include "DynamicList.H" +#include "HashSet.H" +#include "plane.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +class searchableSurface; + +/*---------------------------------------------------------------------------*\ + Class patchEdgeSet Declaration +\*---------------------------------------------------------------------------*/ + +class patchEdgeSet +: + public sampledSet +{ + // Private data + + //- The surface + const autoPtr<searchableSurface> surfPtr_; + + //- Reference point + const point origin_; + + //- Patches to sample + const labelHashSet patchSet_; + + + // Private Member Functions + + //- Samples all points in sampleCoords. + void calcSamples + ( + DynamicList<point>& samplingPts, + DynamicList<label>& samplingCells, + DynamicList<label>& samplingFaces, + DynamicList<label>& samplingSegments, + DynamicList<scalar>& samplingCurveDist + ) const; + + //- Uses calcSamples to obtain samples. Copies them into *this. + void genSamples(); + + +public: + + //- Runtime type information + TypeName("patchEdge"); + + + // Constructors + + //- Construct from dictionary + patchEdgeSet + ( + const word& name, + const polyMesh& mesh, + const meshSearch& searchEngine, + const dictionary& dict + ); + + + //- Destructor + virtual ~patchEdgeSet() = default; +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* //