diff --git a/src/meshTools/Make/files b/src/meshTools/Make/files index 6b52b270..a95c639b 100644 --- a/src/meshTools/Make/files +++ b/src/meshTools/Make/files @@ -64,6 +64,7 @@ indexedOctree/treeDataTriSurface.C searchableSurface = searchableSurface $(searchableSurface)/searchableBox.C $(searchableSurface)/searchableCylinder.C +$(searchableSurface)/searchableDisk.C $(searchableSurface)/searchablePlane.C $(searchableSurface)/searchablePlate.C $(searchableSurface)/searchableSphere.C diff --git a/src/meshTools/searchableSurface/searchableDisk.C b/src/meshTools/searchableSurface/searchableDisk.C new file mode 100644 index 00000000..a9c968aa --- /dev/null +++ b/src/meshTools/searchableSurface/searchableDisk.C @@ -0,0 +1,329 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2014 OpenFOAM Foundation + \\/ 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 . + +\*---------------------------------------------------------------------------*/ + +#include "searchableDisk.H" +#include "addToRunTimeSelectionTable.H" + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +namespace Foam +{ + +defineTypeNameAndDebug(searchableDisk, 0); +addToRunTimeSelectionTable(searchableSurface, searchableDisk, dict); + +} + + +// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // + +Foam::pointIndexHit Foam::searchableDisk::findNearest +( + const point& sample, + const scalar nearestDistSqr +) const +{ + pointIndexHit info(false, sample, -1); + + vector v(sample - origin_); + + // Decompose sample-origin into normal and parallel component + scalar parallel = (v & normal_); + + // Remove the parallel component and normalise + v -= parallel*normal_; + scalar magV = mag(v); + + if (magV < ROOTVSMALL) + { + v = vector::zero; + } + else + { + v /= magV; + } + + // Clip to radius. + info.setPoint(origin_ + min(magV, radius_)*v); + + if (magSqr(sample - info.rawPoint()) < nearestDistSqr) + { + info.setHit(); + info.setIndex(0); + } + + return info; +} + + +void Foam::searchableDisk::findLine +( + const point& start, + const point& end, + pointIndexHit& info +) const +{ + info = pointIndexHit(false, vector::zero, -1); + + vector v(start - origin_); + + // Decompose sample-origin into normal and parallel component + scalar parallel = (v & normal_); + + if (sign(parallel) == sign((end - origin_) & normal_)) + { + return; + } + + // Remove the parallel component and normalise + v -= parallel*normal_; + scalar magV = mag(v); + + if (magV < ROOTVSMALL) + { + v = vector::zero; + } + else + { + v /= magV; + } + + // Set (hit or miss) to intersection of ray and plane of disk + info.setPoint(origin_ + magV*v); + + if (magV <= radius_) + { + info.setHit(); + info.setIndex(0); + } +} + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::searchableDisk::searchableDisk +( + const IOobject& io, + const point& origin, + const point& normal, + const scalar radius +) +: + searchableSurface(io), + origin_(origin), + normal_(normal/mag(normal)), + radius_(radius) +{ + // Rough approximation of bounding box + //vector span(radius_, radius_, radius_); + + // See searchableCylinder + vector span + ( + sqrt(sqr(normal_.y()) + sqr(normal_.z())), + sqrt(sqr(normal_.x()) + sqr(normal_.z())), + sqrt(sqr(normal_.x()) + sqr(normal_.y())) + ); + span *= radius_; + + bounds().min() = origin_ - span; + bounds().max() = origin_ + span; +} + + +Foam::searchableDisk::searchableDisk +( + const IOobject& io, + const dictionary& dict +) +: + searchableSurface(io), + origin_(dict.lookup("origin")), + normal_(dict.lookup("normal")), + radius_(readScalar(dict.lookup("radius"))) +{ + normal_ /= mag(normal_); + + // Rough approximation of bounding box + //vector span(radius_, radius_, radius_); + + // See searchableCylinder + vector span + ( + sqrt(sqr(normal_.y()) + sqr(normal_.z())), + sqrt(sqr(normal_.x()) + sqr(normal_.z())), + sqrt(sqr(normal_.x()) + sqr(normal_.y())) + ); + span *= radius_; + + bounds().min() = origin_ - span; + bounds().max() = origin_ + span; +} + + +// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // + +Foam::searchableDisk::~searchableDisk() +{} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +const Foam::wordList& Foam::searchableDisk::regions() const +{ + if (regions_.empty()) + { + regions_.setSize(1); + regions_[0] = "region0"; + } + return regions_; +} + + +void Foam::searchableDisk::boundingSpheres +( + pointField& centres, + scalarField& radiusSqr +) const +{ + centres.setSize(1); + centres[0] = origin_; + + radiusSqr.setSize(1); + radiusSqr[0] = sqr(radius_); + + // Add a bit to make sure all points are tested inside + radiusSqr += Foam::sqr(SMALL); +} + + +void Foam::searchableDisk::findNearest +( + const pointField& samples, + const scalarField& nearestDistSqr, + List& info +) const +{ + info.setSize(samples.size()); + + forAll(samples, i) + { + info[i] = findNearest(samples[i], nearestDistSqr[i]); + } +} + + +void Foam::searchableDisk::findLine +( + const pointField& start, + const pointField& end, + List& info +) const +{ + info.setSize(start.size()); + + forAll(start, i) + { + findLine(start[i], end[i], info[i]); + } +} + + +void Foam::searchableDisk::findLineAny +( + const pointField& start, + const pointField& end, + List& info +) const +{ + findLine(start, end, info); +} + + +void Foam::searchableDisk::findLineAll +( + const pointField& start, + const pointField& end, + List >& info +) const +{ + info.setSize(start.size()); + + forAll(start, i) + { + pointIndexHit inter; + findLine(start[i], end[i], inter); + + if (inter.hit()) + { + info[i].setSize(1); + info[i][0] = inter; + } + else + { + info[i].clear(); + } + } +} + + +void Foam::searchableDisk::getRegion +( + const List& info, + labelList& region +) const +{ + region.setSize(info.size()); + region = 0; +} + + +void Foam::searchableDisk::getNormal +( + const List& info, + vectorField& normal +) const +{ + normal.setSize(info.size()); + normal = normal_; +} + + +void Foam::searchableDisk::getVolumeType +( + const pointField& points, + List& volType +) const +{ + FatalErrorIn + ( + "searchableDisk::getVolumeType(const pointField&" + ", List&) const" + ) << "Volume type not supported for disk." + << exit(FatalError); +} + + +// ************************************************************************* // diff --git a/src/meshTools/searchableSurface/searchableDisk.H b/src/meshTools/searchableSurface/searchableDisk.H new file mode 100644 index 00000000..7bebdbf7 --- /dev/null +++ b/src/meshTools/searchableSurface/searchableDisk.H @@ -0,0 +1,246 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2014 OpenFOAM Foundation + \\/ 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 . + +Class + Foam::searchableDisk + +Description + Searching on circular disk given as origin, normal (gets normalised) + and radius + +SourceFiles + searchableDisk.C + +\*---------------------------------------------------------------------------*/ + +#ifndef searchableDisk_H +#define searchableDisk_H + +#include "treeBoundBox.H" +#include "searchableSurface.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +/*---------------------------------------------------------------------------*\ + Class searchableDisk Declaration +\*---------------------------------------------------------------------------*/ + +class searchableDisk +: + public searchableSurface +{ +private: + + // Private Member Data + + //- origin + const point origin_; + + //- normal + vector normal_; + + //- radius + const scalar radius_; + + //- Names of regions + mutable wordList regions_; + + + // Private Member Functions + + //- Find nearest point on disk + pointIndexHit findNearest + ( + const point& sample, + const scalar nearestDistSqr + ) const; + + //- Find intersection with disk + void findLine + ( + const point& start, + const point& end, + pointIndexHit& + ) const; + + //- Disallow default bitwise copy construct + searchableDisk(const searchableDisk&); + + //- Disallow default bitwise assignment + void operator=(const searchableDisk&); + +public: + + //- Runtime type information + TypeName("searchableDisk"); + + + // Constructors + + //- Construct from components + searchableDisk + ( + const IOobject& io, + const point& origin, + const point& normal, + const scalar radius + ); + + //- Construct from dictionary (used by searchableSurface) + searchableDisk + ( + const IOobject& io, + const dictionary& dict + ); + + //- Destructor + virtual ~searchableDisk(); + + + // Member Functions + + virtual const wordList& regions() const; + + //- Whether supports volume type below + virtual bool hasVolumeType() const + { + return false; + } + + //- Range of local indices that can be returned. + virtual label size() const + { + return 1; + } + + //- Get representative set of element coordinates + // Usually the element centres (should be of length size()). + virtual tmp coordinates() const + { + tmp tCtrs(new pointField(1, origin_)); + return tCtrs; + } + + //- Get bounding spheres (centre and radius squared), one per element. + // Any point on element is guaranteed to be inside. + virtual void boundingSpheres + ( + pointField& centres, + scalarField& radiusSqr + ) const; + + //- Get the points that define the surface. + virtual tmp points() const + { + return coordinates(); + } + + //- Does any part of the surface overlap the supplied bound box? + virtual bool overlaps(const boundBox& bb) const + { + notImplemented + ( + "searchableDisk::overlaps(const boundBox&) const" + ); + + return false; + } + + + // Multiple point queries. + + virtual void findNearest + ( + const pointField& sample, + const scalarField& nearestDistSqr, + List& + ) const; + + virtual void findLine + ( + const pointField& start, + const pointField& end, + List& + ) const; + + virtual void findLineAny + ( + const pointField& start, + const pointField& end, + List& + ) const; + + //- Get all intersections in order from start to end. + virtual void findLineAll + ( + const pointField& start, + const pointField& end, + List >& + ) const; + + //- From a set of points and indices get the region + virtual void getRegion + ( + const List&, + labelList& region + ) const; + + //- From a set of points and indices get the normal + virtual void getNormal + ( + const List&, + vectorField& normal + ) const; + + //- Determine type (inside/outside/mixed) for point. unknown if + // cannot be determined (e.g. non-manifold surface) + virtual void getVolumeType + ( + const pointField&, + List& + ) const; + + + // regIOobject implementation + + bool writeData(Ostream&) const + { + notImplemented("searchableDisk::writeData(Ostream&) const"); + return false; + } + +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* //